Google Apps 脚本 - 将所有工作表单独导出为 PDF

Google Apps Script - EXPORT all sheets INDIVIDUALLY to PDF

我已经根据我的要求修改了以下脚本,但出于某种原因,它总是在我的传播 sheet 的第 5 或第 6 之后终止,无论 sheet 的内容是什么 sheet 实际上是......任何人都可以发现错误或改进脚本以使其稳定运行吗?

这是我收到的错误消息:

费勒
异常: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();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }
    // Get array of all sheets in spreadsheet
  var sheets = ss.getSheets();
  
  // Loop through all sheets, generating PDF files.
  for (var i=0; i<sheets.length; i++) {
    var sheet = sheets[i];
    
    // If provided a optSheetId, only save it.
    if (optSheetId && optSheetId !== sheet.getSheetId()) continue; 
    
    //export parameters
    var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf
        + '&gid=' + sheet.getSheetId()   //the sheet's Id
        // following parameters are optional...
        + '&size=A4'      // paper size
        + '&portrait=true'    // orientation, false for landscape
        + '&scale=4'          // 1= Normal 100% / 2= Fit to width / 3= Fit to height / 4= Fit to Page
        + '&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 blob = response.getBlob().setName(ss.getName() + ' - ' + sheet.getName() + '.pdf');
    //the pdf is named according to the sheet - this is important for me!

  }
}

当我看到你的脚本时,我担心以下情况。

  1. 连续请求使用 UrlFetchApp.fetch
  2. 电子表格中可能包含隐藏的工作表。

当这些点体现在你的脚本中,就变成了下面这样。

修改后的脚本:

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();
  if (parents.hasNext()) {
    var folder = parents.next();
  } else {
    folder = DriveApp.getRootFolder();
  }
  var sheets = ss.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    var sheet = sheets[i];

    var isSheetHidden = sheet.isSheetHidden(); // <--- Added
    if (isSheetHidden) continue; // <--- Added

    if (optSheetId && optSheetId !== sheet.getSheetId()) continue;
    var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf
      + '&gid=' + sheet.getSheetId()   //the sheet's Id
      + '&size=A4'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&scale=4'          // 1= Normal 100% / 2= Fit to width / 3= Fit to height / 4= Fit to Page
      + '&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 = { muteHttpExceptions: true, headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() } }
    var response = UrlFetchApp.fetch(url + url_ext, options);
    var blob = response.getBlob().setName(ss.getName() + ' - ' + sheet.getName() + '.pdf');

    Utilities.sleep(5000); // <--- Added

  }
}
  • 请通过测试此脚本,根据您的实际情况调整5000 of Utilities.sleep(5000)

参考文献: