Google AppScript自动发邮件脚本日期异常后完全失效求助
故障根因
你的脚本存在3个核心逻辑错误,是导致前期乱发邮件、后期完全停发的直接原因:
- 日期比较逻辑完全失效:你用
Utilities.formatDate把日期转成了Tue, May 31, 2022格式的字符串,还直接做Sdate >= SsheetDate+3运算——字符串和数字相加时会直接拼接成无意义文本(比如Tue, May 31, 20223),字符串是按字典序而非时间先后比较,之前只有2022/05/31不触发完全是字典序排序的巧合,和预期逻辑无关。 - 数据拉取范围计算错误:你的起始读取行是第3行,但行数计算写的是
sheet.getLastRow()-1,正确计算逻辑应为sheet.getLastRow() - startRow + 1。当表格最后一行行号小于3时,脚本会尝试读取不存在的单元格范围,直接抛错终止,这就是搁置后脚本完全不发信的核心原因——触发器每次运行都直接报错,不会执行任何发信逻辑。 - 缺少空值和异常处理:如果C列(存储拜访日期的列,对应
row[2])有空值,new Date(row[2])会生成无效日期,后续运算直接报错,会终止整个循环,导致后面所有行都不会被处理。
修复方案
直接替换为以下代码即可,所有逻辑问题均已修复:
function MailingAutoJuillet() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Juillet"); var startRow = 3; var lastRow = sheet.getLastRow(); // 无有效数据时直接退出,避免范围越界报错 if (lastRow < startRow) return; var numRows = lastRow - startRow + 1; var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()); var data = dataRange.getValues(); var EMAIL_SENT = 'EMAIL_SENT'; var NO_EMAIL = 'NO_EMAIL'; // 提前计算3天前的0点时间戳,用数值比较彻底避免字符串日期的判断错误 var threeDaysAgo = new Date(); threeDaysAgo.setHours(0,0,0,0); threeDaysAgo.setDate(threeDaysAgo.getDate() - 3); var threeDaysAgoTs = threeDaysAgo.getTime(); // 提前加载邮件模板,避免循环内重复加载浪费运行配额 const HTMLTemplate = HtmlService.createTemplateFromFile("HTML Mail de rappel") const HTMLforemail = HTMLTemplate.evaluate().getContent() for (var i = 0; i < data.length; ++i) { try { var row = data[i]; // 跳过空日期、已标记发信/不发信的行 if (!row[2] || row[13] == EMAIL_SENT || row[13] == NO_EMAIL) continue; var sheetDate = new Date(row[2]); sheetDate.setHours(0,0,0,0); var sheetDateTs = sheetDate.getTime(); // 时间戳数值比较,逻辑100%准确 if (threeDaysAgoTs >= sheetDateTs) { var emailAddress = row[9]; // 跳过邮箱为空的行 if (!emailAddress) continue; var emailText = "Text"; var subject = "Text"; var option={ htmlBody:HTMLforemail }; GmailApp.sendEmail(emailAddress,subject,emailText,option); sheet.getRange(startRow+i,14).setValue("EMAIL_SENT"); } } catch (err) { // 单行报错不终止整个脚本,错误信息直接写入对应行N列方便排查 sheet.getRange(startRow+i,14).setValue("ERROR:" + err.message); } } }
验证步骤
- 先暂时禁用时间触发器,在表格内填入不同测试日期,手动运行一次脚本,确认只有拜访日期早于等于3天前、未标记状态的行才会触发邮件
- 逻辑验证无误后再重新启用时间触发器即可
- 后续如果某行N列出现
ERROR:开头的标记,直接看后面的错误描述就能定位对应行的问题,不会再出现整个脚本直接停摆的情况
内容的提问来源于stack exchange,提问作者MacNaab
相关产品推荐
相关产品推荐

