如何用Apps Script捕获日期时间差为秒:毫秒?Google Sheets秒表开发问题
搞定Google Sheets秒表的NaN问题&完善计次功能
嘿,我来帮你解决这个秒表显示NaN的问题!之前我也在Google Sheets里折腾过类似的计时工具,太懂这种变量运算出问题的烦躁了。
首先,咱得搞清楚为啥会返回NaN:十有八九是你的currentTime和previousTiming变量类型不匹配,或者其中一个没正确初始化——比如一个是日期对象,另一个是字符串,或者第一次计时时previousTiming根本没赋值,数字减undefined可不就是NaN嘛!
下面给你一套完整的解决方案,直接就能用:
一、核心脚本(绑定到图片的函数)
我写了两种版本,一种用全局变量(简单适合临时用),一种用单元格存储(持久化,关闭表格再打开也能继续计时),你选自己需要的就行。
版本1:全局变量版(临时计时用)
// 全局变量存上次计时的毫秒时间戳 let previousTiming = null; function startOrLap() { const timerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Timer"); const currentTime = new Date().getTime(); // 转成毫秒数,确保是数字类型 // 第一次点击:初始化计时,写入初始值 if (previousTiming === null) { previousTiming = currentTime; timerSheet.getRange(1, 1).setValue("00:00.000"); timerSheet.setActiveRange(timerSheet.getRange(2, 1)); return; } // 计算差值并格式化:秒:毫秒 const diffMs = currentTime - previousTiming; const seconds = Math.floor(diffMs / 1000); const milliseconds = diffMs % 1000; const formattedDiff = `${String(seconds).padStart(2, '0')}:${String(milliseconds).padStart(3, '0')}`; // 写入当前活动单元格,然后下移 const activeCell = timerSheet.getActiveCell(); activeCell.setValue(formattedDiff); previousTiming = currentTime; // 更新上次计时时间 timerSheet.setActiveRange(activeCell.offset(1, 0)); }
版本2:单元格存储版(持久化计时)
如果需要关闭表格再打开还能接着计时,就用这个——把上次的时间存在一个隐藏单元格里:
function startOrLap() { const timerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Timer"); const storageCell = timerSheet.getRange("Z1"); // 选个不会用到的列,比如Z列,之后可以隐藏 const currentTime = new Date().getTime(); let previousTiming = storageCell.getValue(); // 第一次点击初始化 if (previousTiming === "" || previousTiming === null) { previousTiming = currentTime; storageCell.setValue(previousTiming); timerSheet.getRange(1, 1).setValue("00:00.000"); timerSheet.setActiveRange(timerSheet.getRange(2, 1)); return; } // 计算并格式化差值 const diffMs = currentTime - previousTiming; const seconds = Math.floor(diffMs / 1000); const milliseconds = diffMs % 1000; const formattedDiff = `${String(seconds).padStart(2, '0')}:${String(milliseconds).padStart(3, '0')}`; // 写入+下移单元格 const activeCell = timerSheet.getActiveCell(); activeCell.setValue(formattedDiff); storageCell.setValue(currentTime); // 更新存储的时间 timerSheet.setActiveRange(activeCell.offset(1, 0)); }
二、关键注意点
- 必须用毫秒时间戳:
new Date().getTime()会返回从1970年到现在的毫秒数,是纯数字,运算绝对不会出NaN;别直接存日期对象或者文本格式的时间,很容易类型不匹配。 - 初始化判断:第一次点击时一定要给
previousTiming赋值,不然第一次计算就是currentTime - undefined,直接NaN。 - 绑定脚本到图片:插入图片到「Timer」工作表后,右键图片→分配脚本,输入函数名
startOrLap就行。
三、额外优化小技巧
- 可以给「Timer」工作表的计时列设置单元格格式,让显示更统一;
- 如果要重置计时,再加个重置按钮,绑定一个重置函数,把
previousTiming(或者存储单元格)清空,活动单元格移回第一行。
内容的提问来源于stack exchange,提问作者swolfe2
相关产品推荐
相关产品推荐

