如何修改Google Apps Script发邮件脚本实现相同收件人仅发单封邮件
Apps Script 发信脚本邮箱去重修改方案
原有脚本是逐行判断发送状态触发发信,没有做邮箱维度的去重,我们通过新增已发送邮箱的全局校验实现去重,分两种常用场景适配:
场景1:同一个邮箱只要发过一次就不再发(不管对应多少条数据)
- 第一步:在脚本最顶端声明已发送邮箱存储对象
// 全局存储已发送过的邮箱地址,自动去重 const sentEmails = new Set();
- 第二步:在脚本初始化读取数据阶段,先遍历所有已经标记
EMAIL_SENT的行,把对应邮箱提前存入Set,避免多次运行脚本时重复发信
// 遍历所有行,提前收集历史已发送邮箱 for (let i = 0; i < data.length; i++) { const row = data[i]; const email = row[你脚本中邮箱所在的列索引,例如第2列就填1]; // 注意数组索引从0开始计算 const emailSent = row[你脚本中EMAIL_SENT标记所在的列索引]; if (emailSent === "EMAIL_SENT") { sentEmails.add(email); } }
- 第三步:找到原有逐行发信的逻辑,在判断
EMAIL_SENT的逻辑前,新增邮箱重复校验
// 原有逻辑:判断当前行是否已经发过 if (row[emailSentColumn] === "EMAIL_SENT") continue; // 新增逻辑:判断该邮箱是否已经发过,发过就直接跳过当前行 const currentEmail = row[emailColumn]; if (sentEmails.has(currentEmail)) continue;
- 第四步:在原有发送成功后打
EMAIL_SENT标记的逻辑后,新增把当前邮箱存入Set的代码
// 原有发送成功标记逻辑 sheet.getRange(startRow + i, emailSentColumn + 1).setValue("EMAIL_SENT"); // 新增:记录已发送邮箱,后续行碰到同地址直接跳过 sentEmails.add(currentEmail);
场景2:同一个邮箱的多条数据合并成一封邮件发送(不跳过数据,仅合并内容)
如果需要把同一个邮箱对应的多条通知内容整合到一封邮件里,就调整逻辑为先按邮箱分组再批量发信:
- 第一步:先遍历所有待发送行,按邮箱分组存储对应内容
const emailGroups = {}; for (let i = 0; i < data.length; i++) { const row = data[i]; const email = row[emailColumn]; const emailSent = row[emailSentColumn]; if (emailSent === "EMAIL_SENT") continue; // 无对应邮箱分组则初始化 if (!emailGroups[email]) { emailGroups[email] = []; } // 把当前行的通知内容存入对应邮箱的分组 emailGroups[email].push(row[contentColumn]); // contentColumn替换成你通知内容所在的列索引 }
- 第二步:遍历分组发信,发完给该邮箱对应的所有待发送行统一打标记
for (const [email, contents] of Object.entries(emailGroups)) { // 合并内容,可自定义分隔符 const emailBody = `你有以下待处理通知:\n${contents.join("\n---\n")}`; // 调用发信接口 MailApp.sendEmail(email, "统一通知标题", emailBody); // 遍历所有行,给该邮箱对应的所有待发送行打已发送标记 for (let i = 0; i < data.length; i++) { const row = data[i]; if (row[emailColumn] === email && row[emailSentColumn] !== "EMAIL_SENT") { sheet.getRange(startRow + i, emailSentColumn + 1).setValue("EMAIL_SENT"); } } }
内容的提问来源于stack exchange,提问作者user16792093
相关产品推荐
相关产品推荐

