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

如何使用Array Formula实现发票数据的规则化累计付款金额计算(替代Query公式)

解决ArrayFormula嵌套Query计算累计付款金额的问题

你的问题我太熟了——Query函数天生就不适合和ArrayFormula做逐行动态筛选,因为它的字符串参数没法自动遍历数组里的每个单元格值,所以你嵌套后只有第一行能拿到正确结果,完全是意料之中的事。

不用折腾VLookup,给你两个更简便的方案,和你原来的计算逻辑完全对齐:

方案一:用BYROW(新版Google Sheets推荐)

这个写法最直观,和你手动写单条公式的逻辑几乎一模一样,而且自动遍历每一行:

=BYROW(A2:E10, LAMBDA(row, 
  LET(
    currentPayDate, INDEX(row, 4),  // 取当前行的付款日期(D列)
    currentStartDate, INDEX(row, 2), // 取当前行的开始日期(B列)
    IF(ISBLANK(currentPayDate),,  // 如果没付款日期,返回空
      SUM(
        FILTER(
          E2:E10,  // 所有发票金额
          NOT(ISBLANK(D2:D10)),  // 只统计有付款日期的发票
          (D2:D10 < currentPayDate) + (D2:D10 = currentPayDate) * (B2:B10 <= currentStartDate)
          // 筛选条件:付款日期更早,或者同日期但开始日期≤当前行
        )
      )
    )
  )
))

直接把这个公式放到你要生成累计金额的第一行(比如F2),它会自动填充所有行的结果。

方案二:用MMULT+ARRAYFORMULA(兼容旧版Google Sheets)

如果你的Sheet版本不支持BYROW,用矩阵乘法来实现逐行累计:

=ARRAYFORMULA(
  IF(ISBLANK(D2:D10),,  // 无付款日期则返回空
    MMULT(
      --(
        NOT(ISBLANK(D2:D10)) *  // 排除无付款日期的发票
        ((D2:D10 < TRANSPOSE(D2:D10)) + (D2:D10 = TRANSPOSE(D2:D10)) * (B2:B10 <= TRANSPOSE(B2:B10)))
        // 生成布尔矩阵:每一行i对应所有行j是否符合累计条件
      ),
      E2:E10  // 金额列,和矩阵相乘得到每行的累计和
    )
  )
)

为什么你的原方案不行?

Query是一次性处理整个数据范围的函数,它的WHERE条件里的D2、B2是固定单元格引用,ArrayFormula没法把这些引用自动转成D2:D10、B2:B10的数组逐个代入到Query的字符串参数里,所以只有第一行的D2、B2生效,后面的行都用了同样的条件,结果自然不对。

内容的提问来源于stack exchange,提问作者Maths noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:27:33