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

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();

逻辑命中验证步骤

改完上述语法问题仍收不到邮件,按以下步骤验证:

  1. 在每个GmailApp.sendEmail代码行前加一行Logger.log("命中X逻辑,准备发信,收件人:"+pvoemail),跑完脚本后查看执行日志:
    • 如果没有打印对应内容,说明还是没命中发信分支,逐一检查条件内变量取值:确认activitytype是否严格等于"CTV",有没有前后空格、大小写差异;检查空值判断的字段是否真的为空字符串,有没有不可见空格、null值;检查各days变量计算结果是否落在设定区间,有没有NaN、负数情况
  2. 如果日志显示已经执行到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:06:28