当我复制Google工作表时脚本停止工作

时间:2019-10-03 06:58:18

标签: google-apps-script

我已经使用Google工作表创建了一个订单表单,其中包含一个脚本,可将订单的pdf通过电子邮件发送给供应商。我对其进行了测试,并且效果很好,因此将其保存到模板库中。

现在,当我从模板创建新的Google表格并运行脚本时,出现错误-TypeError:无法调用未定义的方法“ getSheetId”。

现在,如果我在刚创建的新电子表格上重复脚本并调用重复的代码,它将可以正常工作。奇怪的是,当我现在尝试调用原始代码时,它现在也可以正常工作。现在,当我删除刚创建的重复脚本时,甚至变得陌生,原始代码将再次停止工作。

我已经做过多次,并且得到了相同的结果。

有人有任何想法吗?我在这里做错了什么吗?

function emailOrder(){ // this is the function to call
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var shName = sh.getName()

  var email = sh.getRange('I8').getValue();
  var dates = sh.getRange('V8').getValue();
  var reference = sh.getRange('V5').getValue();
  var vendor = sh.getRange('B5').getValue();
  var contact = sh.getRange('B8').getValue();

  sendSpreadsheetToPdf(shName, email , vendor + ' - '+ dates + ' - ' + reference , "Hi " + contact + ", <br /> <br /> See attached order for reference: " + reference + ", <br /> <br /> Kind regards, <br />NAME<br /> PH NUMBER <br /> <br />");
};

function sendSpreadsheetToPdf(pdfName, email, subject, htmlbody) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId(); 
  var url_base = spreadsheet.getUrl().replace(/edit$/,'');
  var sheetId = spreadsheet.getActiveSheet().getSheetId();

  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

    + (('&gid=' + sheetId )) 
    // following parameters are optional...
    + '&size=A4'      // 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
    + '&top_margin=0.4&bottom_margin=0.4&left_margin=0.4&right_margin=0.4';   // Margins: set all to 0.4

  var options = {
    headers: {'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),}
  }

  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');

  if (email) {
    var mailOptions = {attachments:blob, htmlBody:htmlbody}
    MailApp.sendEmail(
    email, 
    subject, 
    "html content only", 
    mailOptions);
  }
}

1 个答案:

答案 0 :(得分:0)

有两种类型的Apps脚本文档-Standalone脚本和Bound脚本。

  • 独立脚本未绑定到特定文档,而是与文档分开打开和调用。因此,如果要在独立脚本中调用电子表格或表格,则需要打开电子表格by id或url和表格by name

  • 绑定脚本绑定到特定文档广告,它们可以使用SpreadsheetApp.getActiveSpreadsheet()spreadsheet.getActiveSheet()调用绑定的电子表格及其工作表。从技术上讲,绑定脚本与https://www.google.com/script/分开调用。但是,如果绑定的电子表格未打开或多次打开,则这样做可能导致错误。相反,应该通过Tools->Script Editor从绑定文档的UI中打开绑定脚本。 Goog的做法是,在调用脚本之前,仅打开电子表格的一个版本,最近一次。否则,确定活动电子表格和工作表可能会导致错误。