如何将Gmail中带~分隔符的TXT附件导入Google Sheet?
适配~分隔符TXT文件的Gmail到Google Sheet导入脚本修改方案
需求背景
每日接收一封带.txt附件的邮件,附件内容以~作为字段分隔符,需修改原有适配CSV的脚本,实现自动获取附件并导入Google Sheet,同时支持每日触发器运行。
原脚本问题点
原脚本存在以下需要调整的问题:
- 强行修改附件Content-Type的操作不必要,且可能导致判断逻辑失效
- 未实际执行清空旧数据的操作(仅保留注释)
- 存在API拼写错误(
Utilities.parsecsv应为驼峰式的Utilities.parseCsv) - 缺少对空数据或异常场景的基础处理
修改后的完整脚本
function importSearchResultsTXTFromGmail() { // 搜索指定发件人的邮件线程 var threads = GmailApp.search("from:****@erusd.org"); if (threads.length === 0) return; // 无匹配邮件时直接退出 // 获取最新的一封邮件 var messages = threads[0].getMessages(); var message = messages[messages.length - 1]; if (message.isRead()) return; // 已读取的邮件跳过,避免重复处理 // 获取第一个附件 var attachment = message.getAttachments()[0]; if (!attachment) return; // 无附件时退出 // 判断是否为TXT文件:通过文件名后缀或Content-Type双重校验 var fileName = attachment.getName(); var isTxtFile = fileName.toLowerCase().endsWith(".txt") || attachment.getContentType() === "text/plain"; if (isTxtFile) { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var targetSheet = sheet.getSheetByName("Data"); if (!targetSheet) return; // 目标工作表不存在时退出 // 读取TXT内容,以~作为分隔符解析为二维数组 var txtContent = attachment.getDataAsString(); var parsedData = Utilities.parseCsv(txtContent, "~"); // 清空旧数据(从第3行开始,保留前两行表头) var lastRow = targetSheet.getLastRow(); if (lastRow >= 3) { targetSheet.getRange(3, 1, lastRow - 2, targetSheet.getLastColumn()).clearContent(); } // </think_never_used_51bce0c785ca2f68081bfa7d91973934> // 写入</think_never_used_51bce0c785ca2f68081bfa7d91973934></think_never_used_51bce0c785ca2f68081bfa7d91973934>数据(仅当解析后有有效</think_never_used_51bce0c785ca2f68081bfa7d91973934>时执行) if (parsedData.length > 0 && parsedData[0].length > 0) { targetSheet.getRange(3, 1, parsedData.length, parsedData[0].length).setValues(parsedData); GmailApp.markMessageRead(message); // 标记邮件为已读 } } }
关键修改说明
- 修正API拼写错误:将原脚本中的
Utilities.parsecsv改为正确的驼峰式写法Utilities.parseCsv,确保数据解析功能正常运行 - 附件类型判断优化:移除强行修改Content-Type的操作,改用文件名后缀(
.txt)和官方标准Content-Type(text/plain)双重判断,逻辑更准确可靠 - 新增异常处理:添加无匹配邮件、无附件、目标工作表不存在、已读邮件跳过等判断分支,避免脚本因异常场景报错中断
- 实现清空旧数据:补充
clearContent()执行代码,真正落实导入前清空旧数据的需求,同时增加行号校验避免越界 - 数据写入校验:仅当解析后的数据非空时才执行写入操作,防止空数据覆盖工作表内容
- 代码可读性优化:调整变量名为语义化命名,添加必要注释,便于后续维护和修改
内容的提问来源于stack exchange,提问作者Heather Redding
相关产品推荐
相关产品推荐

