Google Apps Script对比日期计算分钟差解决触发器重复执行问题
问题根源
- 核心错误1:你从表格A列通过
getValue()获取到的值本来就是原生Date对象,不需要用Utilities.formatDate转成字符串后再做计算,字符串执行减法运算自然返回NaN - 核心错误2:
new Date()解析字符串时默认按mm/dd/yyyy的美式格式处理,21/09/2021会被识别成月份为21,超出合法范围返回无效日期,计算自然出错
你之前找到的字符串日期解析方案仅适用于原始数据是字符串的场景,你从Google Sheets日期列读取到的直接是Date对象,不需要做任何字符串解析,自然不会有格式兼容问题。
修正后完整代码
function deleteTriggerError() { const logSheetName = "LOG"; const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(logSheetName); // 表格至少有2行记录才执行判断,避免报错 if (logSheet.getLastRow() < 2) return; // 直接获取原生Date对象,不受表格显示格式影响 const lastRowTimer = logSheet.getRange(logSheet.getLastRow(), 1).getValue(); const secondLastRowTimer = logSheet.getRange(logSheet.getLastRow() - 1, 1).getValue(); // 计算时间差,转成分钟单位 const diffMs = Math.abs(lastRowTimer - secondLastRowTimer); const diffMinutes = Math.floor(diffMs / 1000 / 60); // 30分钟间隔预留1分钟容差,阈值设为29 const allowedDiff = 29; // 间隔小于阈值则删除重复触发新增的行 if (diffMinutes < allowedDiff) { logSheet.deleteRow(logSheet.getLastRow()); } }
逻辑说明
- 完全移除了多余的日期格式化、字符串解析步骤,直接用Google Sheets内部存储的标准时间戳计算,不管你表格设置的是
en_GB还是en_US显示格式都可以正常运行 - 增加了行数量校验,避免表格只有1行数据时执行
getLastRow()-1逻辑报错 - 去掉了冗余的空行插入逻辑,该逻辑会导致判断的行对象错位,你本身触发器已经会新增记录行,不需要在去重函数里额外插入空行
- 如果需要动态调整间隔阈值,可以直接把H3单元格改成存储数字29,直接用
getRange("H3").getValue()读取即可,不需要做字符串替换处理
内容的提问来源于stack exchange,提问作者Verminous
相关产品推荐
相关产品推荐

