【问题标题】:UrlFetch getting 404 error from spreadsheet URLUrlFetch 从电子表格 URL 获取 404 错误
【发布时间】:2016-09-06 00:43:14
【问题描述】:

当我使用 UrlFetchApp 将电子表格导出为 PDF 时,我一直收到 404 - Requested entity not found 响应。如果我将相同的 URL 放入浏览器,PDF 下载会正确启动。

我该怎么做才能让这个示例脚本正常工作?

这是一个 PDF 导出 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

如果您在浏览器中单击该 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'(
}

结果字符串的内容是:

抱歉,您请求的文件不存在。

确保您拥有正确的 URL 并且文件的所有者没有删除它。

当然,文件确实存在,等等。我假设我错过了一些身份验证或授权步骤。请注意,此代码与 Convert all sheets to PDF with Google Apps Script 中的代码基本相同,曾在此工作过......

调查:

  • 据报道,Issue 5417 与 Execution API 相关,但由于它还涉及文件传输和 Google 的 URL,我认为它包含的建议可能适用。该建议(不是来自 Google,请注意)是为了确保“脚本与您用于身份验证的同一 Google Developer 控制台项目相关联”。我创建了一个新的开发控制台项目,并更改了 Apps Script 应用程序以使用它。虽然这触发了新的授权周期,但它最终并没有修复 404 - 未找到请求的实体

  • 一年前宣布了Google Docs editors URL format change。我使用的是消费者帐户,而不是域帐户,所以这似乎不适用。此外,该脚本自那时以来一直有效。 (不过,我想知道它是否确实会影响某些事情,以及浏览器是否被重定向而 GAS 服务器没有。)

【问题讨论】:

  • @sandwich 不幸的是,非公开表格不会出现这种情况。 (为了这个问题,我把它公开了。)

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


【解决方案1】:

虽然此技术不直接使用高级驱动器服务,但脚本通过其 URL 访问您的 Google Drive 文件需要这些权限

Issue 3579: Converting spreadsheet as PDF fails with new Sheets 上的 note 提供了提示:

请记住,该解决方案仅在 Drive 或 DriveApp 出现在脚本中的某个位置时才有效,以便请求 Drive 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
}

然后通过“Resources > Advanced Drive Services...”和开发者控制台启用Advanced Drive Service。 (有关更多信息,请参阅this。)


就我而言,我有一个脚本一直在工作,然后就停止了。我相信当我最初编写脚本时,我曾尝试使用高级驱动器服务导出链接(which don't work,顺便说一句),所以我已经启用了该服务。但最近,由于其他更改,我不得不重新授权脚本,我认为同时删除了对云端硬盘的授权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多