Создание нескольких файлов PDF в Google Таблицах вызывает ошибку 429

Я застрял. Я надеюсь, что кто-то нашел способ создать кучу PDF-файлов из Google Таблиц.

Я запускаю тот же отчет для списка компаний и создаю снимки каждого отчета в формате 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);
}

person Avid    schedule 05.12.2017    source источник


Ответы (2)


Ошибка 429 означает слишком много запросов. Тогда очевидным решением будет замедлить выполнение запроса, создав временную задержку между вызовами, используя сон (). Это было продемонстрировано в этом сообщении SO.

person noogui    schedule 06.12.2017

Я пробовал что-то похожее на экспоненциальный откат, и это сработало. для меня.

 var i = 0 
 {
 i++ ;
 Utilities.sleep(i*1000);
 }
person Alexander Pedersen    schedule 04.03.2021
comment
Добро пожаловать в сообщество Stack Overflow, мистер Педерсен! Ознакомьтесь с этим руководством для новых пользователей! - person johnDanger; 04.03.2021