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

如何修改Google Apps Script实现Google Sheet多行选中时批量发邮件?

解决Google Apps Script批量发送邮件问题

你的脚本当前仅处理选中区域内最后一个单元格所在的单行,所以选中多行或多单元格时只会发送最后一行的邮件。以下是修改后的代码,支持批量处理选中的所有行:

function sendEmail() {
  const ss = SpreadsheetApp.getActive();
  const ui = SpreadsheetApp.getUi();
  const lsh = ss.getSheetByName('List');
  const tsh = ss.getSheetByName('Template');
  const subject = tsh.getRange(2, 1).getValue();
  const messageTemplate = tsh.getRange(2, 2).getValue();
  const dt = new Date();

  // 获取选中的范围并提取所有唯一行号
  const selectedRange = lsh.getActiveRange();
  const startRow = selectedRange.getRow();
  const numRows = selectedRange.getNumRows();
  // 用Set去重,避免同一行选多个单元格重复处理
  const uniqueRows = new Set();
  for (let i = 0; i < numRows; i++) {
    uniqueRows.add(startRow + i);
  }

  // 如果没有选中有效行,提示
  if (uniqueRows.size === 0) {
    ui.alert("请选择包含面试官信息的行");
    return;
  }

  // 循环处理每一行
  for (const row of uniqueRows) {
    // 检查当前行是否为空(以A列为准)
    if (lsh.getRange(row, 1).isBlank()) {
      ui.alert(`第${row}行无面试官信息,已跳过`);
      continue;
    }

    // 获取当前行的数据
    const rowData = lsh.getRange(row, 1, 1, 5).getValues()[0];
    const firstName = rowData[0];
    const lastName = rowData[1];
    const email = rowData[2];
    const authorName = rowData[3];
    const bookTitle = rowData[4];

    // 替换模板变量
    let message = messageTemplate.replace("<firstName>", firstName)
                                 .replace("<authorName>", authorName)
                                 .replace("<bookTitle>", bookTitle);

    // 发送邮件
    MailApp.sendEmail(email, subject, message);

    // 更新发送状态
    lsh.getRange(row, 6).setValue(dt);
    lsh.getRange(row, 7).setValue("Sent");

    // 提示当前行发送成功(可选,批量时可以注释掉避免频繁弹窗)
    // ui.alert(`面试官:${firstName} ${lastName}\n邮箱:${email}\n作者:${authorName}\n书名:${bookTitle}\n发送成功!`);
  }

  ui.alert(`批量发送完成,共处理${uniqueRows.size}行`);
}

关键修改说明:

  • 获取选中的所有行:通过getActiveRange()获取完整选中区域,计算出包含的所有行号,并用Set去重,确保同一行即使选中多个单元格也只处理一次。
  • 循环处理逻辑:遍历每个唯一行号,对每一行执行数据读取、模板替换、邮件发送和状态更新的完整流程。
  • 空白行检查:针对每一行单独检查是否为空,避免无效行导致错误,同时提示跳过的行。
  • 模板预加载:提前读取邮件模板内容,避免循环中重复调用getRange(),提升脚本执行效率。
  • 批量完成提示:所有行处理完成后统一提示,替代原来的单行弹窗,更适合批量操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:26:27