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

Google Sheets批量发邮件动态变量失效及姓名格式调整求助

问题原因
  • 核心问题出在message变量的作用域和修改逻辑:你将邮件模板的原始内容存在了循环外的message变量中,第一次触发替换操作后,模板里的<name>、<teacher>等占位符就被永久替换为第一个学生的对应内容,后续循环处理其他学生时,message里已经没有可匹配的占位符,所以所有邮件内容都会复用第一个学生的信息。
  • 额外冗余问题:代码中重复定义了teacher和teacher1变量,属于无意义的重复读取操作。
修复方案

1. 核心逻辑修正

每次循环处理单个学生时,都基于原始模板生成专属的邮件内容,不要修改原始模板变量。

2. 姓名格式处理

针对姓, 名 中间名的格式,按逗号拆分字符串后取后半部分,提取首位姓名即可。

3. 修复后完整代码

function SendEmail() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet1 = ss.getSheetByName('ConcatenatedReport');
  var subject = sheet1.getRange(2,7).getValue();
  // 原始模板单独存储,永远不修改该变量
  var emailTemplate = sheet1.getRange(2,9).getValue();
  var n = sheet1.getLastRow();
  for (var i = 2; i < n+1 ; i++ ) {
    var fullName = sheet1.getRange(i,1).getValue();
    // 拆分姓名:按逗号分割取后半部分,提取第一个词作为学生名
    var name = fullName.split(',')[1].trim().split(' ')[0];
    var teacher = sheet1.getRange(i,4).getValue();
    var instructor = sheet1.getRange(i,3).getValue();
    var emailAddress = sheet1.getRange(i,5).getValue();
    var emailstatus = sheet1.getRange(i,6).getValue();
    if(emailstatus == ""){ 
      // 每次都基于原始模板生成新的邮件内容
      var message = emailTemplate.replace("<name>",name)
        .replace("<teacher>",teacher)
        .replace("<instructor>",instructor)
        .replace("<teacher1>",teacher);
      MailApp.sendEmail(emailAddress, subject, message);
      sheet1.getRange(i,6).setValue("Notified");
    }
  }
}
可选优化(代码基础薄弱也可直接使用)

如果你的表格数据量较大,每次循环调用getRange会降低执行速度,可一次性读取所有行数据再处理,执行效率提升明显:

function SendEmailOptimized() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet1 = ss.getSheetByName('ConcatenatedReport');
  var subject = sheet1.getRange(2,7).getValue();
  var emailTemplate = sheet1.getRange(2,9).getValue();
  var lastRow = sheet1.getLastRow();
  // 一次性读取第2行到最后一行、第1-6列的所有数据
  var allData = sheet1.getRange(2, 1, lastRow - 1, 6).getValues();
  
  for (var i = 0; i < allData.length; i++) {
    var row = allData[i];
    var fullName = row[0];
    var name = fullName.split(',')[1].trim().split(' ')[0];
    var instructor = row[2];
    var teacher = row[3];
    var emailAddress = row[4];
    var emailstatus = row[5];
    
    if (!emailstatus) {
      var message = emailTemplate.replace("<name>",name)
        .replace("<teacher>",teacher)
        .replace("<instructor>",instructor)
        .replace("<teacher1>",teacher);
      MailApp.sendEmail(emailAddress, subject, message);
      sheet1.getRange(i + 2, 6).setValue("Notified");
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:18:04