6

我编写了一个脚本,在本机电子表格中使用时效果很好。我现在正尝试将它作为附加组件发布,并且发现它不起作用onEdit(e),何时工作正常。onOpen(e)onInstall(e)

我查看了有关授权模式和安装/启用附加组件的文档,但我认为我可能缺少一些东西(希望是直截了当的),因为我是初学者。我应该以不同的方式调用函数吗?还是放置的onEdit?任何帮助表示赞赏。谢谢!!

function setup() {
  var ui = SpreadsheetApp.getUi();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Send Auto Emails');

  try {ss.setActiveSheet(ss.getSheetByName('Send Auto Emails'));}
  catch (e) {ss.insertSheet('Send Auto Emails', 0);}

  sheet.getRange(1, 1).setValue('Recipient Email Address');   

  //etc...
}

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = e.source.getActiveSheet();
  var range = e.source.getActiveRange();

  if (range.getA1Notation() == "C1" | range.getA1Notation() == "D1" |     range.getA1Notation() == "E1" && sheet.getName() == "Send Auto Emails") {
    Browser.msgBox(
      'Alert',
      'Feel free to change the title here to something more relevant to you.  But be aware, if you would like to use an optional item, please make sure you are referencing it in your email message exactly as it appears here, wrapped in < and >. Example: <Optional Item 1>.',
      Browser.Buttons.OK
    );
  }
  if (range.getA1Notation() == "J4" && sheet.getName() == "Send Auto     Emails") {
    Browser.msgBox(
      'Alert',
      'Only add the email message body.  "Hello, Recipient Name" and "Best, Your Name" will be automatically added.  If you would like to use Optional Items in this message, see the example text to make sure you are using them the right way.',
      Browser.Buttons.OK
    );
  }

  if (range.getA1Notation() == "A2") {
    ss.toast("Your data in column A must not be separated by any blank rows. Any data after a blank row will be ignored.", "Be aware", 90);
  }
}

function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('BulkEmail beta')
      .addItem('1. Sheet Setup', 'setup')
      .addItem('2. Send Emails', 'sendEmails')
      .addToUi();
  onEdit(e);
}

function onInstall(e) {
  onOpen(e);
}

编辑 1

我尝试创建一个可安装的触发器而不是使用 simple onEdit,但仍然无济于事。

function createonEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger('installableonEdit')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}

function installableonEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = e.source.getActiveSheet();
  var range = e.source.getActiveRange();

  try {
    if (range.getA1Notation() == "C1" | range.getA1Notation() == "D1" | range.getA1Notation() == "E1" && sheet.getName() == "Send Auto Emails") {
      Browser.msgBox(
        'Alert',
        'Feel free to change the title here to something more relevant to you.  But be aware, if you would like to use an optional item, please make sure you are referencing it in your email message exactly as it appears here, wrapped in < and >. Example: <Optional Item 1>.',
        Browser.Buttons.OK
      );
    }
    if (range.getA1Notation() == "J4" && sheet.getName() == "Send Auto Emails") {
      Browser.msgBox(
        'Alert',
        'Only add the email message body.  "Hello, Recipient Name" and "Best, Your Name" will be automatically added.  If you would like to use Optional Items in this message, see the example text to make sure you are using them the right way.',
        Browser.Buttons.OK
      );
    }

    if (range.getA1Notation() == "A2") {
      ss.toast("Your data in column A must not be separated by any blank rows. Any data after a blank row will be ignored.", "Be aware", 90);
    }
  } catch(err) {
    var errMsg = 'There was an error: ' + err +
        + " \n \n" +
        'from the: onEdit function ' +
        + " \n \n" +
        'The call stack is: ' + err.stack;

    GmailApp.sendEmail('elisabeth@groupon.com', "error", errMsg);
  }
}
4

2 回答 2

1

您的onOpen()触发器正在运行onEdit()触发器。 opOpen()安装并启用附加组件时在 AuthMode.LIMITED 中运行。

本文档中,它指出:

一种允许访问有限服务子集的模式 (LIMITED)。当绑定到文档的附加组件或脚本执行 onOpen(e) 或 onEdit(e) 简单触发器时,会出现此 (LIMITED) 模式,但为 NONE 描述的情况除外。

您正在运行一个onOpen()简单的触发器,并且它在 LIMITED 模式下运行,因为它在一个附加组件中。

所以,那部分,我很确定。

我相信您能做的就是创建一个可安装的编辑触发器,并在 FULL 模式下运行。所以,这就是我要尝试的方法,摆脱简单的触发器,并安装一个带有ScriptApp.

在文档中,它指出:

他们(一个简单的触发器)无法访问需要授权的服务。例如,简单触发器无法发送电子邮件,因为 Gmail 服务需要授权,但简单触发器可以使用匿名的语言服务翻译短语。

谷歌文档

因此,该try/catch包括发送一封电子邮件,这将使onEdit()简单的触发器停止工作。

在您的代码中添加try/catch,如果出现错误,请给自己发送一封电子邮件。

function onEdit(e) {try{
  //Code Here

} catch(err) {
  var errMsg = 'There was an error: ' + err +
      + " \n \n" +
      'from the: onEdit function ' +
      + " \n \n" +
      'The call stack is: ' + err.stack;

  GmailApp.sendEmail('yourEmail@gmail.com', "Subject", errMsg);
};
于 2016-01-16T00:47:38.470 回答
0

一个可能的原因是您“测试为附加组件”

https://developers.google.com/gsuite/add-ons/how-tos/testing-editor-addons#testing_details

测试时不支持可安装触发器。依赖于可安装触发器的功能是不可测试的。

但有趣的是,它适用于绑定脚本。

这让我困惑了好一阵子。因此,解决方案是当您需要测试可安装触发器时,只需使用绑定文档即可。

如果它有效,附加组件的触发器也将有效。

对于其他事情,您可以执行“作为附加组件测试”

于 2019-07-30T11:04:25.790 回答