Google脚本UrlFetchApp.fetch会在页面存在时返回404事件

时间:2015-09-09 10:49:07

标签: google-apps-script google-docs

我正在使用Google电子表格和Google脚本发送自动报告。

到目前为止它完美运作。但不知何故,当我尝试创建一个要通过电子邮件发送的新报告时,“UrlFetchApp.fetch”函数返回404.当我尝试复制旧报告时,也发生了同样的情况。

“UrlFetchApp.fetch”行给出了这个错误:

  

https://docs.google.com/spreadsheets/d/1qm_bCKn4MbLKy7AIuIeu7bTZcTk8ObYBln0GAxwfsX8/pub?gid=195635557&single=true&output=pdf返回的代码404请求失败。截断的服务器响应

似乎我不是唯一一个遇到此问题的人,但我找不到任何解决办法。

以下是代码:

function emailSpreadsheetAsCSV() {
  var ss = SpreadsheetApp.openById("1qm_bCKn4MbLKy7AIuIeu7bTZcTk8ObYBln0GAxwfsX8");
  var url = ss.getUrl();
  url = url.replace(/edit$/,'');     
  var token = ScriptApp.getOAuthToken();
  var sheets = ss.getSheets(); 
  //make an empty array to hold your fetched blobs  
  var blobs = [];
  for (var i=0; i<sheets.length; i++) {
      var response = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/d/1qm_bCKn4MbLKy7AIuIeu7bTZcTk8ObYBln0GAxwfsX8/pub?gid=195635557&single=true&output=pdf", {
        headers: {
          'Authorization': 'Bearer ' +  token
        },
        'muteHttpExceptions': false
      });
    //convert the response to a blob and store in our array
    blobs[i] = response.getBlob().setName(sheets[i].getName() + '.csv');
  }
  //create new blob that is a zip file containing our blob array
  var zipBlob = Utilities.zip(blobs).setName(ss.getName() + '.zip');     
return blobs[0];       
}

非常感谢你的帮助。

艾默里克。

3 个答案:

答案 0 :(得分:2)

我也遇到了这个问题,经过一些研究,Spence Easton(问题34573295)解决了我的问题。我只是将这个伪造的调用添加到驱动器中,因此授予访问权限,因此脚本现在可以访问您的文件。 在尝试抓取网址之前将其添加到顶部附近:

var bogus = DriveApp.getRootFolder();

现在它运行良好,没有404错误。

答案 1 :(得分:0)

您使用“pub”网址,因此您确定电子表格是在网上发布的吗?如果您获得404,则表示该页面未发布。 如果文件被公布,则不需要持票人,因为它现在是公开的。

在我不理解您的代码后,因为您迭代了文件的所有工作表

for (var i=0; i<sheets.length; i++)

但你的urlfetch中的url的参数“gid”(pub?gid = 195635557&amp; single = true&amp; output = pdf)是否已修复?

第二点,您将文件作为pdf并在创建csv后生成?

为什么不直接将文件作为csv:https://docs.google.com/spreadsheets/export?id=TheIdOfTheFile&exportFormat=csv

通过调整此代码,您可以直接获取csv,请参阅:https://stackoverflow.com/a/28503601/3556215

注意你会得到第一页而不是其他页面。

斯特凡

答案 2 :(得分:0)

尝试:

var response = UrlFetchApp.fetch(url, options);
var result = JSON.parse(res.getContentText());