如何在Google Sheets中用数组公式计算动态行的费用分摊总额
解决方案
单个人员单元格的分摊总额公式
在对应人员的总额单元格(比如Person A对应的C5),使用以下公式即可计算该人员的总分摊费用:
=SUM(ARRAYFORMULA(IF(C2:C4="X", B2:B4/BYROW(C2:F4, LAMBDA(row, COUNTIF(row, "X"))), 0)))
公式拆解:
BYROW(C2:F4, LAMBDA(row, COUNTIF(row, "X"))):遍历每一行发票数据,计算该行中标记"X"的人数(即需要分摊该项目的人数),生成每行对应分摊人数的数组。B2:B4/[上述数组]:计算单个项目里,每人需要分摊的金额(项目总费用 ÷ 该行分摊人数)。IF(C2:C4="X", ..., 0):判断当前人员列(这里是C列)在该行是否标记了"X",是则取对应分摊金额,否则取0。SUM(ARRAYFORMULA(...)):把所有符合条件的分摊金额求和,得到该人员的总费用。
批量生成所有人员的分摊总额
如果想一次性在总额行(比如第5行)生成所有人员的分摊金额,在C5单元格输入以下公式,结果会自动填充到右侧所有人员列:
=ARRAYFORMULA(TRANSPOSE(MMULT(N(C2:F4="X"), B2:B4/BYROW(C2:F4, LAMBDA(row, COUNTIF(row, "X"))))))
公式拆解:
N(C2:F4="X"):将人员列的"X"转为1、非"X"转为0,生成一个标记矩阵,记录每个人员是否参与对应项目的分摊。MMULT(...):通过矩阵乘法,将标记矩阵与每行的单人分摊金额数组相乘,直接算出每个人员的总分摊额。TRANSPOSE(...):把矩阵乘法的结果转置,使其对应到各人员列的位置。ARRAYFORMULA:让公式批量应用到所有人员列。
动态适配新增数据行(可选)
如果发票数据会新增行,可将公式中的固定范围改为动态范围,结合IFERROR处理空行:
单个单元格动态版:
=SUM(ARRAYFORMULA(IF(C2:C="X", B2:B/BYROW(C2:F, LAMBDA(row, COUNTIF(row, "X"))), 0)))
批量动态版:
=ARRAYFORMULA(IFERROR(TRANSPOSE(MMULT(N(C2:F="X"), B2:B/BYROW(C2:F, LAMBDA(row, COUNTIF(row, "X"))))), ""))
内容的提问来源于stack exchange,提问作者wcarhart
相关产品推荐
相关产品推荐

