为多个不同的行(数组)创建单个公式(Google 张)
Create single formula for several different lines (array) (Google Sheets)
在 AD
列中,我有以下值序列:
2
3
4
这些值引用另一页上某列中的行。
在 AE
列的每一行中,我使用了这个公式:
=IF(AD1="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD1)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD1),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))
=IF(AD2="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD2)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD2),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))
=IF(AD3="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD3)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD3),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))
简而言之,此公式根据同一 sheet 的另一列中的相应单元格是否出现在另一个 sheet 中得到 运行 值的总和一组值。
当我尝试添加 ARRAYFORMULA
时,我不必在每一行上都有一个公式,只在 AE1
中留下所有行上 return 的值是完全相同的值。
测试公式失败:
=ARRAYFORMULA(IF(AD1:AD="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD1:AD)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD1:AD),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE)))))
Link 到 Spreadhseet 示例:
https://docs.google.com/spreadsheets/d/1qIv6KnLv-EwJQXRrk7ucuqY-XuJhkIHOCtih9FpAg6U/edit?usp=sharing
您正在尝试根据 H
列中的相应值是否出现在筛选值中来对 O
进行 运行 求和。
我们可以使用 lower-triangular 矩阵和列出的值进行矩阵乘法,使用 IF
.
根据特定条件选择要清零的值
=ArrayFormula(MMULT(
N(SEQUENCE(D2)>=SEQUENCE(1,D2)),
ARRAY_CONSTRAIN(
IF(
('Registro Geral'!O2:O<>"")*
IFNA(MATCH('Registro Geral'!H2:H,V:V,0)),
'Registro Geral'!O2:O
)/100,
D2,
1
)
))
为什么这有效
lower-triangular矩阵看起来像
1 0 0 0 0 ... up to N columns
1 1 0 0 0
1 1 1 0 0
1 1 1 1 0
1 1 1 1 1
... up to N rows
您要求和的列如下所示
Value 1
Value 2
...
Value N
所以当你将两者相乘时,你会得到一个新的 N x 1 矩阵:
Value 1
Value 1 + Value 2
...
Value 1 + ... + Value N
如果我们不想对一个值求和,那么我们可以使用条件将其清零,这样它就不会被添加。
在 AD
列中,我有以下值序列:
2
3
4
这些值引用另一页上某列中的行。
在 AE
列的每一行中,我使用了这个公式:
=IF(AD1="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD1)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD1),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))
=IF(AD2="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD2)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD2),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))
=IF(AD3="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD3)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD3),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))
简而言之,此公式根据同一 sheet 的另一列中的相应单元格是否出现在另一个 sheet 中得到 运行 值的总和一组值。
当我尝试添加 ARRAYFORMULA
时,我不必在每一行上都有一个公式,只在 AE1
中留下所有行上 return 的值是完全相同的值。
测试公式失败:
=ARRAYFORMULA(IF(AD1:AD="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD1:AD)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD1:AD),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE)))))
Link 到 Spreadhseet 示例:
https://docs.google.com/spreadsheets/d/1qIv6KnLv-EwJQXRrk7ucuqY-XuJhkIHOCtih9FpAg6U/edit?usp=sharing
您正在尝试根据 H
列中的相应值是否出现在筛选值中来对 O
进行 运行 求和。
我们可以使用 lower-triangular 矩阵和列出的值进行矩阵乘法,使用 IF
.
=ArrayFormula(MMULT(
N(SEQUENCE(D2)>=SEQUENCE(1,D2)),
ARRAY_CONSTRAIN(
IF(
('Registro Geral'!O2:O<>"")*
IFNA(MATCH('Registro Geral'!H2:H,V:V,0)),
'Registro Geral'!O2:O
)/100,
D2,
1
)
))
为什么这有效
lower-triangular矩阵看起来像
1 0 0 0 0 ... up to N columns
1 1 0 0 0
1 1 1 0 0
1 1 1 1 0
1 1 1 1 1
... up to N rows
您要求和的列如下所示
Value 1
Value 2
...
Value N
所以当你将两者相乘时,你会得到一个新的 N x 1 矩阵:
Value 1
Value 1 + Value 2
...
Value 1 + ... + Value N
如果我们不想对一个值求和,那么我们可以使用条件将其清零,这样它就不会被添加。