Google Sheets数组公式改写:查找托运人名称最后出现行号
解决Google Sheets自动计算托运人最后出现行号的数组公式问题
嘿,我完全懂你遇到的麻烦——原来的单行公式能用,但改成数组公式后就没法给新行动态计算结果,只会重复第一个值对吧?这是因为原来的SUMPRODUCT+MAX组合没有逐行动态调整计算范围,咱们换个思路写数组公式就能解决。
新版Google Sheets推荐方案(支持BYROW/LET)
假设你的托运人名称在F列,要把结果放在G列(从G2开始),直接用下面这个公式:
=ArrayFormula(IF(ISBLANK(A2:A), "", BYROW(ROW(A2:A), LAMBDA(r, LET( prev_rows, ROW(F1:INDEX(F:F, r-1)), prev_names, F1:INDEX(F:F, r-1), current_name, F2:INDEX(F:F, r), last_row, MAXIFS(prev_rows, prev_names, current_name), IF(last_row=0, "", last_row) ) ))))
公式拆解:
ArrayFormula确保整个列自动计算,新增行时不用手动拖拽公式IF(ISBLANK(A2:A), "", ...)跳过A列为空的行,避免生成无效结果BYROW(ROW(A2:A), LAMBDA(r, ...))逐行遍历每一行的行号r,对每行单独处理LET用来定义变量,让公式可读性拉满:prev_rows和prev_names:动态取当前行上方所有行的行号和托运人名称(用INDEX(F:F, r-1)限制范围,不会包含当前行)current_name:当前行的托运人名称MAXIFS直接找出上方行中与当前名称匹配的最大行号(也就是最后一次出现的位置)- 最后用
IF(last_row=0, "", last_row)处理首次出现的情况,返回空而非0
旧版Google Sheets兼容方案(无BYROW)
如果你的Sheets版本不支持BYROW和LET,可以用这个基于矩阵乘法的公式:
=ArrayFormula(IF(ISBLANK(A2:A), "", MMULT( --(F2:F=TRANSPOSE(F1:F)), ROW(F1:F)*--(ROW(F1:F)<ROW(F2:F)) ) ))
这个公式通过矩阵运算来计算每行对应的最大匹配行号,不过数据量大时性能会略逊于新版方案,优先推荐上面的BYROW版本。
为什么原来的公式失效?
你之前尝试的=ArrayFormula(IF(ISBLANK($A2:$A),"",sumproduct(max(row(A$1:A3)*($F4:$F=F$1:F3)))))问题出在:
- 范围
A$1:A3和F$1:F3是固定死的,没有随每行动态调整计算范围 SUMPRODUCT和MAX在这里是针对整个数组一次性计算,而非逐行处理,导致所有行复用同一个结果
内容的提问来源于stack exchange,提问作者Paul Weinstein
相关产品推荐
相关产品推荐

