You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:57:47