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

Google Apps Script邮件发送问题:重复表头、NaN及批量标记

问题解决:Google Apps Script 邮件发送与批量标记优化

问题1:邮件内表格表头重复显示且出现NaN值

原因

  1. 表头重复:每次循环都将完整的表格结构(包含<table>标签和表头)追加到messageData中,导致每一行数据都附带独立表头。
  2. NaN值出现:messageData += 后多了一个多余的+号,会强制将后续HTML字符串转为数字类型,空单元格或非数字内容会被解析为NaN。

解决方法

  • 将表格表头和外层<table>结构移到循环外,仅在循环内追加表格数据行。
  • 删除messageData +=后的多余+号,确保字符串正常拼接。

问题2:仅标记重复收件人最后一行的ColR为"Sent"

原因

当前代码仅在检测到下一行收件人不同时,才标记当前行ColR,同一收件人的前面行未被收集和批量标记。

解决方法

  • 新增数组存储同一收件人的所有行索引,当切换收件人或循环结束时,批量将这些行的ColR设置为"Sent"。
  • 调整循环逻辑,先收集同一收件人的所有数据,再统一发送邮件并标记。

修正后的完整代码

function sendEmails_test() {
  var sheetID = "sheetIDxxx";
  var sheet = SpreadsheetApp.openById(sheetID).getSheetByName('Sheet27');
  var lastrow = sheet.getLastRow();
  var startrow = 2;  
  var dataRange = sheet.getRange(startrow, 1, lastrow - startrow + 1, sheet.getLastColumn());
  var dataVal = dataRange.getValues();

  // 存储当前收件人的数据和行索引
  var currentEmail = '';
  var currentRows = [];
  var tableRows = '';
  var currentColD = '';
  var currentColN = '';

  // 表格固定结构(表头只渲染一次)
  const tableHeader = '<table style="width:100%; border-collapse:collapse">' +
                      '<tr><th>ColH</th><th>ColN</th><th>ColP</th></tr><tbody>';
  const tableFooter = '</tbody></table>';

  for (var i = 0; i < dataVal.length; i++) {
    var colD = dataVal[i][3];
    var colF = dataVal[i][5];
    var colH = dataVal[i][7] || ''; // 空值替换为空字符串,避免NaN
    var colN = dataVal[i][13] || '';
    var colP = dataVal[i][15] || '';
    var colR = dataVal[i][17];

    // 仅处理状态为Ready的行
    if (colF !== "" && colR === "Ready") {
      // 首次处理或切换收件人时,初始化数据
      if (currentEmail !== colF) {
        // 先处理上一个收件人的邮件和标记(非首次循环)
        if (currentEmail !== '') {
          const messageIntro = '<HTML><BODY>' +
                            '<p style="text-align:center"><b><h3>TEST</h3></b></p><br>' +
                            '<p style="padding-left: 25px">Dear ' + currentColD + "," +
                            '<p style="padding-left: 25px">Here are the details:</p>';
          const messageEnd = '<p style="padding-left: 25px">Thank you and Have a great day!<br></p></HTML></BODY>';
          const htmlBody = messageIntro + tableHeader + tableRows + tableFooter + messageEnd;
          
          // 发送邮件
          MailApp.sendEmail(currentEmail, "TEST: " + currentColN, '', {
            'from': 'x@gmail.com',
            htmlBody: htmlBody
          });

          // 批量标记所有对应行
          currentRows.forEach(rowIndex => {
            sheet.getRange(startrow + rowIndex, 18).setValue("Sent");
          });
        }
        // 重置当前收件人数据
        currentEmail = colF;
        currentColD = colD;
        currentColN = colN;
        currentRows = [i];
        tableRows = `<tr>
                      <td style="padding-left: 75px">${colH}</td>
                      <td style="padding-left: 75px">${colN}</td>
                      <td style="padding-left: 75px">${colP}</td>
                    </tr>`;
      } else {
        // 同一收件人,追加行数据和索引
        currentRows.push(i);
        tableRows += `<tr>
                      <td style="padding-left: 75px">${colH}</td>
                      <td style="padding-left: 75px">${colN}</td>
                      <td style="padding-left: 75px">${colP}</td>
                    </tr>`;
      }
    }
  }

  // 处理最后一个收件人的剩余数据
  if (currentEmail !== '') {
    const messageIntro = '<HTML><BODY>' +
                      '<p style="text-align:center"><b><h3>TEST</h3></b></p><br>' +
                      '<p style="padding-left: 25px">Dear ' + currentColD + "," +
                      '<p style="padding-left: 25px">Here are the details:</p>';
    const messageEnd = '<p style="padding-left: 25px">Thank you and Have a great day!<br></p></HTML></BODY>';
    const htmlBody = messageIntro + tableHeader + tableRows + tableFooter + messageEnd;
    
    MailApp.sendEmail(currentEmail, "TEST: " + currentColN, '', {
      'from': 'x@gmail.com',
      htmlBody: htmlBody
    });

    currentRows.forEach(rowIndex => {
      sheet.getRange(startrow + rowIndex, 18).setValue("Sent");
    });
  }
}

代码说明

  1. 表格结构优化:将表头和表格外层结构提取为固定常量,循环内仅追加数据行,彻底避免表头重复。
  2. 空值处理:用|| ''将空单元格转换为空字符串,杜绝NaN出现。
  3. 批量标记逻辑:通过currentRows数组收集同一收件人的所有行索引,切换收件人或循环结束时统一标记,确保所有对应行都被更新。
  4. 收件人切换处理:首次处理或收件人变更时,先完成上一个收件人的邮件发送和标记,再初始化当前收件人的数据,逻辑更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:05:05