Google Apps Script固定日期发邮件时日期变量不匹配问题咨询
问题根因
两个值日志输出一致但判等失败,核心是类型匹配逻辑错误:
today是new Date()生成、经setHours(0,0,0,0)处理的Date对象类型- 从J15单元格读取的
dday存在两种可能的类型问题:- 如果单元格格式为纯文本,
dday是字符串类型,跨类型用==对比时,哪怕文本内容和Date的打印结果完全一致,也不会判定为相等 - 如果单元格被自动识别为日期格式,
dday虽然也是Date对象,但Date是引用类型,直接用==对比的是变量的内存地址,不是实际存储的时间值,同样会判定为不相等
- 如果单元格格式为纯文本,
修复方案
不要直接拿原始变量判等,统一两个值的对比维度即可,两种常用稳定写法:
方案1:统一转时间戳对比(最稳妥,不受格式影响)
把两个值都转成毫秒级时间戳(数字类型)再对比,不管是字符串格式日期还是Date对象,转时间戳后对比结果完全不受类型干扰。
修正后的完整代码:
function sendmail() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("test"); var today = new Date(); today.setHours(0,0,0,0); const todayTimestamp = today.getTime(); // 拿到今日0点的时间戳 var dday = sheet.getRange("j15").getValue(); // 把单元格取到的值转成Date对象,统一重置到0点消除隐藏时分秒的影响 const ddayObj = new Date(dday); ddayObj.setHours(0,0,0,0); const ddayTimestamp = ddayObj.getTime(); if(ddayTimestamp === todayTimestamp) sendEmail() function sendEmail(){ var recipient = "mymeail@gmail.com"; var subject = "test"; var body = "test"; MailApp.sendEmail(recipient, subject, body); }; }
方案2:统一格式化成年月日字符串对比
如果确认J15单元格存的就是yyyy-MM-dd格式的纯文本,也可以把today格式化成同规则字符串再对比:
// 新增格式化工具方法,把Date对象转成yyyy-MM-dd格式字符串 const formatDate = (date) => { const year = date.getFullYear(); const month = String(date.getMonth()+1).padStart(2,'0'); const day = String(date.getDate()).padStart(2,'0'); return `${year}-${month}-${day}` } const todayStr = formatDate(today); // 同类型字符串直接判等即可 if(dday === todayStr) sendEmail()
额外注意事项
- 表格内的日期类值尽量不要存纯文本,设置单元格格式为「日期」,避免读取时出现类型解析异常
- 原代码
sendEmail函数中定义的valuechange变量没有任何实际调用,属于冗余代码,可以直接删除 - 如果用时间触发器定时跑这个脚本,要把脚本时区和表格时区设置成一致,否则
new Date()取到的日期会和本地预期差1天
内容的提问来源于stack exchange,提问作者aksoerklodr
相关产品推荐
相关产品推荐

