Google Sheets如何跨表求和Duration格式的I3单元格时长
Google Sheets 跨工作表Duration格式时长求和方案
之前公开脚本计算错误的核心原因是误读取了Duration单元格的显示文本做字符串解析,没有读取单元格底层存储的原始值。Google Sheets 中Duration格式本质是以天为单位的浮点数值:1小时对应1/24,1分钟对应1/(24*60),直接对原始数值求和即可得到正确结果,不需要做时间格式的字符串拆分转换。
方案1:原生公式实现(优先推荐,无需写代码)
不需要部署脚本,直接在「总计」工作表的目标求和单元格输入以下公式,输入完成后将该单元格格式设置为Duration即可:
=SUM(ARRAYFORMULA(IFERROR(INDIRECT("'"&FILTER(SHEETNAMES(),SHEETNAMES()<>"总计")&"'!I3"),0)))
公式逻辑说明:
SHEETNAMES()拉取当前表格所有工作表的名称FILTER()过滤掉名为「总计」的汇总工作表本身,避免循环引用INDIRECT()逐个匹配引用每本书对应工作表的I3单元格值IFERROR()跳过空工作表/无值单元格的报错SUM()直接对所有Duration原始值求和
如果你的表格版本暂不支持SHEETNAMES()函数,可以使用下面的脚本方案。
方案2:Apps Script 自定义脚本实现(全版本兼容)
操作步骤:
- 打开表格,点击顶部菜单栏「扩展程序」→「Apps Script」,打开脚本编辑器
- 清空编辑器内默认的示例代码,粘贴以下代码:
function SUM_ALL_READ_DURATION() { const currentFile = SpreadsheetApp.getActiveSpreadsheet(); const allSheets = currentFile.getSheets(); let totalDuration = 0; // 遍历所有工作表,排除汇总表 for (const sheet of allSheets) { const sheetName = sheet.getName(); if (sheetName === "总计") continue; // 读取I3单元格的原始数值,禁止读取getDisplayValue()返回的显示文本 const cellValue = sheet.getRange("I3").getValue(); // 仅累加有效数值,跳过空值、文本值 if (typeof cellValue === 'number' && !isNaN(cellValue)) { totalDuration += cellValue; } } // 写入结果到总计表,可自行修改目标单元格位置,示例为B2 const summarySheet = currentFile.getSheetByName("总计"); const targetCell = summarySheet.getRange("B2"); targetCell.setValue(totalDuration); // 设置单元格格式为支持超过24小时的Duration格式,避免时长溢出清零 targetCell.setNumberFormat('[h]:mm:ss'); }
- 点击脚本编辑器顶部的保存按钮,第一次运行时按照弹窗提示完成谷歌账号授权即可
- (可选配置自动更新)点击脚本编辑器左侧边栏的「触发器」选项,新增触发器:选择
SUM_ALL_READ_DURATION函数,触发条件设置为「编辑时」,后续任意书籍工作表的时长更新后,总时长会自动同步计算。
注意事项
- 存放求和结果的单元格必须设置为Duration格式,如果总时长超过24小时,请选择格式代码为
[h]:mm:ss的选项,避免时长被模24清零 - 如果你的汇总工作表名称不是「总计」,请将公式、代码中对应的工作表名称替换为你实际使用的名称
- 所有计算逻辑必须基于单元格的原始数值,不要对显示出来的
1:20:59格式字符串做拆分计算,否则会因为格式变动、时长超过24小时等场景出现计算错误
内容的提问来源于stack exchange,提问作者TJ Corporation
相关产品推荐
相关产品推荐

