如何在Google Sheets中对FILTER函数的结果进行求和/聚合
如何在Google Sheets中对FILTER函数的结果进行求和/聚合
嘿,我完全懂你的困扰——参考了Excel的解决方案却在Google Sheets里跑不通对吧?别着急,咱们针对Google Sheets的特性来搞定这个工时汇总的需求。
先明确下你的场景:你有一份工时表数据,想要通过指定日期范围,汇总出每个员工在各个项目上的耗时,生成类似交叉透视表的视图,而且你已经搞定了顶部的项目列表(用了TRANSPOSE(SORT(UNIQUE(FILTER(...))))的组合)。
下面给你几个实用的解决方案,按需选择就行:
方案1:一步到位用QUERY+PIVOT(最省心)
Google Sheets的QUERY函数自带透视功能,能直接生成你要的交叉汇总表,不用单独做表头再逐个填充数据。假设你的ARCHIVE工作表里:
- B列是工时开始日期,C列是结束日期
- D列是员工姓名,E列是项目名称
- F列是对应的工时数
试试这个公式:
=QUERY(ARCHIVE!A:F, "SELECT D, SUM(F) WHERE B >= date '"&TEXT(B28, "yyyy-mm-dd")&"' AND C <= date '"&TEXT(B29, "yyyy-mm-dd")&"' GROUP BY D PIVOT E", 1)
我给你拆解下逻辑:
ARCHIVE!A:F:指定要查询的完整数据范围SELECT D, SUM(F):选取员工列,并对工时列做求和计算WHERE ...:过滤出B28(起始日期)到B29(结束日期)范围内的数据,用TEXT把单元格日期转成QUERY能识别的格式GROUP BY D:按员工分组汇总PIVOT E:把项目列转成横向表头,自动匹配每个员工的对应项目工时- 最后的
1:表示数据源有表头行,让QUERY能正确识别列名
方案2:配合现有表头用SUMIFS(适配你已做的设置)
如果你已经用现有公式生成了项目表头和员工列表,可以用SUMIFS来填充每个员工-项目的工时:
- 先在A列生成员工列表(和你的项目表头逻辑一致):
=SORT(UNIQUE(FILTER(ARCHIVE!D:D, ARCHIVE!B:B >= B28, ARCHIVE!C:C <= B29)))
- 在第一个员工第一个项目的单元格(比如B31)输入公式:
=SUMIFS(ARCHIVE!F:F, ARCHIVE!D:D, A31, ARCHIVE!E:E, B30, ARCHIVE!B:B, ">="&B28, ARCHIVE!C:C, "<="&B29)
然后把这个公式右拉、下拉,就能自动填充所有汇总结果。
方案3:动态数组BYROW/BYCOL(自动遍历填充)
如果你想用Google Sheets的现代动态数组函数,可以一次性生成所有结果,不用手动拉公式:
=BYROW(A31:A, LAMBDA(staff, BYCOL(B30:Z, LAMBDA(project, SUMIFS(ARCHIVE!F:F, ARCHIVE!D:D, staff, ARCHIVE!E:E, project, ARCHIVE!B:B, ">="&B28, ARCHIVE!C:C, "<="&B29)))))
这个公式会自动遍历员工列和项目列,批量计算每个组合的工时总和。
注意事项
- 如果你实际的列位置和我假设的不一样,记得把公式里的列(D、E、F等)改成你对应的列
- 确保日期格式是Google Sheets能识别的标准格式,避免过滤出错
- 空白的项目或员工会被
FILTER+UNIQUE自动过滤,不会显示无效的空行空列
备注:内容来源于stack exchange,提问作者jkjenner
相关产品推荐
相关产品推荐

