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

Google Apps Script邮件仅含CC时才发送的问题修复求助

修复Google Apps Script邮件脚本:支持无CC地址发送邮件

问题根源

你的脚本现在只有当存在CC地址且该行未标记EMAIL_SENTCC时才会发送邮件,核心原因是发送逻辑被嵌套在EmailAddressCC && EmailSentCC !== EMAIL_SENTCC这个条件里,导致无CC的行直接跳过了发送步骤。

修复后的完整代码

function myFunction() {
  const taskSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tasks");
  const templateSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Template");
  const lr = taskSheet.getLastRow();
  const EMAIL_SENT = 'EMAIL_SENT';
  const EMAIL_SENTCC = 'EMAIL_SENTCC';
  const templatetext = templateSheet.getRange(1, 1).getValue();

  for (let i = 3; i <= lr; i++) {
    // 一次性读取当前行所有需要的数据,减少getRange调用
    const rowData = taskSheet.getRange(i, 3, 1, 11).getValues()[0];
    const currenttask = rowData[0];
    const daysleft = rowData[3];
    const date = new Date(rowData[2]);
    const EmailSent = rowData[4];
    const EmailSentCC = rowData[5];
    const checkboxChecked = rowData[6];
    const EmailAddress = rowData[9];
    const EmailAddressCC = rowData[10];

    const formattedDate = Utilities.formatDate(date, "GMT+4", 'E, MMM dd yyyy');
    const subjectline = "Task Reminder: " + currenttask;
    const messageBody = templatetext.replace("{name}", EmailSent)
                                    .replace("{title}", currenttask)
                                    .replace("{task}", currenttask)
                                    .replace("{date}", formattedDate)
                                    .replace("{#}", daysleft);

    // 构建邮件配置,仅当CC地址存在时添加cc字段
    const message = {
      to: EmailAddress,
      subject: subjectline,
      body: messageBody,
      name: "mfz scriptssCHANGE"
    };
    if (EmailAddressCC) {
      message.cc = EmailAddressCC;
    }

    // 核心条件调整:只要主收件人有效且未发送过,就执行发送
    if (!checkboxChecked && EmailAddress && EmailSent !== EMAIL_SENT) {
      try {
        MailApp.sendEmail(message);
        // 标记主收件人已发送
        taskSheet.getRange(i, 7).setValue(EMAIL_SENT);
        // 如果有CC地址,标记CC已发送
        if (EmailAddressCC && EmailSentCC !== EMAIL_SENTCC) {
          taskSheet.getRange(i, 8).setValue(EMAIL_SENTCC);
        }
      } catch (error) {
        console.log(`第${i}行发送失败: ${error.message}`);
        continue;
      }
    }
  }
}

关键修改点

  • 调整发送条件逻辑:把原脚本中嵌套的CC条件拆出来,只要主收件人地址有效且未标记发送,就触发邮件发送,CC地址仅作为可选参数处理。
  • 优化邮件对象构建:只有当EmailAddressCC不为空时,才给message添加cc字段,避免传递空的CC参数导致潜在报错。
  • 合并冗余代码:删除了重复的模板文本读取代码,提升脚本效率。
  • 批量读取单元格数据:一次性读取当前行所需的所有数据,减少多次调用getRange的性能损耗(Google Apps Script中频繁读写单元格会拖慢脚本)。
  • 完善发送标记逻辑:发送成功后,自动标记主收件人已发送;如果有CC地址,同时标记CC已发送状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:48:14