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

Google Apps Script遍历行发邮件时变量未更新问题排查

问题分析与修复方案

核心错误原因

你在循环里直接修改了原始邮件模板变量message:第一次替换后,模板里的<Name>、<Gradex>、<Date>占位符已经被替换成第一行的实际值,后续循环再执行replace时,找不到这些占位符,所以所有邮件都沿用第一次替换后的内容。

修复步骤及优化点

  1. 保留原始模板:把从Sheet2x获取的原始模板存在单独变量中,每次循环都基于这个原始模板生成新的邮件内容,避免修改原模板。
  2. 修正BCC字段:重复写两次bcc会导致后者覆盖前者,应该用数组形式传入多个收件人。
  3. 避免工作表切换错误:直接使用提前定义的sheet1变量操作单元格,不要用SpreadsheetApp.getActiveSheet(),防止当前工作表切换导致操作错误。
  4. 优化性能(可选):减少重复调用getRange,一次性获取所有需要的数据存入数组,遍历数组处理,降低对Spreadsheet服务的调用次数(Google Apps Script对服务调用次数有限制)。

修正后的代码

function SendEmail_InitialConfirmation() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('Sheet1x');
  var sheet2 = ss.getSheetByName('Sheet2x');

  var subject = sheet2.getRange(5, 1).getValue();
  // 保存原始模板,不直接修改
  var originalMessage = sheet2.getRange(5, 2).getValue();
  var n = sheet1.getLastRow();

  // 一次性获取所有需要的数据,提升性能
  var dataRange = sheet1.getRange(3, 4, n - 2, 14); // 从第3行第4列开始,取n-2行,14列(到第17列)
  var data = dataRange.getValues();
  var dateDisplayValues = sheet1.getRange(3, 13, n - 2).getDisplayValues(); // 单独获取日期的显示值

  // 遍历数据数组
  for (var i = 0; i < data.length; i++) {
    var rowIndex = i + 3; // 对应工作表的行号(从第3行开始)
    var Name = data[i][0]; // 第4列对应数组索引0
    var EmailAddress = data[i][1]; // 第5列对应索引1
    var Gradex = data[i][8]; // 第12列对应索引8(4+8=12)
    var Date = dateDisplayValues[i][0]; // 第13列的显示值
    var valueToCheck = data[i][12]; // 第16列对应索引12(4+12=16)

    if (valueToCheck === true) {
      // 每次基于原始模板生成新的邮件内容
      var message = originalMessage.replace("<Name>", Name)
                                   .replace("<Gradex>", Gradex)
                                   .replace("<Date>", Date);

      MailApp.sendEmail(EmailAddress, subject, message, {
        bcc: ["xxx@gmail.com", "xxxxxx@gmail.com"], // 用数组传入多个BCC收件人
        name: "Test Email Name"
      });

      // 操作sheet1的单元格,避免切换工作表
      sheet1.getRange(rowIndex, 16).removeCheckboxes().clearContent();
      sheet1.getRange(rowIndex, 17).setValue(true); // 直接传布尔值,无需加引号
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:52:40