Google Script调用GmailApp.sendEmail()执行完成未发出邮件问题咨询
Google Script 自动发信功能收不到邮件排查方案
核心显性代码问题(90%以上概率为以下原因)
- 连续比较运算符语法错误:JavaScript 不支持数学格式的连写判断
a > b > c,执行时会从左到右运算:先算5000 > xxxdays得到布尔值true/false(对应数字1/0),再用这个布尔值和后面的数字比较。当前代码所有天数判断均为错误写法:5000 >firstattempdays > 1:当firstattempdays在1-5000区间时,第一步运算得到true=1,第二步1>1结果为false,条件永远不成立5000>secondattempdays > 7、5000>thirdattempdays > 7、5000 >srtattempday > 7:第一步运算得到的布尔值最大为1,1>7永远为false,这三个分支完全不可能触发- 修正方式:把所有连写判断改成逻辑与连接,比如
5000 > firstattempdays && firstattempdays > 1
- 发信成功标记位置错误:标记
EMAIL_SENT的代码写在了4个发信分支的外部,只要命中最外层activitytype == "CTV" && datectvreceived == ""的判断,不管有没有实际执行GmailApp.sendEmail,都会直接标记为已发送,造成“发信成功”的假象,实际绝大多数情况根本没走到发信逻辑。- 修正方式:把
setValue(EMAIL_SENT)的代码移到每个GmailApp.sendEmail执行完成后,只有真的调用发信接口才标记成功
- 修正方式:把
- 变量拼写/引用错误:最后一个SRT升级分支里的变量名存在拼写不一致问题:
srtattemp、srtattempday和前面的firstattemp/secondattemp/thirdattemp命名格式不统一,大概率是拼写错误,会导致读取到undefined值,条件判断失效。另外else分支里的No_Email_Sent如果没有提前定义为变量,直接传入setValue会触发引用错误。
问题原始代码如下:
if(activitytype == "CTV" && datectvreceived == ""){ if(firstattemp == "" && 5000 >firstattempdays > 1){ var logic1message = l1content1 + plemail + l1content2 + ccemail + l1content3 + pvcemail + l1content4 +protocolNum + l1content5 + protocolNum + '-'+ studytitle + l1content6 + reportperiod + l1content7; GmailApp.sendEmail(pvoemail,'First Attempt Reminder: ' +protocolNum ,logic1message); }// first logic else if(firstattemp != "" && secondattemp == "" && 5000>secondattempdays > 7){ var logic2message = l2content1 + plemail + l2content2 + ccemail+ l2content3 + pvcemail + l2content4 + protocolNum + l2content5 + protocolNum + '-' + studytitle + l2content6 + reportperiod + l2content7 + firstattemp + l2content8; GmailApp.sendEmail(pvoemail,'Second Attempt Reminder: '+ protocolNum,logic2message); } //second logic else if(secondattemp != "" && firstattemp != "" && thirdattemp == "" && 5000>thirdattempdays > 7){ var logic3message = l3content1 + plemail + l3content2 + ccemail + l3content3 + pvcemail + l3content4 + protocolNum + l3content5 + protocolNum + '-' + studytitle + l3content6 + reportperiod + l3content7 + firstattemp + '&' + secondattemp + l3content8; GmailApp.sendEmail(pvoemail,'Third Attempt Reminder: ' + protocolNum,logic3message); } // third logic else if (thirdattemp != "" && secondattemp != "" && firstattemp != "" &&srtattemp == "" && 5000 >srtattempday > 7){ var logicsrtmessage = lscontent1 + plemail + lscontent2 +ccemail + lscontent3 + pvcemail + lscontent4 + firstattemp + lscontent5 + secondattemp + lscontent6 + thirdattemp + lscontent7; GmailApp.sendEmail(pvoemail,'SRT Esaclation Reminder: '+ protocolNum,logicsrtmessage); } //srt logic sheet.getRange(startRow +i, 26).setValue(EMAIL_SENT); // a note for the protocols which email were sent SpreadsheetApp.flush();} else {sheet.getRange(startRow +i, 26).setValue(No_Email_Sent); SpreadsheetApp.flush();
逻辑命中验证步骤
改完上述语法问题仍收不到邮件,按以下步骤验证:
- 在每个
GmailApp.sendEmail代码行前加一行Logger.log("命中X逻辑,准备发信,收件人:"+pvoemail),跑完脚本后查看执行日志:- 如果没有打印对应内容,说明还是没命中发信分支,逐一检查条件内变量取值:确认
activitytype是否严格等于"CTV",有没有前后空格、大小写差异;检查空值判断的字段是否真的为空字符串,有没有不可见空格、null值;检查各days变量计算结果是否落在设定区间,有没有NaN、负数情况
- 如果没有打印对应内容,说明还是没命中发信分支,逐一检查条件内变量取值:确认
- 如果日志显示已经执行到sendEmail行,先登录发信Gmail账号查看「已发送」文件夹:
- 已发送文件夹无对应邮件:检查
pvoemail变量是否为合法邮箱格式,有没有多余换行、空格、拼接错误、空值情况 - 已发送文件夹有对应邮件:让收件人检查垃圾邮件箱、促销/推广标签页,企业邮箱反垃圾规则可能拦截自动发送的邮件,可先给自己的邮箱发测试信验证投递链路是否正常
- 已发送文件夹无对应邮件:检查
边缘问题排查
- 检查脚本授权:首次运行Gmail发信功能需要授予脚本「发送电子邮件」权限,如果代码中写了trycatch吞掉权限错误,会显示执行完成但实际不发信
- 检查发信限额:个人免费Gmail账号单日发信限额为100封,Google Workspace账号单日限额为1500封,短时间发信过多触发限流会导致投递失败
- 检查内容合规性:正文携带大量链接、营销类敏感词会被Gmail直接拦截,不会进入收件人邮箱
修正后核心代码参考
if(activitytype == "CTV" && datectvreceived == ""){ let emailSent = false; // 修正连续比较逻辑 if(firstattemp == "" && firstattempdays > 1 && firstattempdays < 5000){ var logic1message = l1content1 + plemail + l1content2 + ccemail + l1content3 + pvcemail + l1content4 +protocolNum + l1content5 + protocolNum + '-'+ studytitle + l1content6 + reportperiod + l1content7; GmailApp.sendEmail(pvoemail,'First Attempt Reminder: ' +protocolNum ,logic1message); emailSent = true; } else if(firstattemp != "" && secondattemp == "" && secondattempdays >7 && secondattempdays <5000){ var logic2message = l2content1 + plemail + l2content2 + ccemail+ l2content3 + pvcemail + l2content4 + protocolNum + l2content5 + protocolNum + '-' + studytitle + l2content6 + reportperiod + l2content7 + firstattemp + l2content8; GmailApp.sendEmail(pvoemail,'Second Attempt Reminder: '+ protocolNum,logic2message); emailSent = true; } else if(secondattemp != "" && firstattemp != "" && thirdattemp == "" && thirdattempdays>7 && thirdattempdays <5000){ var logic3message = l3content1 + plemail + l3content2 + ccemail + l3content3 + pvcemail + l3content4 + protocolNum + l3content5 + protocolNum + '-' + studytitle + l3content6 + reportperiod + l3content7 + firstattemp + '&' + secondattemp + l3content8; GmailApp.sendEmail(pvoemail,'Third Attempt Reminder: ' + protocolNum,logic3message); emailSent = true; } // 注意变量名需要和实际表格读取的变量名保持一致 else if (thirdattemp != "" && secondattemp != "" && firstattemp != "" && srtattemp == "" && srtattempdays >7 && srtattempdays <5000){ var logicsrtmessage = lscontent1 + plemail + lscontent2 +ccemail + lscontent3 + pvcemail + lscontent4 + firstattemp + lscontent5 + secondattemp + lscontent6 + thirdattemp + lscontent7; GmailApp.sendEmail(pvoemail,'SRT Esaclation Reminder: '+ protocolNum,logicsrtmessage); emailSent = true; } // 统一标记发信状态 if(emailSent){ sheet.getRange(startRow +i, 26).setValue(EMAIL_SENT); } else { sheet.getRange(startRow +i, 26).setValue('No_Email_Sent'); } SpreadsheetApp.flush(); } else { sheet.getRange(startRow +i, 26).setValue('No_Email_Sent'); SpreadsheetApp.flush(); }
内容的提问来源于stack exchange,提问作者Donghao Li
相关产品推荐
相关产品推荐

