Google Apps Script遍历行发邮件时变量未更新问题排查
问题分析与修复方案
核心错误原因
你在循环里直接修改了原始邮件模板变量message:第一次替换后,模板里的<Name>、<Gradex>、<Date>占位符已经被替换成第一行的实际值,后续循环再执行replace时,找不到这些占位符,所以所有邮件都沿用第一次替换后的内容。
修复步骤及优化点
- 保留原始模板:把从Sheet2x获取的原始模板存在单独变量中,每次循环都基于这个原始模板生成新的邮件内容,避免修改原模板。
- 修正BCC字段:重复写两次
bcc会导致后者覆盖前者,应该用数组形式传入多个收件人。 - 避免工作表切换错误:直接使用提前定义的
sheet1变量操作单元格,不要用SpreadsheetApp.getActiveSheet(),防止当前工作表切换导致操作错误。 - 优化性能(可选):减少重复调用
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
相关产品推荐
相关产品推荐

