You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:27:31