【问题标题】:Truncated Server Response while generating PDFs生成 PDF 时截断服务器响应
【发布时间】:2020-10-31 20:01:50
【问题描述】:

我有一个脚本,可以将我的所有工作表导出到单独的 PDF 文档到名为 Invoices 的文件夹中,但是它正在创建 6 个文档,之后我收到下面的错误代码,这已在 Gsuite 帐户上尝试过我也遇到了同样的错误:

异常:https://docs.google.com 的请求失败,返回代码 429。截断的服务器响应:

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);
  }
}

有什么想法吗?

【问题讨论】:

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


【解决方案1】:

如果执行时间是一个重要因素here

更简单的解决方法:

在上面链接中我的答案的底部,您将看到对我能够延迟函数的递归部分以在 8 秒内无限期地从工作表中提取任意数量的 PDF 的秒数的引用,所以您需要做的就是在 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);
  }
}

【讨论】:

  • 因为执行时间不是什么大问题,所以这样做了,这是一个非常好的解决方案,可以轻松添加,谢谢 Rob
【解决方案2】:

我发现另一种解决方法在我的情况下效果很好,它比 Utilities.sleep 方法快得多。

我最终做的是使用 try and catch 结构。 在每条语句下,我添加了相同的函数来生成 pdf。像这样的东西:

    try{
        var pdf = generatePDF(sheet);
      } catch(e){
        var pdf = generatePDF(sheet);
      }

所以最终发生的情况是,如果您收到 429 错误,代码将再次尝试运行 generatePDF 函数,并且该过程将花费足够的时间,因此您不会收到太多的请求 再次留言。

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2020-05-05
    • 2021-12-20
    • 1970-01-01
    • 2015-10-27
    • 2021-05-21
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多