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

