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

从指定URL下载PDF至Google Drive时内容异常的技术问询

解决Google Apps Script下载Google文档PDF到Drive时的内容异常与鉴权问题

初始问题

需要从以下格式的链接下载PDF并保存到Google Drive文件夹:

fileURL = "https://docs.google.com/feeds/download/documents/export/Export?id=<...DOCID...>&revision=3970&exportFormat=pdf"

编写了如下代码,但生成的文件仅包含"Blob"字样而非实际内容:

function dFile(fileName,fileURL) {
  var response = UrlFetchApp.fetch(fileURL);
  var fileBlob = response.getBlob().getAs('application/pdf');
  var folder = DriveApp.getFolderById('..folderID..');
  var result = folder.createFile(fileName,fileBlob,MimeType.PDF);
  Logger.log("file created");
}

如何获取到实际的PDF文件?

更新情况

更新代码后,生成的PDF显示登录提示(见下图),推测需要鉴权,但不确定操作方式,且已在清单中配置了所有鉴权项:

function dFile(fileName,fileURL) {
  var response = UrlFetchApp.fetch(fileURL);
  var fileBlob = response.getBlob().getAs('application/pdf');
  var folder = DriveApp.getFolderById('..folderID..');
  var result = folder.createFile(fileBlob).setName(fileName);
  Logger.log("file created");
}

生成的PDF显示登录提示


解决方案

1. 修复Blob内容异常问题

最初的代码错误使用了createFile(name, content, mimeType)方法——这个方法的第二个参数要求是字符串内容,而非Blob对象,因此才会生成仅显示"Blob"的无效文件。正确做法是使用接收Blob的createFile(blob)方法,也就是你更新后的写法,但还需要解决鉴权问题。

2. 解决登录鉴权问题

通过UrlFetchApp.fetch请求Google文档导出链接时,必须携带当前脚本的授权身份,即添加OAuth令牌到请求头中,具体实现如下:

方法一:添加OAuth令牌请求

修改UrlFetchApp.fetch的参数,加入携带令牌的请求头:

function dFile(fileName, fileURL) {
  // 获取当前脚本的OAuth访问令牌
  var token = ScriptApp.getOAuthToken();
  // 配置请求头,携带鉴权令牌
  var options = {
    headers: {
      'Authorization': 'Bearer ' + token
    }
  };
  // 发送带鉴权的请求
  var response = UrlFetchApp.fetch(fileURL, options);
  var fileBlob = response.getBlob();
  // 将Blob直接存入Drive,无需强制转换类型
  var folder = DriveApp.getFolderById('你的文件夹ID');
  var result = folder.createFile(fileBlob).setName(fileName);
  Logger.log("文件已创建,ID:" + result.getId());
}

方法二:改用Drive API直接导出(更可靠)

如果上述方法仍有问题,可直接使用官方Drive API的files.export方法导出文档,这种方式更规范,鉴权逻辑更稳定:

  1. 在脚本编辑器中启用Drive API:点击「资源」→「高级Google服务」,找到「Drive API」并开启。
  2. 使用以下代码(调用时传入文档ID而非完整导出URL):
function dFile(fileName, docId) {
  // 通过文档ID直接导出PDF格式
  var blob = Drive.Files.export(docId, 'application/pdf');
  var folder = DriveApp.getFolderById('你的文件夹ID');
  var result = folder.createFile(blob).setName(fileName);
  Logger.log("文件已创建,ID:" + result.getId());
}

注意事项

  • 确保运行脚本的账号拥有目标文档的访问权限(查看或编辑权限均可)。
  • 启用Drive API后,脚本会自动配置所需的OAuth权限范围,无需手动在清单中添加多余项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:25:21