求助修复Google Apps Script:Gmail附件转存Drive生成空白PDF问题
修复Gmail附件转存Drive生成空白PDF的问题
问题根源
你的脚本生成15字节空白PDF的核心原因是调用createFile时误用了方法重载:createFile(string name, Blob blob)会把Blob对象当作文本内容解析后写入文件,而非直接保存Blob的原始二进制数据,导致PDF结构被破坏。
修正后的完整代码
function saveAttachmentsToDrive() { var rootFolder = DriveApp.getRootFolder(); var subFolder = getOrCreateFolder(rootFolder, "testsaveattachments"); var threads = GmailApp.getInboxThreads(0, 5); for (var i = 0; i < threads.length; i++) { var messages = threads[i].getMessages(); for (var j = 0; j < messages.length; j++) { var attachments = messages[j].getAttachments(); for (var k = 0; k < attachments.length; k++) { var attachment = attachments[k]; // 放宽PDF类型匹配,兼容不同ContentType变种 if (attachment.getContentType().toLowerCase().includes("pdf")) { var fileBlob = attachment.copyBlob(); try { // 直接传入Blob保存原始数据,如需指定文件名可追加setName subFolder.createFile(fileBlob); // 如果需要强制覆盖文件名,用下面一行替代上面一行 // subFolder.createFile(fileBlob).setName(attachment.getName()); } catch (error) { Logger.log("保存附件出错: " + error); } } } } } } function getOrCreateFolder(parentFolder, folderName) { var folders = parentFolder.getFoldersByName(folderName); return folders.hasNext() ? folders.next() : parentFolder.createFolder(folderName); }
关键修改说明
- 核心修复:将
subFolder.createFile(fileName, fileBlob)替换为subFolder.createFile(fileBlob)——这个重载会直接保存Blob的原始二进制数据,正确生成PDF文件。如果需要确保文件名与附件完全一致,可以追加.setName(attachment.getName())。 - 类型匹配优化:把严格的
=== "application/pdf"改成includes("pdf"),兼容部分邮件中出现的application/x-pdf等非标准PDF ContentType。 - 冗余代码清理:移除了不必要的
Utilities.sleep(1000)——Gmail和Drive的API配额限制不需要额外的单秒延迟,反而会降低脚本执行效率。
可选优化建议
- 避免重复保存:可以在保存前检查目标文件夹中是否已存在同名文件,跳过重复项:
var existingFiles = subFolder.getFilesByName(attachment.getName()); if (!existingFiles.hasNext()) { subFolder.createFile(fileBlob); } - 批量处理优化:如果需要处理大量邮件,建议使用
GmailApp.getInboxThreads()的分页参数,避免单次请求过多线程导致超时。
内容的提问来源于stack exchange,提问作者bobhellen
相关产品推荐
相关产品推荐

