如何防止重复的Gmail邮件附件被写入Google表格?
解决方案:避免重复写入Gmail附件信息到Google表格
修改后的完整代码
function grabDover() { const dover = GmailApp.search('has:attachment label:"1st Choice Auto Dover Scans"'); const doverSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('1st Choice Auto Dover Scans'); // 读取表格中已存在的messageId,存入Set实现快速校验 const existingIds = new Set(); const lastRow = doverSheet.getLastRow(); if (lastRow > 1) { // 跳过表头行 const messageIdColumn = doverSheet.getRange(2, 4, lastRow - 1).getValues().flat().filter(id => id); messageIdColumn.forEach(id => existingIds.add(id)); } dover.forEach(thread => { const messages = thread.getMessages(); messages.forEach(message => { const messageid = message.getId(); // 校验当前messageId是否已存在,存在则直接跳过 if (existingIds.has(messageid)) return; const attachments = message.getAttachments(); const date = message.getDate(); const url = 'https://mail.google.com/mail/u/0/#label/' + messageid; attachments.forEach(attachment => { const array = [attachment.getName(), date, url, messageid]; doverSheet.appendRow(array); }); // 将已处理的messageId加入Set,避免同次运行中重复处理同一邮件 existingIds.add(messageid); }); }); }
关键逻辑说明
- 快速校验机制:用
Set存储已有的messageId,利用其O(1)的查找效率,比遍历数组校验快得多,尤其适合数据量较大的场景。 - 前置跳过重复:在处理每封邮件前先校验ID,已存在则直接跳过整封邮件的处理,避免无效操作。
- 同次运行去重:处理完邮件后把ID加入Set,防止同一次脚本执行中重复处理同一邮件(比如带多个附件的邮件)。
- 表头兼容:判断表格是否有数据行,避免把表头内容误当作ID处理。
额外优化方案
如果脚本运行频率高,还可以结合Gmail标签进一步减少待处理邮件:
// 修改搜索条件,排除已处理的邮件 const dover = GmailApp.search('has:attachment label:"1st Choice Auto Dover Scans" -label:"Processed"'); // 处理完成后给邮件添加已处理标签 thread.addLabel(GmailApp.getUserLabelByName('Processed'));
内容的提问来源于stack exchange,提问作者Matthew Kapfer
相关产品推荐
相关产品推荐

