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

如何修改Google Apps Script实现批量行数据合并邮件推送及getActive调整

解决方案:合并同一收件人未发送内容并改为时间驱动触发

修改后的脚本

function sendBulkEmails() {
  // 替换为你的表格ID(从表格URL的 https://docs.google.com/spreadsheets/d/[表格ID]/edit 中获取)
  const SPREADSHEET_ID = "你的表格ID";
  const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
  const sh = ss.getSheetByName("Sheet1"); // 替换为你的工作表名称
  const sr = 2; // 表头所在行号
  const lastRow = sh.getLastRow();
  
  if (lastRow < sr) return; // 无数据行时直接退出

  const rg = sh.getRange(sr, 1, lastRow - sr + 1, 6);
  const vs = rg.getValues();
  const emailGroups = {};
  const rowsToMark = [];

  // 1. 按收件人分组未发送内容
  vs.forEach((r, index) => {
    const emailSent = r[5];
    const sendTo = r[4];
    if (emailSent !== "Yes" && sendTo) { // 过滤已发送及无收件人数据
      rowsToMark.push(index + sr); // 记录需标记的工作表实际行号
      if (!emailGroups[sendTo]) {
        emailGroups[sendTo] = [];
      }
      emailGroups[sendTo].push({
        title: r[0],
        article: r[1]
      });
    }
  });

  if (Object.keys(emailGroups).length === 0) return; // 无待发送内容时退出

  // 2. 为每个收件人发送合并邮件
  const subject = "New Content on IG.com";
  for (const [recipient, contents] of Object.entries(emailGroups)) {
    let message = "<h3>你有以下新内容:</h3>";
    contents.forEach((item, idx) => {
      message += `
        <div style="margin: 12px 0; padding: 8px; border-left: 3px solid #2196F3;">
          <p><b>内容 ${idx + 1} 标题: </b>${item.title}</p>
          <p><b>内容 ${idx + 1} 文章: </b>${item.article}</p>
        </div>
      `;
    });

    MailApp.sendEmail({
      to: recipient,
      subject: subject,
      htmlBody: message
    });
  }

  // 3. 批量标记已发送行(比逐行操作更高效)
  sh.getRangeList(rowsToMark.map(row => `${row}:${row}`)).setValue("Yes");
}

关键改动说明

  • 收件人分组:通过emailGroups对象将同一收件人的未发送内容归类,避免重复发信
  • 批量标记优化:收集所有需标记的行号,用getRangeList批量设置状态,减少API调用次数提升效率
  • 空值校验:增加收件人邮箱非空判断,避免无效发送
  • 上下文明确化:替换getActive系列方法为指定表格/工作表的调用方式,适配时间驱动场景

关于.getActive相关命令的说明

需要修改原脚本中的.getActive相关命令:

  • 时间驱动触发器运行时,脚本无用户交互上下文,getActiveSpreadsheet()/getActiveSheet()可能无法正确获取目标表格,存在报错风险
  • 推荐用SpreadsheetApp.openById("表格ID")或openByUrl("表格完整URL")明确指定表格,配合getSheetByName("工作表名称")锁定工作表,确保脚本在任何触发场景下稳定运行

时间驱动触发器设置步骤

  1. 打开Google表格脚本编辑器,保存修改后的脚本
  2. 点击编辑器顶部时钟图标进入触发器管理页
  3. 点击「添加触发器」,配置参数:
    • 选择函数:sendBulkEmails
    • 部署类型:「基于时间的触发器」
    • 触发频率:按需选择(如「每天」「每小时」)
    • 保存完成配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:05:21