将工作表另存为单独的PDF:“在发出API请求时,必须包含API令牌。”

时间:2016-09-04 23:14:04

标签: google-apps-script google-sheets

在Google表格中,我想将工作簿中的每个工作表另存为单独的PDF。我在Google Docs Help forum

上找到了以下脚本
function saveSheetsAsPDF() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var url = ss.getUrl().replace(/edit$/,'');
  var parents = DriveApp.getFileById(ss.getId()).getParents();
  if (parents.hasNext()) {var folder = parents.next();}
  else {folder = DriveApp.getRootFolder();}
  var sheets = ss.getSheets();
  for (var i=0; i<sheets.length; i++) {
    var url_ext = 'export?exportFormat=pdf&format=pdf&gid=' + sheets[i].getSheetId()
    +'&size=letter&portrait=true&fitw=true&sheetnames=false'
    +'&printtitle=false&pagenumbers=false&gridlines=false&fzr=false';
    var options = {headers:{'Authorization':'Bearer '+ScriptApp.getOAuthToken()}}
    var response = UrlFetchApp.fetch(url + url_ext, options);
    var blob = response.getBlob().setName(ss.getName()+' - '+sheets[i].getName()+'.pdf');
    folder.createFile(blob);
  }
};

此脚本有效 - 但仅适用于工作簿中的前六个工作表。将第六张纸保存为PDF后,将返回以下错误:

<?xml version="1.0" encoding="UTF-8"?> <intervals personid=""
 status="Unauthorized" code="401"><error><code>9</code><message>User
 bad auth</message><verbose><item>You must include your API token when
 making API requests.</item></verbose></error></intervals>

我很困惑为什么它适用于六张纸,然后停止。

想法?

2 个答案:

答案 0 :(得分:1)

您可以使用其他策略,只需打开工作表,将其复制到新的(临时)电子表格,然后将其导出为pdf。 这里使用了类似的策略:https://gist.github.com/ixhd/3660885

警告:此代码已过时,您需要使用DriveApp而不是DocsList以及其他一些调整,但您可以使用它来了解您需要遵循的常规流程。

答案 1 :(得分:0)

解决:显然,这个 是一个“太多的请求”问题,正如@Will所建议的那样。我在循环结束时添加了以下延迟:

Utilities.sleep(6000);

现在,脚本将把工作簿中的所有17个工作表保存为单独的PDF。我不知道有多少请求在什么时期“太多”,但是6秒的延迟解决了这个问题(3秒的延迟还不够)。

全部谢谢你的意见。