
本文介绍如何在 Google Sheets 中通过 LET、LAMBDA 和 INDIRECT 等高级函数,自动遍历指定名称的工作表数组,提取并聚合结构一致的数据(如分类支出),无需编写 Apps Script,实现真正可复用、可配置的跨表求和。
本文介绍如何在 google sheets 中通过 `let`、`lambda` 和 `indirect` 等高级函数,自动遍历指定名称的工作表数组,提取并聚合结构一致的数据(如分类支出),无需编写 apps script,实现真正可复用、可配置的跨表求和。
在财务类电子表格中,常需将多个按月命名的工作表(如 Jan2023 monthly totals、Feb2023 monthly totals)中相同结构的数据(例如「类别」「子类别」「金额」列)统一汇总到一个总览表中。手动为每个表写 SUMIFS 公式不仅繁琐,还难以维护。幸运的是,Google Sheets 的新函数体系(特别是 LET + LAMBDA + REDUCE 组合)提供了纯公式级的动态跨表聚合能力。
以下是一个经过生产环境验证的完整解决方案,适用于你的「Totals for categories 2023」表:
✅ 核心公式(粘贴至新工作表 A1 即可运行)
=let(
stackValues_, lambda(sn,ra,reduce(tocol(æ,2),sn,lambda(rs,s,let(r,indirect(s&"!"&ra),l,max(index(row(r)*iferror(r<>""))),d,filter(r,row(r)<=l),if(counta(iferror(d)),vstack(rs,d),rs))))),
sheetNames, tocol('Totals for categories 2023'!N4:N, 1),
data, stackValues_(sheetNames, "P8:S"),
query(
data,
"select Col1, Col2, sum(Col4)
where Col4 is not null
group by Col1, Col2
label Col1 'Category', Col2 'Sub Category' ",
0
)
)? 公式解析与关键组件说明
- sheetNames:从 'Totals for categories 2023'!N4:N 获取非空工作表名列表(你可用 getAllSheetNames("2023") 预先填充该列,或直接手动输入)。
- stackValues_:自定义 LAMBDA 函数,接收工作表名数组 sn 和相对范围字符串 ra(如 "P8:S"),逐个用 INDIRECT 构建引用(如 "Oct2023 monthly totals!P8:S"),再通过 FILTER 清除空行、VSTACK 垂直堆叠所有数据,最终生成统一二维数组。
- QUERY:对堆叠后的数据执行分组聚合——按第1列(Category)、第2列(Sub Category)分组,对第4列(金额)求和,并重命名列标题。
⚠️ 注意事项:
- 所有被遍历的工作表中,P8:S 区域必须保持完全一致的列结构:P列=Category,Q列=Sub Category,S列=Amount(数值)。若列序不同,请同步调整 QUERY 中的 Col1/Col2/Col4 引用及 ra 参数(如 "Q8:T")。
- INDIRECT 不支持跨文件引用,所有目标工作表必须属于同一电子表格。
- 若某工作表中 P8:S 完全为空,该表会被安全跳过,不影响整体结果。
- tocol(æ,2) 是一种高效初始化空数组的技巧(æ 为未定义变量,tocol(...,2) 返回空数组),避免 REDUCE 初始值干扰。
?️ 进阶适配建议
- 替换聚合逻辑:只需修改 QUERY 子句即可切换统计方式。例如改为平均值:avg(Col4);计数:count(Col4);或添加条件筛选:where Col4 > 0 and Col1 != ''。
-
动态范围参数化:可将 "P8:S" 提取为变量,便于复用:
rangeRef, "P8:S", data, stackValues_(sheetNames, rangeRef),
- 错误防护增强:在 INDIRECT 外包裹 IFERROR(..., {"","","",""}) 可防止某工作表不存在导致整式报错(但需确保返回空行结构匹配)。
该方案彻底摆脱了 Apps Script 的部署与权限管理负担,全部逻辑内置于公式中,支持实时重算、版本控制友好,且易于复制到其他年份或项目中——真正实现了“一次配置,长期复用”的自动化财务汇总目标。


















