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

Google Sheets脚本开发:按邮箱分组发送MailApp邮件摘要

嘿,我完全懂你现在的困扰——脚本确实能触发也能汇总数据,但把所有内容群发了,每个邮箱都收到了所有人的信息对吧?核心问题就是没把数据按邮箱做分组隔离,咱们一步步来解决这个问题:

解决思路核心:先按邮箱分组数据,再逐个发送

你需要先把符合触发日期条件的数据,按B列的「Recorded Email」分成不同的组,每个组对应一个邮箱的专属数据,之后再遍历每个组生成邮件、单独发送。

具体代码实现(替换你现有脚本的核心逻辑)
function sendFollowupEmails() {
  // 1. 处理触发日期:如果是每日时间触发器,取当天日期(去掉时间部分避免匹配误差)
  const triggerDate = new Date();
  triggerDate.setHours(0, 0, 0, 0);

  // 2. 获取表格数据(替换成你的工作表名称)
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("表单提交数据"); // 改成你的实际表名
  const allData = sheet.getDataRange().getValues();
  const rows = allData.slice(1); // 跳过表头行

  // 3. 按邮箱分组符合条件的数据
  const emailDataGroups = {};
  rows.forEach(row => {
    const userEmail = row[1]; // B列:Recorded Email
    const followupDate = new Date(row[6]); // G列:Requested Followup Date
    followupDate.setHours(0, 0, 0, 0); // 统一去掉时间部分

    // 只保留触发日期匹配的行
    if (followupDate.getTime() === triggerDate.getTime()) {
      // 如果邮箱还没在分组里,初始化一个空数组
      if (!emailDataGroups[userEmail]) {
        emailDataGroups[userEmail] = [];
      }
      // 把当前行的关键信息(C-F列个性化内容、剩余天数等)加入对应邮箱的数组
      emailDataGroups[userEmail].push({
        submitTime: row[0], // A列时间戳
        personalInfo: row.slice(2, 6), // C-F列的个性化信息
        daysRemaining: row[7] // H列剩余天数
      });
    }
  });

  // 4. 遍历每个邮箱分组,发送专属邮件
  for (const [targetEmail, userEntries] of Object.entries(emailDataGroups)) {
    // 生成该邮箱的专属邮件正文
    let emailBody = `<p>您好,以下是您在${triggerDate.toLocaleDateString()}的跟进请求汇总:</p>`;
    emailBody += "<ul>";
    userEntries.forEach((entry, index) => {
      emailBody += `<li>
        <strong>提交时间:</strong>${entry.submitTime}<br>
        <strong>个性化信息:</strong>${entry.personalInfo.join(" | ")}<br>
        <strong>剩余跟进天数:</strong>${entry.daysRemaining}
      </li>`;
    });
    emailBody += "</ul>";
    emailBody += "<p>感谢您的使用!</p>";

    // 发送邮件
    MailApp.sendEmail({
      to: targetEmail,
      subject: `跟进请求汇总 - ${triggerDate.toLocaleDateString()}`,
      htmlBody: emailBody
    });
  }
}
关键部分解释
  • 邮箱分组逻辑:用emailDataGroups这个对象做容器,键是邮箱地址,值是该邮箱所有符合条件的提交数据数组,彻底把不同用户的数据隔离开。
  • 日期匹配优化:把触发日期和跟进日期都去掉时分秒,用getTime()比较时间戳,避免因为提交时间的时分秒不同导致匹配失败。
  • 专属邮件生成:遍历每个邮箱的专属数据数组,只把该用户的内容放进邮件正文,确保每个邮箱只收到自己的汇总信息。
注意事项
  1. 记得把代码里的表单提交数据改成你实际的工作表名称。
  2. 确认列索引是否正确:数组从0开始,所以B列是索引1、G列是索引6,和你的表格布局对应。
  3. 测试时可以先手动运行脚本,在脚本编辑器的「查看」→「日志」里查看emailDataGroups的结构,确认分组是否正确。

内容的提问来源于stack exchange,提问作者M. S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:03