在Google Apps脚本中,无法以编程方式创建触发器以从onEdit触发器

时间:2016-04-24 17:31:09

标签: javascript google-apps-script triggers google-sheets

我正在尝试使用onEdit触发器发送电子邮件。我知道它默认不起作用,如下所述:

  

因为简单的触发器会自动触发,而不会询问用户   对于授权,它们受到几个限制:它们   无法访问需要授权的服务。例如,a   简单的触发器无法发送电子邮件,因为Gmail服务需要   授权,但一个简单的触发器可以翻译一个短语   语言服务,这是匿名的。

但是我想我可以使用onEdit事件以编程方式创建另一个时间驱动的触发器,而后者又会发送电子邮件。我知道两者(1)我的onEdit触发器都在它自己的工作,以及(2)手动运行该函数以编程方式创建时间驱动的触发器来发送电子邮件,自己工作。但是当我把2放在1里面时,它不起作用。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssName = ss.getName();
var budgetLeft = ss.getRange("Test!B1").getValue();
var emailAddress = ss.getRange("Test!B4").getValue();

if (budgetLeft <= 4860) {
  function SendEmailOnTrigger() {
    MailApp.sendEmail({
      to: emailAddress,
      subject: "Warning: " + ssName,
      htmlBody: "Sample Message",

   });
 }
}

function onEdit(e){
      function createTimeDrivenTriggersTest() {
      // Trigger TEST.
      ScriptApp.newTrigger('SendEmailOnTrigger')
      .timeBased()
      .everyMinutes(1)
      .create();
}
}

它是否“知道”将要创建的时间驱动触发器将发送电子邮件,这在使用简单触发器启动时是不可接受的?这就是为什么它不起作用?提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

正如Sandy Good所解释的那样,可安装触发器从创建它们的进程继承授权。如果它是由您手动运行onEdit函数创建的,那么onEdit就像您一样,可以创建一个充当您的触发器。但是,如果一个函数是由一个简单的触发器执行的,那么它只被授权修改它所绑定的电子表格,而不执行任何其他操作。

要了解为什么需要这样做,想象一下,当您使用绑定脚本打开某人的共享电子表格时,该脚本中的onOpen函数会安装触发器,该触发器会定期将您的电子邮件转发到其他位置。

因此,只需使用可安装的on-edit触发器而不是简单的触发器。

答案 1 :(得分:1)

以下是Google开发人员如何描述实现我打算实现目标的好方法:https://youtu.be/U9Ej6PCeO6s?t=2578

Make OnOpen创建一个菜单项,单击该菜单项将创建所需的触发器。此菜单项将复制到文件的副本中,因此只需单击菜单项即可使其生效。