Google Sheets多工作表按姓名求和功能/代码需求
多工作表按姓名汇总工时(Google Sheets解决方案)
内置函数方案(无需脚本)
针对跨表按姓名汇总小时数、适配工作表定期更新的需求,可替代INDIRECT硬编码的局限,使用以下数组公式:
假设汇总表姓名列在A列,求和结果放在B列,在B2单元格输入公式后下拉:
=SUM(ARRAYFORMULA(IFERROR(VLOOKUP(A2, INDIRECT("'"&FILTER(GET_WORKBOOK_TABS(), GET_WORKBOOK_TABS()<>"汇总表")&"'!A:B"), 2, FALSE))))
公式说明
GET_WORKBOOK_TABS():自动获取当前文档所有工作表名称FILTER(..., GET_WORKBOOK_TABS()<>"汇总表"):排除汇总表自身,避免循环引用INDIRECT("'"&...&"'!A:B"):动态引用每个工作表的A(姓名)、B(小时数)列,自动适配新增工作表VLOOKUP:在每个工作表中匹配当前姓名对应的小时数IFERROR:处理姓名未出现在某工作表的情况,返回0不影响求和SUM:汇总所有工作表的匹配结果
Apps Script自定义函数方案(灵活适配复杂场景)
如果工作表字段位置不固定,或需要更灵活的逻辑,可使用自定义脚本:
- 打开目标Google Sheet,点击「扩展程序」→「Apps 脚本」
- 替换默认代码为以下内容:
function SUM_BY_NAME(name) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheets = ss.getSheets(); let totalHours = 0; sheets.forEach(sheet => { // 替换为你的汇总表名称,跳过自身 if (sheet.getName() === "汇总表") return; const data = sheet.getDataRange().getValues(); // 调整列索引:姓名列=0(A列),小时数列=1(B列),按需修改 const nameColIndex = 0; const hourColIndex = 1; data.forEach(row => { if (row[nameColIndex] === name) { totalHours += row[hourColIndex] || 0; } }); }); return totalHours; }
- 保存脚本并返回表格,在汇总表B2单元格输入
=SUM_BY_NAME(A2),下拉即可自动计算
优势
- 自动识别新增/删除的工作表,无需手动更新公式
- 可灵活调整姓名、小时数的列位置,适配不同工作表的字段布局
注意事项
- 内置函数方案需启用Google Sheets扩展函数,首次使用
GET_WORKBOOK_TABS()需完成授权 - 若工作表名称含特殊字符(如空格、符号),内置公式的单引号已自动处理兼容问题
内容的提问来源于stack exchange,提问作者hubehe
相关产品推荐
相关产品推荐

