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

求助修复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);
}

关键修改说明

  1. 核心修复:将subFolder.createFile(fileName, fileBlob)替换为subFolder.createFile(fileBlob)——这个重载会直接保存Blob的原始二进制数据,正确生成PDF文件。如果需要确保文件名与附件完全一致,可以追加.setName(attachment.getName())。
  2. 类型匹配优化:把严格的=== "application/pdf"改成includes("pdf"),兼容部分邮件中出现的application/x-pdf等非标准PDF ContentType。
  3. 冗余代码清理:移除了不必要的Utilities.sleep(1000)——Gmail和Drive的API配额限制不需要额外的单秒延迟,反而会降低脚本执行效率。

可选优化建议

  • 避免重复保存:可以在保存前检查目标文件夹中是否已存在同名文件,跳过重复项:
    var existingFiles = subFolder.getFilesByName(attachment.getName());
    if (!existingFiles.hasNext()) {
      subFolder.createFile(fileBlob);
    }
    
  • 批量处理优化:如果需要处理大量邮件,建议使用GmailApp.getInboxThreads()的分页参数,避免单次请求过多线程导致超时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:10:26