Google脚本错误:openById发生意外错误

时间:2020-09-01 02:59:48

标签: google-apps-script triggers google-drive-api google-sheets-api

我正在制作一个自动化系统,它将Google电子表格转换为PDF文件并保存在我的Google驱动器中。 我知道此脚本可在我的项目页面上成功运行,但不适用于触发器。 我该如何解决这个问题?

在5:39行出现了错误消息。 在这里

  var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();

请帮助我!

function savePDFs( optSSId, optSheetId ) {

  // If a sheet ID was provided, open that sheet, otherwise assume script is
  // sheet-bound, and open the active spreadsheet.
  var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();

  // Get folder containing spreadsheet, for later export
  var parents = DriveApp.getFileById(ss.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

  //additional parameters for exporting the sheet as a pdf
  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      // Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
      + (optSheetId ? ('&gid=' + sheet.getSheetId()) : ('&id=' + ss.getId()))

      // 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("https://docs.google.com/spreadsheets/" + url_ext, options);
  var blob = response.getBlob().setName(ss.getName() + '.pdf');

  //from here you should be able to use and manipulate the blob to send and email or create a file per usual.
  //In this example, I save the pdf to drive
  folder.createFile(blob);

}

2 个答案:

答案 0 :(得分:0)

在Google Apps脚本中,触发器将事件对象传递给它们所调用的函数。

如果触发器直接调用savePDFs函数,则将事件对象分配给optSSId。由于这不是字符串,因此可能是问题的原因。

代替直接调用savePDFs,将触发器设置为调用另一个函数,然后进行此功能调用savePDFs,而不传递任何变量。即:

function respondToTimeDrivenTrigger(e){
  savePDFs();
}

答案 1 :(得分:0)

如果传递给id的{​​{1}}不正确(有时没有原因),

openById发生意外错误

使用openById()时会抛出

如果脚本已绑定,则可以使用SpreadsheetApp.openById()