Google Apps Script日期加5天格式化仅输出日期问题排查
问题根因
- 代码中调用的
moment库没有在Google Apps Script环境中预装,直接调用会抛出引用错误,日期格式化逻辑根本没执行,最终输出原始的带时区的时间字符串 curDate.setDate()的返回值是毫秒级时间戳,不是Date对象,即使引入moment,直接传时间戳虽然能解析,但逻辑写法不规范- 你写的moment格式串
DD/MM/YY输出的是两位年、日在前月在后的格式,和你需要的月/日/四位年的要求不匹配
修复方案
直接使用Apps Script内置的日期格式化工具即可,不需要引入第三方库,修复后可直接运行的代码如下:
function findEmailAddress() { var ss = SpreadsheetApp.getActive(); var sh1 = ss.getSheetByName('Working'); var vs1 = sh1.getRange('H1:H' + sh1.getLastRow()).getValues().flat(); var sh2 = ss.getSheetByName('Match'); var vs2 = sh2.getRange('A2:B' + sh2.getLastRow()).getValues(); var matchRows = vs2.filter(row => row[0].length && vs1.includes(row[0])); // 自动读取表格设置的时区,避免时区偏差导致日期错误 var tz = ss.getSpreadsheetTimeZone(); matchRows.forEach(row => { var mailMatch = row[1]; var targetDate = new Date(); // 计算5天后的日期,直接修改原日期实例即可 targetDate.setDate(targetDate.getDate() + 5); // 按要求格式化:两位月份/不补零的日期/四位年份,输出格式如07/10/2022 var dateStr = Utilities.formatDate(targetDate, tz, "MM/d/YYYY"); var subject = "Action Required!!! 5 Days Til Expiration"; var body = `You have a new expiration date for completion ${dateStr} all tasks associated with this must be complete. *This email is automatically generated do not reply*`; GmailApp.sendEmail(mailMatch, subject, body); }); }
注意事项
- 如果需要固定输出两位日期(比如5号显示05而不是5),把格式串里的
d改成dd即可,对应格式为MM/dd/YYYY - 不要依赖脚本默认时区做日期计算,优先读取表格本身的时区配置,避免跨时区运行时出现日期差1天的问题
- 如果一定要用moment,需要手动在Apps Script编辑器的「库」配置中添加moment的对应脚本ID,内置方法完全能满足需求,不建议额外引入第三方库增加复杂度
内容的提问来源于stack exchange,提问作者Jon Beckner
相关产品推荐
相关产品推荐

