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

Google Apps Script触发器运行时重复发送邮件问题求助

Google Apps Script触发器运行时重复发送两封邮件的排查方案

你的代码逻辑本身没有重复调用MailApp.sendEmail的问题,结合你已经排查过的常见原因,再试试以下针对性方案:

1. 新增执行日志,确认函数调用次数

在函数开头和邮件发送前后添加日志,明确函数是否被触发两次:

function elpemail() {
  console.log('elpemail 开始执行:' + new Date().toLocaleString());
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('list');
  var lastRow = sheet.getLastRow();

  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  var rowData = sheet.getRange(lastRow, 1, 1, sheet.getLastColumn()).getValues()[0];

  var emailSubject = "(Something)";
  var emailBody = "(Something)";

  var recipientEmail = "example@example.com";
  var options = {
    htmlBody: emailBody
  };

  MailApp.sendEmail(recipientEmail, emailSubject, "", options);
  console.log('邮件发送完成:' + new Date().toLocaleString());
}

执行后在脚本编辑器→查看→执行日志中查看记录,如果出现两条相同时间的执行日志,说明函数确实被触发了两次。

2. 修正脚本锁的使用方式

如果之前的锁没有生效,可能是锁的作用范围或位置不对,把邮件发送逻辑完整包裹在锁的控制范围内:

function elpemail() {
  var lock = LockService.getScriptLock();
  // 设置10秒超时,避免因死锁导致脚本卡住
  if (!lock.tryLock(10000)) {
    console.log('已有函数实例在运行,终止本次执行');
    return;
  }

  try {
    // 原有业务逻辑
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('list');
    var lastRow = sheet.getLastRow();

    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var rowData = sheet.getRange(lastRow, 1, 1, sheet.getLastColumn()).getValues()[0];

    var emailSubject = "(Something)";
    var emailBody = "(Something)";

    var recipientEmail = "example@example.com";
    var options = {
      htmlBody: emailBody
    };
 
    MailApp.sendEmail(recipientEmail, emailSubject, "", options);
    console.log('邮件发送成功');
  } finally {
    // 无论执行结果如何,都释放锁
    lock.releaseLock();
  }
}

3. 排查隐性触发来源

  • 检查是否存在其他类型的触发器:比如除了你设置的时间触发器,是否绑定了onFormSubmit(表单提交)、onEdit(单元格编辑)等触发器,且这些触发器也指向了elpemail函数?
  • 确认是否有其他脚本文件:在当前表格绑定的脚本中,是否有其他函数调用了elpemail?
  • 查看触发器执行历史:在脚本编辑器→编辑→当前项目的触发器页面,查看每个触发器的执行记录,确认是否每次触发都生成了两条执行记录。

4. 检查时区设置

如果是时间驱动触发器,确认触发器的时区是否和你的预期一致:时区设置错误可能导致跨时区时出现重复触发的情况。

内容的提问来源于stack exchange,提问作者Iuhie Catherine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:11:17