1

我被困住了。我希望有人想出一种方法来生成一堆PDF 的Google Sheets

我为公司列表运行相同的报告,并为保存在 Drive 中的每个报告生成 PDF 快照。每次我都会收到429 错误,唯一的区别是在收到错误之前我生成了多少PDF 。

生成的 PDF 的数量与我在Utilities.sleep函数中输入的时间直接相关,但仍然只是报告总数的一小部分(即更多的睡眠 =在错误之前生成 的PDF稍微多一些)。

我已经多次尝试使用指数退避,但我的尝试都是徒劳的。

感谢您对如何避免以下 429 的任何见解:

Request failed for docs.google.com/a/[redacted]/spreadsheets/d/[redacted]/… returned code 429. Truncated server response: <!DOCTYPE html><html lang="en"><head><meta name="description" content="Web word processing, presentations and spreadsheets"><meta name="viewport" c... (use muteHttpExceptions option to examine full response

以下是相关代码:

var foldersave = DriveApp.createFolder('New Reports').getId()
var request = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken(), muteHttpExceptions: true}};

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var gid = sheet.getSheetId();

var values = ss.getActiveSheet().getRange(2, 8, sheet.getLastRow()-1, 1).getValues();

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

//set up the new report
var org = sheet.getRange(5,4);
org.setValue(values[i])

//set the PDF parameters
var pdfOpts = '&size=0&fzr=false&portrait=true&fitw=true&gridlines=false&printtitle=false&sheetnames=false&pagenum=CENTER&attachment=false&gid='+gid;
var printRange = '&c1=0' + '&r1=0' + '&c2=4' + '&r2=42'; 
var url = ss.getUrl().replace(/edit$/, '') + 'export?format=pdf' + pdfOpts + printRange;

//create the PDF
var response = UrlFetchApp.fetch(url, request).getBlob().setName(values[i] + ".pdf"); 
var dir = DriveApp.getFolderById(foldersave); 
var file = dir.createFile(response);
Utilities.sleep(5000);
}
4

2 回答 2

2

429 错误意味着请求过多。显而易见的解决方案是通过使用sleep()在调用之间创建时间延迟来减慢请求。这已在此SO 帖子中进行了演示。

于 2017-12-06T13:06:05.567 回答
1

我尝试了类似于指数退避的方法,它对我有用。

 var i = 0 
 {
 i++ ;
 Utilities.sleep(i*1000);
 }
于 2021-03-04T16:42:57.443 回答