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

Gmail提取PDF附件文本的Google Apps Script函数失效排查

问题描述

我写了一个Google Apps Script函数,想提取特定发件人邮件里的PDF附件,把它存成Google Doc后提取文本,后续用来解析信息录入表格。但函数没报错,控制台没输出Doc文本,指定的Holding Folder里也没生成文件。已经确认文件夹ID和发件人邮箱都是对的,请问问题出在哪?

附上我的代码:

function parsePDFs () {

  const senderEmail = "SENDER@EMAIL.COM";
  const holdingFolderId = "FOLDERID";
  const holdingFolder = DriveApp.getFolderById(holdingFolderId);

  const threads = GmailApp.search('from:' + senderEmail);
  console.log(threads.length);

  for (let i = 0; i < threads.length; i++) {
    const thread = threads[i];
    const messages = thread.getMessages();

    for (let j = 0; j < messages.length; j++) {
      const message = messages[j];
      const attachments = message.getAttachments();

      for (let k = 0; k < attachments.length; k++) {
        const attachment = attachments[k];

        if (attachment.getContentType() === "application/pdf") {
          const pdfBlob = attachment.copyBlob();
          const pdfName = "New PDF";

          try {
            const docFile = holdingFolder.createFile(pdfBlob.setName(pdfName));
            const doc = DocumentApp.openById(docFile.getId());
            const docText = doc.getBody().getText();

            console.log("PDF file: " + pdfName);
            console.log("Google Doc Text: " + docText);
          } catch (error) {
            console.log("Error processing attachment: " + pdfName + ", Error: " + error);
          }
        }
      }
    }
  }
};
问题排查与解决方案

1. Gmail搜索结果数量限制

GmailApp.search() 默认只返回最近25条邮件线程,如果目标邮件不在这个范围内,后续逻辑根本不会执行。可以修改搜索代码,指定返回更多结果:

// 第二个参数是起始索引,第三个是返回数量,这里设为100条
const threads = GmailApp.search('from:' + senderEmail, 0, 100);

2. PDF内容类型判断不严谨

部分PDF附件的Content-Type可能不是application/pdf,而是application/x-pdf或者其他变种。改用文件名后缀判断更可靠:

// 替换原有的ContentType判断
if (attachment.getFileName().toLowerCase().endsWith('.pdf')) {
  // 后续逻辑...
}

3. 直接保存PDF后无法立即转为可编辑的Google Doc

你当前的代码是把PDF直接存到Drive,然后用DocumentApp.openById()打开,但这个操作只能打开原生的Google Doc文件,PDF文件无法直接用DocumentApp编辑。需要通过Drive API将PDF转换为Google Docs格式:

首先要在脚本编辑器的「资源」→「高级Google服务」中启用Drive API,然后修改转换逻辑:

try {
  const pdfBlob = attachment.copyBlob();
  const pdfName = attachment.getFileName().replace('.pdf', ''); // 保留原文件名

  // 配置转换参数
  const fileMetadata = {
    name: pdfName,
    parents: [holdingFolderId],
    mimeType: 'application/vnd.google-apps.document' // 指定转换为Google Doc
  };

  // 上传并转换PDF
  const docFile = Drive.Files.insert(fileMetadata, pdfBlob, {
    convert: true
  });

  // 打开转换后的Doc并提取文本
  const doc = DocumentApp.openById(docFile.id);
  const docText = doc.getBody().getText();

  console.log("处理完成的文件: " + pdfName);
  console.log("提取的文本: " + docText);
} catch (error) {
  console.log("处理附件出错: " + attachment.getFileName() + ", 错误信息: " + error);
}

4. 隐性权限问题

虽然你确认了文件夹ID正确,但要确保脚本拥有该文件夹的编辑权限。可以手动把文件夹的编辑权限赋予脚本的执行账号(通常是你的Google账号),避免因权限不足导致文件创建失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:35:16