Google Apps脚本UrlFetchApp在URL存在时返回404

时间:2016-01-03 04:23:09

标签: javascript pdf google-apps-script

我正在尝试检索电子表格的pdf。每当我尝试时,我都会收到以下错误:

  

https://docs.google.com/a/firstcallres.com/spreadsheets/d/1ZPcW5cOQT5w28VUbr_JG9U-r7m6Uf-MDQcSmFOyhbE8/export?exportFormat=pdf&format=pdf&size=letter&portrait=false&fitw=true&source=labnol&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&fzr=false&gid=1680655368返回的代码404请求失败。

如果我在登录时点击上述网址,则会下载PDF。

如果我使用以下代码,我将获得一个登录页面作为回复。 URL是表格网址,url_ext是参数。

var response = UrlFetchApp.fetch(url + url_ext);

如果我将以下代码与OAuth令牌一起使用,我会收到404响应。

  var response = UrlFetchApp.fetch(url + url_ext, {
          headers: {'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken() }
          });

为什么会这样?如何使用令牌通过应用程序脚本访问工作表以检索PDF?

编辑:它已经自发地开始研究我的测试应用脚本。但是,如果我在另一个应用程序脚本中创建完全相同的功能,则会再次出现404错误。

我做了更多的故障排除,并将工作功能直接复制粘贴到新的应用脚本项目中。该功能成功运行,之后非工作功能正常运行。

在失败和工作之间没有对非工作功能进行过编辑。

编辑2:我可以重现此错误:如果我执行第二个工作功能,并将其复制 - 粘贴到新项目中,则会因404错误而失败。我不知道为什么会发生这种情况,但是当它在其他地方使用完全相同的代码工作时,我可以成功地重现404错误。

1 个答案:

答案 0 :(得分:7)

您缺少提出此请求的正确范围。它应返回401未经身份验证而不是404.要解决此问题,您需要添加驱动器范围。我通过脚本中的某个地方进行简单的DriveApp.getRootFolder()调用来完成此操作。这将为您的项目添加驱动器范围。任何对DriveApp的调用都会添加范围。

以下是一个示例脚本:

function exportToPDF() {    
  var url = "https://docs.google.com/spreadsheets/d/1oQ2zsbcCwuc_wdwgfFopRJn-5fGN3oY7L237ivxuxmM/export?exportFormat=pdf"; //add your options as you wish
  var res = UrlFetchApp.fetch(url, {headers:{"Authorization":"Bearer " + ScriptApp.getOAuthToken()},muteHttpExceptions:true});
  var newPdf = Utilities.newBlob(res.getContent(), "application/pdf", "Export.pdf")
  DriveApp.createFile(newPdf);
}