在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>
我很困惑为什么它适用于六张纸,然后停止。
想法?
答案 0 :(得分:1)
您可以使用其他策略,只需打开工作表,将其复制到新的(临时)电子表格,然后将其导出为pdf。 这里使用了类似的策略:https://gist.github.com/ixhd/3660885
警告:此代码已过时,您需要使用DriveApp而不是DocsList以及其他一些调整,但您可以使用它来了解您需要遵循的常规流程。
答案 1 :(得分:0)
解决:显然,这个 是一个“太多的请求”问题,正如@Will所建议的那样。我在循环结束时添加了以下延迟:
Utilities.sleep(6000);
现在,脚本将把工作簿中的所有17个工作表保存为单独的PDF。我不知道有多少请求在什么时期“太多”,但是6秒的延迟解决了这个问题(3秒的延迟还不够)。
全部谢谢你的意见。