【问题标题】:Creating Multiple Google Sheets PDFs throws 429 error创建多个 Google 表格 PDF 会引发 429 错误
【发布时间】:2018-05-18 19:15:32
【问题描述】:

我被困住了。我希望有人已经找到了一种方法,可以从 Google 表格 中生成一堆 PDF

我为公司列表运行相同的报告,并为保存在云端硬盘中的每个报告生成 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);
}

【问题讨论】:

  • 文本错误应该添加到问题中。该问题还应包括minimal reproducible example。无论如何,我认为发生错误是因为与您尝试获取的某些文件有关。见Debugging external host communication with UrlFetchApp
  • 谢谢,我已根据您的建议更新了问题。由于所有文件几乎相同,并且错误在 x 报告后随机传播,因此错误似乎与 x 的某些未记录的速率限制有关。

标签: pdf google-apps-script google-sheets urlfetch http-status-code-429


【解决方案1】:

我尝试了类似于exponential backoff 的方法,它对我有用。

 var i = 0 
 {
 i++ ;
 Utilities.sleep(i*1000);
 }

【讨论】:

  • 欢迎来到 Stack Overflow 社区 Pedersen 先生!新用户请查看guide
【解决方案2】:

429 error 表示请求过多。显而易见的解决方案是通过使用sleep() 在调用之间创建时间延迟来减慢请求。这已在SO post 中进行了演示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2022-01-21
    • 2014-06-13
    • 2018-06-26
    • 1970-01-01
    • 2013-07-18
    • 2011-01-19
    相关资源
    最近更新 更多