我正在尝试检索电子表格的pdf。每当我尝试时,我都会收到以下错误:
如果我在登录时点击上述网址,则会下载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错误。
答案 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);
}