You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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("已结束"); // 标记状态为已结束
  }
}

使用说明

  1. 新增辅助列:在表格中添加列K(累计毫秒数)和列L(状态),用于存储暂停/恢复的中间数据(可隐藏这两列不影响使用)
  2. 操作逻辑:
    • 在列B输入任意内容,触发开始计时
    • 在列C输入任意内容,切换暂停/恢复状态
    • 在列D输入任意内容,结束计时并计算总时长
  3. 列号调整:如果你的操作列(开始/暂停/结束)不在B/C/D列,修改代码中col === 2/col === 3/col === 4的数字为对应列号即可

内容的提问来源于stack exchange,提问作者t-max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:55:23