如何用Google Apps Script实现Gmail附件按主题转存Google Drive?
Google Apps Script 邮件附件自动分类存储实现方案
核心实现代码
function saveAttachmentsFromEmails() { // 配置项:替换为你的目标关键词和Drive父文件夹ID(留空则用"我的云端硬盘") const TARGET_KEYWORD = "报表"; const PARENT_FOLDER_ID = ""; // 搜索主题含指定关键词的最近100封邮件,可调整数量或添加时间范围(如after:2024/01/01) const threads = GmailApp.search(`subject:${TARGET_KEYWORD}`, 0, 100); threads.forEach(thread => { const messages = thread.getMessages(); messages.forEach(message => { const subject = message.getSubject(); const parentFolder = PARENT_FOLDER_ID ? DriveApp.getFolderById(PARENT_FOLDER_ID) : DriveApp.getRootFolder(); let targetFolder = getFolderByName(parentFolder, subject); // 无同名文件夹则创建 if (!targetFolder) { targetFolder = parentFolder.createFolder(subject); console.log(`创建文件夹:${subject}`); } // 遍历并保存附件,跳过已存在的文件 const attachments = message.getAttachments(); attachments.forEach(attachment => { if (!fileExistsInFolder(targetFolder, attachment.getName())) { targetFolder.createFile(attachment); console.log(`保存附件:${attachment.getName()} 至 ${subject}`); } }); }); }); } // 辅助函数:在父文件夹中查找同名子文件夹 function getFolderByName(parentFolder, folderName) { const folders = parentFolder.getFoldersByName(folderName); return folders.hasNext() ? folders.next() : null; } // 辅助函数:检查文件夹内是否存在同名文件 function fileExistsInFolder(folder, fileName) { const files = folder.getFilesByName(fileName); return files.hasNext(); }
代码说明
- 关键词匹配:通过
GmailApp.search筛选目标邮件,修改TARGET_KEYWORD即可切换匹配关键词,也可扩展搜索条件(如添加未读邮件筛选is:unread)。 - 文件夹校验:
getFolderByName遍历父文件夹子目录,判断是否存在与邮件主题同名的文件夹。 - 文件夹创建:未找到同名文件夹时,自动在指定父目录下生成新文件夹。
- 附件存储:遍历邮件附件,通过
fileExistsInFolder避免重复存储,仅保存未存在的附件。
使用步骤
- 打开Google Apps Script编辑器(从Google Sheets/文档的「扩展程序」-「Apps Script」进入)。
- 新建脚本文件,粘贴上述代码。
- 修改
TARGET_KEYWORD为你的目标关键词,如需指定父文件夹,填写PARENT_FOLDER_ID(从Drive文件夹URL中提取ID)。 - 首次运行时完成权限授权,按照页面提示操作即可。
- 可设置时间驱动触发器(左侧「触发器」-「添加触发器」),实现定时自动执行(如每日一次)。
内容的提问来源于stack exchange,提问作者Lucas Davi
相关产品推荐
相关产品推荐

