UrlFetch从电子表格网址

时间:2016-05-10 20:45:38

标签: google-apps-script google-sheets http-error

当我使用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服务器不是。)

1 个答案:

答案 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的授权。