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

Google Apps Script提取表格数据问题:漏取最后行及多邮箱存储咨询

Google Sheets自动发邮件脚本问题解决方案

问题1:数据提取缺失最后一行修复

根因

在单元格写入UNIQUE公式后立即读取工作表最后一行,此时Google Sheets公式为异步计算,还未返回完整结果,导致获取到的行数比实际少1,最后一行数据未被遍历。

修复代码

在UNIQUE公式写入语句后添加强制刷新语句,等待计算完成后再读取行数:

cs.getRange('A2').setFormula('=UNIQUE(Sheet1!G2:G' + mainSheetLastRow + ')');
// 新增以下行,强制等待公式计算完成
SpreadsheetApp.flush();
var custNameLastRow = cs.getLastRow();

问题2:多邮箱存储方案选择

两种方案均可正常实现需求,差异如下:

  • 方案1(同客户多邮箱分两行存储):无需修改现有代码逻辑,遍历到同一客户的多行邮箱时会自动分别发送邮件,不需要处理分隔符转义问题,容错率更高,更推荐使用。
  • 方案2(同一单元格用分号分隔多邮箱):表格结构更简洁,仅需修改读取邮箱的代码,将分号替换为逗号即可(MailApp原生支持逗号分隔的多个收件人):
// 原代码
// emailAddress = ts.getRange('B' + l).getValue();
// 修改为
emailAddress = ts.getRange('B' + l).getValue().replace(/\s*;\s*/g, ',');

完整修改后代码(默认使用方案1逻辑)

function myFunction() {
  vs = SpreadsheetApp.getActiveSpreadsheet();

  var i;
  var j;
  var k;
  var l;
  var name;
  var dsCustName;
  var custSheetLastRow;
  var emailAddress;
  var emailSubject;
  var emailMessage;
  var emailName;

  ds = vs.getSheets()[0];
  var mainSheetLastRow = ds.getLastRow();
  var shtName = ds.getName();
  Logger.log(shtName);

  var date = Utilities.formatDate(new Date(), "GMT-5:30", "dd/MM/yyyy");
  var custNameDate = new Date();

  ts = vs.getSheetByName('Email');

  cs = vs.insertSheet('Customer Name' + date);

  cs.getRange('A1').setValue('Customer Names');
  cs.setColumnWidth(1, 250);

  cs.getRange('A2').setFormula('=UNIQUE(Sheet1!G2:G' + mainSheetLastRow + ')');
  // 新增强制刷新行
  SpreadsheetApp.flush();
  var custNameLastRow = cs.getLastRow();

  for (i = 2; i <= custNameLastRow; i++) {

    name = cs.getRange('A' + i).getValue();

    vvs = SpreadsheetApp.create(name + custNameDate);
    dds = vvs.getActiveSheet();

    var dataToCopy = ds.getRange('A1:J' + mainSheetLastRow);
    var lastRow = dds.getLastRow();

    for (k = 1; k <= 9; k++) {
      var Paste = dds.getRange(lastRow + 1, k).setValues(dataToCopy.getCell(1, k).getValues());
    }

    for (var j = 1; j <= mainSheetLastRow; j++) {
      var dataToCopy = ds.getRange('A1:J' + mainSheetLastRow);
      var lastRow = dds.getLastRow();
      dsCustName = ds.getRange('G' + j).getValue();

      if (name == dsCustName) {
        for (k = 1; k <= 9; k++) {
          var Paste = dds.getRange(lastRow + 1, k).setValues(dataToCopy.getCell(j, k).getValues());
        }
      }

    }

    var emailLastRow = ts.getLastRow();

    for (l = 2; l <= emailLastRow; l++) {
      emailName = ts.getRange('A' + l).getValue();
      emailAddress = ts.getRange('B' + l).getValue();
      emailSubject = ts.getRange('C' + l).getValue();
      emailMessage = ts.getRange('D' + l).getValue();

      if (name == emailName) {
        try {
          var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + vvs.getId() + "&exportFormat=xlsx";

          var params = {
            method: "get",
            headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
            muteHttpExceptions: true
          };

          var blob = UrlFetchApp.fetch(url, params).getBlob();

          blob.setName(dds.getName() + ".xlsx");

          MailApp.sendEmail(emailAddress, emailSubject, emailMessage, { attachments: [blob] });

        } catch (f) {
          Logger.log(f.toString());
        }
      }
    }

    var files = DriveApp.getFilesByName(name + custNameDate);
    while (files.hasNext()) {
      var file = files.next();
      file.setTrashed(true);
    }

  }

  cs.activate();
  vs.deleteActiveSheet();

}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:15:03