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

In Google Apps Script, can't programmatically create trigger to send email from onEdit trigger

本文关键字:触发器 Google 创建 onEdit 电子邮件 方式 编程 脚本 Apps      更新时间:2023-09-26

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

因为简单的触发器会自动触发,而无需询问用户 对于授权,它们受到以下几个限制:它们 无法访问需要授权的服务。例如,一个 简单触发器无法发送电子邮件,因为 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();
}
}

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

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

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

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

以下是

Google开发人员描述实现我想要实现的目标的好方法的方式:https://youtu.be/U9Ej6PCeO6s?t=2578

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