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()比较时间戳,避免因为提交时间的时分秒不同导致匹配失败。 - 专属邮件生成:遍历每个邮箱的专属数据数组,只把该用户的内容放进邮件正文,确保每个邮箱只收到自己的汇总信息。
注意事项
- 记得把代码里的
表单提交数据改成你实际的工作表名称。 - 确认列索引是否正确:数组从0开始,所以B列是索引1、G列是索引6,和你的表格布局对应。
- 测试时可以先手动运行脚本,在脚本编辑器的「查看」→「日志」里查看
emailDataGroups的结构,确认分组是否正确。
内容的提问来源于stack exchange,提问作者M. S.
相关产品推荐
相关产品推荐

