如何在Google Sheets中借助onEdit函数实现时间追踪器的暂停与恢复
Google Sheets 时间追踪器添加暂停/恢复功能解决方案
我正在Google Sheets中为工时与动作研究制作一款简易时间追踪器。目前使用的代码仅能记录开始时间与结束时间,如下方截图所示:
我希望它具备暂停计时器以及随时恢复计时的功能。以下是我当前使用的脚本/代码:
function onEdit(e) { const sh = e.range.getSheet(); if (sh.getName() == "Sheet1" && e.range.columnStart == 2 && e.value) { e.range.offset(0, 7).setValue(new Date()) } if (sh.getName() == "Sheet1" && e.range.columnStart == 8 && e.value) { e.range.offset(0, 2).setValue(new Date()); let Start = new Date(sh.getRange(e.range.rowStart,8).getValue()); let End = new Date(sh.getRange(e.range.rowStart,9).getValue()); sh.getRange(e.range.rowStart,10).setValue(timeDiff1(Start,End)); } } function timeDiff1(Start, End) { if (Start && End) { var second = 1000; var minute = 60 * second; var t1 = new Date(Start).valueOf(); var t2 = new Date(End).valueOf(); var d = t2 - t1; var minutes = Math.floor(d % day % hour / minute); var seconds = Math.floor(d % day % hour % minute / second); return 'mm:ss\n' + minutes + ':' + seconds; } else { return 'Invalid Inputs'; } }
请问该需求是否可行?或是有可替代的代码可供使用?
需求完全可行,以下是适配暂停/恢复功能的替代代码
要实现暂停与恢复,需要新增辅助列存储累计时长和当前状态,以下是修改后的完整脚本:
function onEdit(e) { const sh = e.range.getSheet(); if (sh.getName() !== "Sheet1") return; const row = e.range.rowStart; const col = e.range.columnStart; // 列B:输入内容触发「开始计时」 if (col === 2 && e.value) { sh.getRange(row, 8).setValue(new Date()); // 记录开始时间(原开始时间列) sh.getRange(row, 11).setValue(0); // 列K:存储累计时长(毫秒) sh.getRange(row, 12).setValue("运行中"); // 列L:标记当前状态 } // 列C:输入内容触发「暂停/恢复」切换 if (col === 3 && e.value) { const status = sh.getRange(row, 12).getValue(); const startTime = new Date(sh.getRange(row, 8).getValue()); let totalMs = sh.getRange(row, 11).getValue(); if (status === "运行中") { // 暂停:计算当前片段时长并累加,清空开始时间,标记状态为暂停 const now = new Date(); totalMs += now - startTime; sh.getRange(row, 11).setValue(totalMs); sh.getRange(row, 8).clearContent(); sh.getRange(row, 12).setValue("暂停"); } else if (status === "暂停") { // 恢复:重新记录开始时间,标记状态为运行中 sh.getRange(row, 8).setValue(new Date()); sh.getRange(row, 12).setValue("运行中"); } } // 列D:输入内容触发「结束计时」 if (col === 4 && e.value) { const status = sh.getRange(row, 12).getValue(); let totalMs = sh.getRange(row, 11).getValue(); // 如果仍在运行,先计算最后一段时长 if (status === "运行中") { const startTime = new Date(sh.getRange(row, 8).getValue()); totalMs += new Date() - startTime; } // 格式化总时长为 mm:ss 格式 const minutes = Math.floor(totalMs / (1000 * 60)); const seconds = Math.floor((totalMs % (1000 * 60)) / 1000); const formattedTime = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; sh.getRange(row, 9).setValue(new Date()); // 记录结束时间(原结束时间列) sh.getRange(row, 10).setValue(`mm:ss\n${formattedTime}`); // 更新总时长列 sh.getRange(row, 12).setValue("已结束"); // 标记状态为已结束 } }
使用说明
- 新增辅助列:在表格中添加列K(累计毫秒数)和列L(状态),用于存储暂停/恢复的中间数据(可隐藏这两列不影响使用)
- 操作逻辑:
- 在列B输入任意内容,触发开始计时
- 在列C输入任意内容,切换暂停/恢复状态
- 在列D输入任意内容,结束计时并计算总时长
- 列号调整:如果你的操作列(开始/暂停/结束)不在B/C/D列,修改代码中
col === 2/col === 3/col === 4的数字为对应列号即可
内容的提问来源于stack exchange,提问作者t-max
相关产品推荐
相关产品推荐

