Google Apps Script报错:getFrom is undefined,邮件附件存Drive失败
问题修复方案
核心错误原因
你代码里的threads[i].getMessages少了括号,这是方法调用,必须加()才能获取线程里的消息数组。现在mesgs拿到的是函数本身,不是消息列表,所以mesgs[i]自然是undefined,调用getFrom()就会抛出错误。
其他次要问题
if(threads == null){ exit; }里的exit不是合法语句,应该用return退出函数。- 用
for(var i in threads)遍历数组容易出问题,建议用普通for循环或forEach。 folderName变量未定义,需要和folderPicker_函数的返回值对应上。- 一个邮件线程可能有多条消息,你直接用threads的索引去取mesgs的元素逻辑错误,应该单独遍历每个线程里的所有消息。
修复后的完整代码
var fileTypesToExtract = ['pdf']; //处理完邮件后要添加的标签名称 var labelName = 'SaveToDrive'; function GmailToDrive(){ //构建查询语句,筛选未读且包含指定类型附件的邮件 var query = ''; for(var i = 0; i < fileTypesToExtract.length; i++){ query += (query === '' ? `filename:${fileTypesToExtract[i]}` : ` OR filename:${fileTypesToExtract[i]}`); } query = 'is:unread ' + query; var threads = GmailApp.search(query); console.log(threads); //如果没有符合条件的线程,直接返回 if(!threads || threads.length === 0){ return; } var label = getGmailLabel_(labelName); var root = DriveApp.getRootFolder(); //遍历每个邮件线程 threads.forEach(function(thread) { //获取当前线程的所有消息 var mesgs = thread.getMessages(); //遍历线程里的每一条消息 mesgs.forEach(function(msg) { var senderAddress = msg.getFrom(); var emailSubject = msg.getSubject(); console.log(`Subject: ${emailSubject}`); console.log(`Sender Address: ${senderAddress}`); //假设folderPicker_返回要使用的文件夹名称 var folderName = folderPicker_(emailSubject, senderAddress); var parentFolder = getFolder_(folderName); //获取当前消息的所有附件 var attachments = msg.getAttachments(); attachments.forEach(function(attachment) { var isDefinedType = checkIfDefinedType_(attachment); if(!isDefinedType) return; var attachmentBlob = attachment.copyBlob(); var file = DriveApp.createFile(attachmentBlob); parentFolder.addFile(file); root.removeFile(file); }); }); //处理完整个线程后标记已读并添加标签 thread.addLabel(label); thread.markRead(); console.log("成功保存到Drive并添加标签"); }); } // 以下是你原代码中用到的辅助函数,确保它们存在 function getGmailLabel_(labelName) { var label = GmailApp.getUserLabelByName(labelName); if (!label) { label = GmailApp.createLabel(labelName); } return label; } function folderPicker_(subject, sender) { // 根据主题和发件人生成或返回文件夹名称的逻辑,示例如下: return `${sender} - ${subject}`; } function getFolder_(folderName) { var folderIterator = DriveApp.getFoldersByName(folderName); var folder = folderIterator.hasNext() ? folderIterator.next() : DriveApp.createFolder(folderName); return folder; } function checkIfDefinedType_(attachment) { var fileName = attachment.getName(); var ext = fileName.split('.').pop().toLowerCase(); return fileTypesToExtract.includes(ext); }
修复说明
- 给
getMessages加上括号,正确获取消息数组。 - 用
forEach遍历线程和消息,逻辑更清晰,避免索引混乱。 - 替换
exit为return,正确退出函数。 - 补充了辅助函数的实现(如果你的原代码里有这些函数可以忽略,没有的话需要加上)。
- 修正了
folderName未定义的问题,通过folderPicker_的返回值赋值。
内容的提问来源于stack exchange,提问作者sajan deol
相关产品推荐
相关产品推荐

