Google Script匹配明日日期与Google表单提交日期判定不生效求助
问题原因与解决方案
核心错误原因
- 第一:
Range.getValues()方法返回的是二维数组,你遍历拿到的orderDate[i]是数组类型,而非日期对象,和Date类型的t做全等判断自然不成立,日志输出看起来一致是因为数组隐式转成了字符串打印。 - 第二:哪怕拿到了正确的
Date对象,两个不同的Date实例用===判断也永远返回false,全等运算符对引用类型比较的是内存地址而非实际存储的时间值。 - 第三:你构造的
t默认时分秒为0,如果表单提交的日期带具体提交时间,哪怕日期一致,时间戳也会不同。
修复方案
统一将对比的两个值转成相同格式的纯日期字符串再做判断,同时注意从二维数组中取实际值,修改代码如下:
function ArchiveTuesdayOrder() { const date = new Date(); date.setDate(date.getDate() + 1); // 提前格式化好明天的日期字符串,用于后续对比 const tomDate = Utilities.formatDate(date, "America/New_York", "MM-dd-yyyy"); const sheetActive = SpreadsheetApp.openById("xxxxxxxxxxxxxx"); const sheet = sheetActive.getSheetByName("xxxxxxxxxxxxxx"); const orderdateRange = sheet.getRange(2, 4, 100); const orderDate = orderdateRange.getValues(); for (let i = 0; i < orderDate.length; i++) { // 从二维数组中取出当前行的日期值 const currentOrderDate = orderDate[i][0]; // 跳过空行 if (!currentOrderDate) continue; // 将表格里的日期也转成相同格式的字符串再对比 const formattedOrderDate = Utilities.formatDate(currentOrderDate, "America/New_York", "MM-dd-yyyy"); if (tomDate === formattedOrderDate) { Logger.log("YES" + currentOrderDate); // 后续业务逻辑写在这里 } } }
如果偏好比较时间戳的方式,也可以用如下判断逻辑:
// 去掉两个日期的时分秒部分再比较时间戳 const t = new Date(date.getFullYear(), date.getMonth(), date.getDate()); const currentDate = new Date(currentOrderDate.getFullYear(), currentOrderDate.getMonth(), currentOrderDate.getDate()); if (t.getTime() === currentDate.getTime()) { // 匹配成功逻辑 }
内容的提问来源于stack exchange,提问作者OblongMedulla
相关产品推荐
相关产品推荐

