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
相关产品推荐
相关产品推荐

