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

Google Script提取邮件日期至GSheet报getDate非函数错误

报错原因

触发TypeError: message.getDate is not a function的核心原因是传入extractDetails函数的message参数,不是Google Apps Script基础Gmail服务下的GmailMessage类型实例,只有该类型实例才内置getDate()/getSubject()/getFrom()/getPlainBody()这类实例方法。
常见的错误传参场景:

  • 直接把GmailApp.search()返回的GmailThread(邮件线程)对象传入函数,线程对象仅支持批量操作邮件的方法,不支持单封邮件的字段读取方法
  • 开启了Gmail高级API服务,传入的是API返回的原生JSON格式消息对象,这类对象是普通键值对结构,没有挂载GmailMessage类的原型方法
  • 传入的是触发器事件携带的通知数据、邮件ID字符串等非邮件实例对象
修复方案

优先推荐直接在遍历邮件的逻辑里完成字段提取,避免跨函数传参出现类型不匹配问题,以下是可直接运行的正确实现:

function writeEmailDataToSheet() {
  const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Email');
  // 替换为你实际需要的邮件搜索规则
  const emailThreads = GmailApp.search('YOUR_EMAIL_FILTER_RULE');
  
  emailThreads.forEach(thread => {
    // 从线程中取出真正的GmailMessage实例数组
    const messageList = thread.getMessages();
    messageList.forEach(message => {
      // 直接从GmailMessage实例读取字段
      const sendTime = message.getDate();
      const sender = message.getFrom();
      const subject = message.getSubject();
      const plainBody = message.getPlainBody();
      // 追加写入表格
      targetSheet.appendRow([sendTime, sender, subject, plainBody]);
    })
  })
}

如果你是使用Gmail高级API获取的JSON格式消息对象,没有类实例方法,使用以下逻辑提取字段:

function processAdvancedGmailMessage(message) {
  const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Email');
  const headers = message.payload.headers;
  // 从邮件头提取基础字段
  const sendTime = new Date(headers.find(item => item.name === 'Date').value);
  const sender = headers.find(item => item.name === 'From').value;
  const subject = headers.find(item => item.name === 'Subject').value;
  
  // 递归提取纯文本正文
  let plainBody = '';
  const extractText = (partList) => {
    partList.forEach(part => {
      if (part.mimeType === 'text/plain' && part.body?.data) {
        plainBody += Utilities.newBlob(Utilities.base64Decode(part.body.data)).getDataAsString();
      }
      if (part.parts) extractText(part.parts);
    })
  };
  if (message.payload.parts) extractText(message.payload.parts);

  targetSheet.appendRow([sendTime, sender, subject, plainBody]);
}

如果需要定位自己传参的具体类型,可以在原函数第一行加入调试代码,运行后查看控制台输出的类型值即可:
console.log('传入对象类型:', message.getObjectName ? message.getObjectName() : typeof message);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:57:18