请求修复从Gmail附件导入CSV至Google Sheets的Apps Script
修复后的脚本及问题说明
错误原因
TypeError: message.getAttachmentsByType is not a function 是因为GmailApp的Message类根本没有getAttachmentsByType这个方法,得手动遍历所有附件筛选CSV文件。
修复后的完整脚本
function ExtractCSVFromGmailAndImport() { const label = "Report Data"; // 替换成你的Gmail标签 const subjects = ["Data 1", "Data 2", "Data 3"]; // 替换成需要匹配的邮件主题 const spreadsheetId = "12345678900987654311"; // 替换成你的Google Sheets ID // 提前打开表格,避免循环里重复调用拖慢速度 const spreadsheet = SpreadsheetApp.openById(spreadsheetId); subjects.forEach(subject => { const sheet = spreadsheet.getSheetByName(subject); if (!sheet) { console.log(`找不到名为${subject}的工作表,跳过`); return; } // 清空工作表内容(要连格式一起清就改成sheet.clear()) sheet.clearContents(); // 只搜对应标签+主题的最新1条邮件线程 const threads = GmailApp.search(`label:${label} subject:${subject}`, 0, 1); if (threads.length === 0) { console.log(`没找到主题为${subject}的邮件,跳过`); return; } const thread = threads[0]; // 拿线程里最新的那封邮件 const messages = thread.getMessages(); const latestMessage = messages[messages.length - 1]; // 遍历附件找CSV文件 const attachments = latestMessage.getAttachments(); const csvAttachment = attachments.find(att => { // 兼容两种判断方式:MIME类型或文件名后缀 return att.getContentType() === 'text/csv' || att.getName().toLowerCase().endsWith('.csv'); }); if (csvAttachment) { // 解析CSV并写入表格(从A1开始覆盖) const csvData = csvAttachment.getDataAsString(); const csv = Utilities.parseCsv(csvData); sheet.getRange(1, 1, csv.length, csv[0].length).setValues(csv); console.log(`主题${subject}的CSV数据导入成功`); } else { console.log(`主题${subject}的邮件里没找到CSV附件`); } }); }
关键修改点
- 替换无效方法:删掉
getAttachmentsByType,改用getAttachments()获取所有附件,再筛选出CSV类型的文件。 - 优化性能:提前打开Spreadsheet,避免循环中重复调用
openById浪费资源。 - 匹配最新数据:搜索时只取最新1条邮件线程,拿线程里的最新邮件,避免导入历史重复数据,符合每日替换报表的需求。
- 补全错误提示:添加工作表不存在、无匹配邮件、无CSV附件的日志,方便排查问题。
- 符合替换需求:从A1单元格开始写入数据,直接覆盖清空后的工作表(原脚本是追加,不符合你的替换要求)。
使用提示
- 把脚本里的
label、subjects、spreadsheetId换成你自己的信息。 - 要加发件人筛选的话,把搜索语句改成:
label:${label} subject:${subject} from:xxx@example.com。 - 首次运行要授权脚本访问Gmail和Google Sheets的权限。
内容的提问来源于stack exchange,提问作者Nijo George
相关产品推荐
相关产品推荐

