Javascript 在谷歌应用程序脚本中,可以';t以编程方式创建触发器以从onEdit触发器发送电子邮件

Javascript 在谷歌应用程序脚本中,可以';t以编程方式创建触发器以从onEdit触发器发送电子邮件,javascript,google-apps-script,triggers,google-sheets,Javascript,Google Apps Script,Triggers,Google Sheets,我正在尝试使用onEdit触发器发送电子邮件。我知道它在默认情况下不起作用,如下所述: 因为simple会自动触发fire,而无需询问用户 对于授权,它们受到以下几个限制: 无法访问需要授权的服务。例如,一个 simple trigger无法发送电子邮件,因为Gmail服务需要 授权,但一个简单的触发器可以用 语言服务,它是匿名的 但我认为我可以通过onEdit事件以编程方式创建另一个时间驱动的触发器,从而发送电子邮件。我知道(1)我的onEdit触发器可以自己工作,(2)手动运行函数以编程方式

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

因为simple会自动触发fire,而无需询问用户 对于授权,它们受到以下几个限制: 无法访问需要授权的服务。例如,一个 simple trigger无法发送电子邮件,因为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();
}
}
var ss=SpreadsheetApp.getActiveSpreadsheet();
var ssName=ss.getName();
var budgetLeft=ss.getRange(“Test!B1”).getValue();
var emailAddress=ss.getRange(“Test!B4”).getValue();

如果(budgetLeft正如Sandy Good所解释的,可安装触发器从创建它们的进程继承授权。如果它是由您手动运行onEdit函数创建的,则onEdit将充当您并可以创建一个充当您的触发器。但是,如果一个函数是由一个简单触发器执行的,则它仅被授权修改电子表格t。)哦,它被束缚着,什么也不做

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


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

正如Sandy Good所解释的,可安装触发器从创建它们的进程继承授权。如果它是由您手动运行onEdit函数创建的,则onEdit将充当您并可以创建一个充当您的触发器。但是,如果函数是由si执行的在MPE触发器中,它仅被授权修改绑定到的电子表格,而不执行其他操作

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


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

以下是谷歌开发人员如何描述一种实现我预期目标的好方法:


让OnOpen创建一个菜单项,单击该菜单项可创建所需的触发器。此菜单项将复制到多个文件中,因此只需单击菜单项即可使其工作。

以下是谷歌开发人员如何描述一种实现我预期目标的好方法:


使OnOpen创建一个菜单项,单击该菜单项可创建所需的触发器。此菜单项将复制到多个文件中,因此只需单击菜单项即可使其正常工作。

使用代码创建触发器也需要授权。您仍然存在完全相同的问题。如果您试图找到绕过se的方法安全性功能,希望没有办法。Web安全性已经处于足够糟糕的状态,您想找到一种方法使其更糟吗?我不打算将其用于任何恶意操作。我正在尝试使用一个带有脚本和时间驱动触发器的模板电子表格来发送电子邮件,我可以多次复制。当我进行复制时如果是手动创建的,时间驱动触发器不会复制。如果是以编程方式创建的,我需要手动运行创建它们的函数。我正在寻找一种方法来设置它,这样我就可以复制文件,授权绑定的脚本从我的地址发送电子邮件,然后就可以从那里开始工作。如果是供您自己使用的,在您的帐户中,然后只需手动创建一个可安装的“编辑时”触发器。如果您从“代码编辑器”的“资源”菜单下的“当前项目的触发器”设置触发器,则编辑时触发器将允许发送电子邮件。对于以前的任何负面影响,我们深表歉意。只想让人们了解限制的原因它们是这样的。我更高层次的问题是,在参考资料>当前项目的触发器中手动创建的触发器在复制文件时不会继续。所以我想我可以用某种方式在代码中创建触发器,并且在复制文件后会立即工作。但我想这是不可能的,我最好的选择是这样做ally.谢谢你的回答,不必担心负面影响。你在脚本中调用过这些函数吗?我肯定遗漏了什么,因为我认为你定义的函数不会在上面的代码中运行。或许可以尝试1.删除
CreateTimeDrivenTriggerst
的函数定义,只需在
onEdit
中创建触发器。2.如果(budgetLeft使用代码创建触发器也需要授权。您仍然有完全相同的问题。如果您试图找到绕过安全功能的方法,希望没有办法。Web安全已经处于足够糟糕的状态,您想找到一种方法使其更糟吗?我不打算将此用于任何恶意攻击。)操作。我正在尝试使用带有脚本和时间驱动触发器的模板电子表格来发送电子邮件,我可以多次复制。当我复制文件时,如果是手动创建的,时间驱动触发器不会复制。如果是以编程方式创建的,我需要手动运行创建它们的函数。我正在查看ng寻找一种方法来设置它,这样我就可以复制文件,授权绑定脚本从我的地址发送电子邮件,然后它就可以从那里工作了。如果是这样的话