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
相关产品推荐
相关产品推荐

