Google Apps Script提取Gmail附件至Drive时出现TypeError错误求助
Google Apps Script提取Gmail附件至Drive时出现TypeError错误求助
嘿,我一眼就看出问题所在啦!咱们来拆解一下:
你遇到的TypeError: messages[j].getAttachments is not a function错误,核心原因是对数据结构的理解偏差:GmailApp.getMessagesForThreads(threads)返回的是二维数组——外层数组对应每一条邮件线程,内层数组才是该线程里的具体邮件消息。你现在直接对messages[j](也就是整个线程的消息数组)调用getAttachments(),这当然会报错,因为数组本身没有这个方法呀!
接下来给你修正后的完整代码,同时做了一些优化:
function saveRatings() { var searchParams = { sender: "##Email adress here##", folderName: "Ratings File", attachName: "SB.xlsx" }; // 检查目标文件夹是否存在,不存在则创建 var folders = DriveApp.getFoldersByName(searchParams.folderName); var folder = folders.hasNext() ? folders.next() : DriveApp.createFolder(searchParams.folderName); Logger.log(folders.hasNext() ? "Folder already exists: " + folder.getName() : "Folder created: " + folder.getName()); // 获取指定发件人的所有邮件线程 var threads = GmailApp.search("from:" + searchParams.sender); // 获取线程对应的所有消息,返回二维数组:[线程1的消息数组, 线程2的消息数组, ...] var messagesByThread = GmailApp.getMessagesForThreads(threads); Logger.log("Looping through " + messagesByThread.length + " mail threads"); // 先遍历每个邮件线程 for (var j = 0; j < messagesByThread.length; j++) { // 取出当前线程里的所有消息(数组) var threadMessages = messagesByThread[j]; // 再遍历线程里的每一条消息 for (var m = 0; m < threadMessages.length; m++) { var singleMessage = threadMessages[m]; var attachments = singleMessage.getAttachments(); // 遍历当前消息的所有附件 for (var k = 0; k < attachments.length; k++) { var attachment = attachments[k]; // 用配置参数匹配附件名,更易维护 if (attachment.getName() === searchParams.attachName) { folder.createFile(attachment); Logger.log("Saved attachment: " + attachment.getName() + " from mail: " + singleMessage.getSubject()); } } } } }
关键改动说明:
- 新增了一层循环:先遍历线程的消息数组,再针对单个邮件消息调用
getAttachments(),这是解决错误的核心 - 把变量
messages改名为messagesByThread,更直观体现它的二维数组结构 - 用
searchParams.attachName代替硬编码的文件名,让代码后期修改更方便 - 优化了文件夹判断逻辑,用三元表达式简化代码
- 增加了更详细的日志,方便你调试时查看执行情况
这样修改后,代码就能正确识别每一封邮件并提取匹配的Excel附件啦!
备注:内容来源于stack exchange,提问作者Chris Lewis
相关产品推荐
相关产品推荐

