【问题标题】:Script stops working when I duplicate a google sheet当我复制谷歌表格时脚本停止工作
【发布时间】:2019-10-03 06:58:18
【问题描述】:

我使用谷歌表格创建了一个订单表格,其中包含一个脚本,用于通过电子邮件将订单的 pdf 文件发送给供应商。我对其进行了测试,它工作得非常好,所以我将它保存到模板库中。

现在,当我从模板创建一个新的 google Sheet 并运行脚本时,我收到一个错误 - TypeError: Cannot call method "getSheetId" of undefined。

现在,如果我在刚刚创建的新电子表格上复制脚本并调用复制的代码,它就可以工作。奇怪的是,当我现在尝试调用原始代码时,它现在也可以工作了。更奇怪的是,当我现在删除我刚刚制作的重复脚本时,原始代码再次停止工作。

我已经多次这样做了,我得到了相同的结果。

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

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

【问题讨论】:

  • 您能解释一下“当我从模板创建新订单并运行脚本时”吗?你的意思是你创建了一个新的电子表格,但是你调用了附加到旧电子表格的脚本?
  • 是的,我的意思是当我从模板创建一个新的电子表格时。感谢您抽出宝贵的时间。我将尝试制作独立脚本而不是绑定脚本。我对 Google Apps 脚本还很陌生,所以只能摸索。
  • 我宁愿建议您从电子表格的 UI 创建一个绑定脚本。然后,当您复制电子表格时,我会在您的驱动器上制作副本 - 脚本也应自动复制。
  • 这就是我目前正在做的事情。这是一个绑定脚本,所以当我复制工作表时,脚本也会被复制。

标签: google-apps-script


【解决方案1】:

有两种类型的 Apps Script 文档 - Standalone scripts 和 Bound scripts。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多