生成 PDF 时截断服务器响应
Truncated Server Response while generating PDFs
我有一个脚本可以将我的所有工作表导出为单独的 PDF 文档并放入名为 Invoices 的文件夹中,但是它创建了 6 个文档,之后我得到了下面的错误代码,这已经在Gsuite 帐户也出现了同样的错误:
Exception: Request failed for https://docs.google.com returned code 429. Truncated server response: <meta name="viewport" c... (use muteHttpExceptions option to examine full response)
function savePDFs( optSSId, optSheetId ) {
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
var url = ss.getUrl().replace(/edit$/,'');
var parents = DriveApp.getFileById(ss.getId()).getParents();
var folders = DriveApp.getFoldersByName('Invoices');
var folder = folders.hasNext() ? folders.next() : parents.next();
var sheets = ss.getSheets();
for (var i=0; i<sheets.length; i++) {
var sheet = sheets[i];
if (optSheetId && optSheetId !== sheet.getSheetId()) continue;
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
+ '&gid=' + sheet.getSheetId() //the sheet's Id
// following parameters are optional...
+ '&size=letter' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true' // fit to width, false for actual size
+ '&sheetnames=false&printtitle=false&pagenumbers=false' //hide optional headers and footers
+ '&gridlines=false' // hide gridlines
+ '&fzr=false'; // do not repeat row headers (frozen rows) on each page
var options = {headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}}
var response = UrlFetchApp.fetch(url + url_ext, options);
var valor = sheet.getRange('D5').getValue(); // Modified
var blob = response.getBlob().setName(valor + '.pdf');
folder.createFile(blob);
}
}
有什么想法吗?
如果执行时间是一个重要因素,请参阅我的非常长的答案和更复杂的解决方法
更容易解决的问题:
在我上面 link 答案的底部,您会看到我能够延迟函数的递归部分以从中提取任意数量的 PDF 的秒数的引用a sheet 在 8 秒无限期地结束,因此您需要做的就是在 for 循环的末尾将以下代码添加到您的代码中:
Utilities.sleep(8000)
整个代码为:
function savePDFs( optSSId, optSheetId ) {
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
var url = ss.getUrl().replace(/edit$/,'');
var parents = DriveApp.getFileById(ss.getId()).getParents();
var folders = DriveApp.getFoldersByName('Invoices');
var folder = folders.hasNext() ? folders.next() : parents.next();
var sheets = ss.getSheets();
for (var i=0; i<sheets.length; i++) {
var sheet = sheets[i];
if (optSheetId && optSheetId !== sheet.getSheetId()) continue;
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
+ '&gid=' + sheet.getSheetId() //the sheet's Id
// following parameters are optional...
+ '&size=letter' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true' // fit to width, false for actual size
+ '&sheetnames=false&printtitle=false&pagenumbers=false' //hide optional headers and footers
+ '&gridlines=false' // hide gridlines
+ '&fzr=false'; // do not repeat row headers (frozen rows) on each page
var options = {headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}}
var response = UrlFetchApp.fetch(url + url_ext, options);
var valor = sheet.getRange('D5').getValue(); // Modified
var blob = response.getBlob().setName(valor + '.pdf');
folder.createFile(blob);
Utilities.sleep(8000);
}
}
我发现了另一个解决方法,它对我的情况非常有效,而且比 Utilities.sleep 方法快得多。
我最后做的是使用 try and catch 结构。
在每个语句下,我添加了相同的函数来生成 pdf。像这样的东西:
try{
var pdf = generatePDF(sheet);
} catch(e){
var pdf = generatePDF(sheet);
}
所以最终发生的是,如果您收到 429 错误,代码将再次尝试 运行 generatePDF 函数,并且该过程将花费足够的时间,因此您不会收到请求过多 再次留言。
我有一个脚本可以将我的所有工作表导出为单独的 PDF 文档并放入名为 Invoices 的文件夹中,但是它创建了 6 个文档,之后我得到了下面的错误代码,这已经在Gsuite 帐户也出现了同样的错误:
Exception: Request failed for https://docs.google.com returned code 429. Truncated server response: <meta name="viewport" c... (use muteHttpExceptions option to examine full response)
function savePDFs( optSSId, optSheetId ) {
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
var url = ss.getUrl().replace(/edit$/,'');
var parents = DriveApp.getFileById(ss.getId()).getParents();
var folders = DriveApp.getFoldersByName('Invoices');
var folder = folders.hasNext() ? folders.next() : parents.next();
var sheets = ss.getSheets();
for (var i=0; i<sheets.length; i++) {
var sheet = sheets[i];
if (optSheetId && optSheetId !== sheet.getSheetId()) continue;
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
+ '&gid=' + sheet.getSheetId() //the sheet's Id
// following parameters are optional...
+ '&size=letter' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true' // fit to width, false for actual size
+ '&sheetnames=false&printtitle=false&pagenumbers=false' //hide optional headers and footers
+ '&gridlines=false' // hide gridlines
+ '&fzr=false'; // do not repeat row headers (frozen rows) on each page
var options = {headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}}
var response = UrlFetchApp.fetch(url + url_ext, options);
var valor = sheet.getRange('D5').getValue(); // Modified
var blob = response.getBlob().setName(valor + '.pdf');
folder.createFile(blob);
}
}
有什么想法吗?
如果执行时间是一个重要因素,请参阅我的非常长的答案和更复杂的解决方法
更容易解决的问题:
在我上面 link 答案的底部,您会看到我能够延迟函数的递归部分以从中提取任意数量的 PDF 的秒数的引用a sheet 在 8 秒无限期地结束,因此您需要做的就是在 for 循环的末尾将以下代码添加到您的代码中:
Utilities.sleep(8000)
整个代码为:
function savePDFs( optSSId, optSheetId ) {
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
var url = ss.getUrl().replace(/edit$/,'');
var parents = DriveApp.getFileById(ss.getId()).getParents();
var folders = DriveApp.getFoldersByName('Invoices');
var folder = folders.hasNext() ? folders.next() : parents.next();
var sheets = ss.getSheets();
for (var i=0; i<sheets.length; i++) {
var sheet = sheets[i];
if (optSheetId && optSheetId !== sheet.getSheetId()) continue;
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
+ '&gid=' + sheet.getSheetId() //the sheet's Id
// following parameters are optional...
+ '&size=letter' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true' // fit to width, false for actual size
+ '&sheetnames=false&printtitle=false&pagenumbers=false' //hide optional headers and footers
+ '&gridlines=false' // hide gridlines
+ '&fzr=false'; // do not repeat row headers (frozen rows) on each page
var options = {headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}}
var response = UrlFetchApp.fetch(url + url_ext, options);
var valor = sheet.getRange('D5').getValue(); // Modified
var blob = response.getBlob().setName(valor + '.pdf');
folder.createFile(blob);
Utilities.sleep(8000);
}
}
我发现了另一个解决方法,它对我的情况非常有效,而且比 Utilities.sleep 方法快得多。
我最后做的是使用 try and catch 结构。 在每个语句下,我添加了相同的函数来生成 pdf。像这样的东西:
try{
var pdf = generatePDF(sheet);
} catch(e){
var pdf = generatePDF(sheet);
}
所以最终发生的是,如果您收到 429 错误,代码将再次尝试 运行 generatePDF 函数,并且该过程将花费足够的时间,因此您不会收到请求过多 再次留言。