当我使用UrlFetchApp将电子表格导出为PDF时,我一直收到 404 - 请求的实体未找到响应。如果我将相同的URL放入浏览器,则PDF下载会正确启动。
如何让这个示例脚本工作?
这是一个示例PDF导出网址,用于简单的共享(只读)电子表格:https://docs.google.com/spreadsheets/d/133KPZyxAATG3AAY9iCSFWabefyFvQnENkHh0dyqh7MI/export?exportFormat=pdf&format=pdf&gid=0&size=letter&portrait=true&fitw=true&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&fzr=false
如果您在浏览器中单击该URL,它将获取PDF Blob,这通常会启动浏览器的文件下载对话框。 (这是公开表,但在生产中,表是私有的。)
function notFunctioning() {
var options = {
headers: {
Authorization:"Bearer "+ScriptApp.getOAuthToken()
},
muteHttpExceptions : true /// Get failure results
}
url = "https://docs.google.com/spreadsheets/d/133KPZyxAATG3AAY9iCSFWabefyFvQnENkHh0dyqh7MI/export?exportFormat=pdf&format=pdf&gid=0&size=letter&portrait=true&fitw=true&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&fzr=false";
var response = UrlFetchApp.fetch(url, options);
var status = response.getResponseCode();
var result = response.getContentText();
debugger; // status:404 8'(
}
结果字符串的内容是:
抱歉,您请求的文件不存在。
确保您拥有正确的网址,并且该文件的所有者未将其删除。
当然,文件确实存在,等等。我假设有一些我错过的身份验证或授权步骤。请注意,此代码与Convert all sheets to PDF with Google Apps Script中的代码基本相同,Issue 5417曾一次使用 ...
报告的Google Docs editors URL format change与Execution API有关,但由于它还涉及文件传输和Google的网址,因此我认为其中包含的建议可能适用。这个建议(不是来自谷歌)是为了确保"脚本与您用于身份验证的同一个Google Developer控制台项目相关联。"我创建了一个新的开发控制台项目,并更改了Apps脚本应用程序以使用它。虽然这触发了一个新的授权周期,但它并没有最终修复 404 - 未找到请求的实体。
一年前宣布了jvm。我使用的是消费者帐户,而不是域帐户,因此似乎不适用。此外,该脚本从那时起一直有效。 (不过,我想知道是否影响事情,以及浏览器是否被重定向而GAS服务器不是。)
答案 0 :(得分:0)
虽然此技术不直接使用高级云端硬盘服务,但脚本通过其网址访问您的Google云端硬盘文件所需的权限。< / p>
note上的Issue 3579: Converting spreadsheet as PDF fails with new Sheets提供了提示:
请注意,只有当云端硬盘或云端硬盘驱动器出现在脚本中的某个位置时,该解决方案才有效,以便驱动器OAuth范围得到请求并可以传递。检查以确保所有脚本都适用。
添加包含DriveApp函数调用的虚函数就足够了:
/**
* Dummy function for API authorization only.
*/
function forAuth_() {
DriveApp.getFileById("Just for authorization"); // https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579#c36
}
然后启用Advanced Drive Service到“资源&gt;高级驱动器服务...”和开发者控制台。 (有关详细信息,请参阅this。)
在我的情况下,我有一个已经工作的脚本,然后停止了。我相信当我最初编写脚本时,我试图使用高级驱动器服务导出链接(which don't work,顺便说一句),所以我一直在启用该服务。但是最近,由于其他更改,我不得不重新授权脚本,我认为同时删除了Drive的授权。