如何将Google Sheets中的FILTER+COUNTA()转换为ARRAYFORMULA?
问题
现有公式=if(A3="","", COUNTA(filter(D:D,regexmatch(LOWER(D:D), LOWER(A3)))))可正常逐行计算D列中匹配A3单元格内容的条目数,但将其改为数组公式=ARRAYFORMULA(if(A3:A="","", COUNTA(filter(D:D,regexmatch(LOWER(D:D), LOWER(A3:A))))))后,仅在公式所在单元格返回总计值,无法实现A列每行对应的匹配计数。
解决方案
可以使用MMULT函数替代FILTER+COUNTA的组合,实现数组批量计算:
=ARRAYFORMULA(IF(A3:A="", "", MMULT(--REGEXMATCH(LOWER(D:D), LOWER(A3:A)), SEQUENCE(ROWS(D:D), 1, 1, 0))))
原理说明
REGEXMATCH(LOWER(D:D), LOWER(A3:A))生成二维数组,记录D列每个单元格与A列每个单元格的匹配结果(TRUE/FALSE)--将布尔值转换为1/0,便于数值求和计算MMULT通过矩阵乘法对每行的1/0求和,得到A列每个值在D列中的匹配次数SEQUENCE(ROWS(D:D), 1, 1, 0)生成列向量,作为矩阵乘法的右乘数,实现逐行求和
另一种简洁写法(利用BYROW实现数组批量计算):
=ARRAYFORMULA(IF(A3:A="", "", BYROW(A3:A, LAMBDA(x, COUNTA(FILTER(D:D, REGEXMATCH(LOWER(D:D), LOWER(x))))))))
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

