You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

修复说明

  1. 给getMessages加上括号,正确获取消息数组。
  2. 用forEach遍历线程和消息,逻辑更清晰,避免索引混乱。
  3. 替换exit为return,正确退出函数。
  4. 补充了辅助函数的实现(如果你的原代码里有这些函数可以忽略,没有的话需要加上)。
  5. 修正了folderName未定义的问题,通过folderPicker_的返回值赋值。

内容的提问来源于stack exchange,提问作者sajan deol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:25:22