如何在Google Sheets脚本中比较时间?附单元格时间提取代码示例
嘿,看起来你在Google Sheets里折腾时间提取和匹配的事儿,我来给你捋捋靠谱的解决思路和代码优化点:
1. 先优化时间提取的逻辑
你当前用text.slice(text.indexOf(":") + 1, text.length)从TEST:6:40 AM提取时间,这个逻辑有个小问题——如果字符串里有多个冒号(比如TEST:12:30:45 PM),就会提取出错误的内容。不如用正则表达式精准匹配时间格式,不管前面有多少干扰字符都能拿到正确的时间:
function extractTime(text) { // 匹配12小时制(带AM/PM)或24小时制的时间,不区分大小写 const timeRegex = /(\d{1,2}:\d{2}(?:\s?[AP]M)?)/i; const match = text.match(timeRegex); // 匹配到就返回时间字符串,否则返回null return match ? match[0] : null; }
2. 注意Google Sheets时间的存储坑点
敲黑板:Google Sheets里的时间是以数值存储的(比如1小时等于1/24,1分钟等于1/(24*60)),而你提取的是字符串格式的时间,直接用===对比肯定不匹配!这里给你两个可行的匹配方案:
方案一:把提取的时间转成数值对比
把字符串时间转成Google Sheets能识别的时间数值,再和单元格的数值做近似对比(避免浮点精度问题):
function convertTimeStrToSheetValue(timeStr) { // 解析时间字符串,记得设置时区(用脚本当前时区即可) const date = Utilities.parseDate(timeStr, Session.getScriptTimeZone(), "h:mm a"); // 计算时间对应的一天比例数值 return date.getHours()/24 + date.getMinutes()/(24*60) + date.getSeconds()/(24*60*60); }
然后在你的循环里这么用:
// 假设这是你要匹配的基准时间单元格 var sheetTimeValue = timeSheetRange.getCell(1,1).getValue(); // 提取当前单元格的时间字符串 var extractedTimeStr = extractTime(cellText); if (extractedTimeStr) { var extractedTimeValue = convertTimeStrToSheetValue(extractedTimeStr); // 用极小的差值判断是否相等,规避浮点误差 if (Math.abs(sheetTimeValue - extractedTimeValue) < 0.000001) { console.log("时间匹配成功!"); // 这里写匹配后的操作,比如标记单元格 } }
方案二:把单元格时间转成字符串对比
如果你更习惯用字符串对比,就把单元格的时间数值转成和提取格式一致的字符串:
var sheetTimeValue = timeSheetRange.getCell(1,1).getValue(); // 把数值转成"6:40 AM"这样的字符串格式 var sheetTimeStr = Utilities.formatDate( new Date(sheetTimeValue * 86400000), Session.getScriptTimeZone(), "h:mm a" ); var extractedTimeStr = extractTime(cellText); // 不区分大小写对比,避免AM/PM大小写问题 if (extractedTimeStr && sheetTimeStr.toLowerCase() === extractedTimeStr.toLowerCase()) { console.log("时间匹配成功!"); }
3. 完善你的遍历循环
从你的代码片段看,你在遍历30行8列的区域,建议加上空值检查,避免报错:
// 先定位到目标工作表和区域 var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("你的工作表名称"); var timeSheetRange = targetSheet.getRange(1, 1, 30, 8); // 基准时间(假设是第一行第一列的单元格) var sheetTimeValue = timeSheetRange.getCell(1,1).getValue(); for (var i = 1; i <= 30; i++) { for (var j = 1; j <= 8; j++) { var currentCell = timeSheetRange.getCell(i, j); var cellText = currentCell.getValue().toString(); var extractedTime = extractTime(cellText); // 如果没提取到时间,直接跳过当前单元格 if (!extractedTime) continue; // 这里用方案二做示例,你可以替换成方案一 var sheetTimeStr = Utilities.formatDate( new Date(sheetTimeValue * 86400000), Session.getScriptTimeZone(), "h:mm a" ); if (sheetTimeStr.toLowerCase() === extractedTime.toLowerCase()) { // 匹配成功后的操作,比如给单元格加背景色 currentCell.setBackground("#90EE90"); } } }
内容的提问来源于stack exchange,提问作者NotZack
相关产品推荐
相关产品推荐

