首页 > 解决方案 > 使用 on Edit 触发器在 Google 电子表格中更改单元格值时自动发送电子邮件

问题描述

当电子表格值更改时,我想发送一封带有触发器的电子邮件。到目前为止,我看了很多教程并阅读了博客,但我找不到适合我的解决方案。

单子:

图片已添加

| 一个 | B |C | D |E |

| ✖ | 2021 年 3 月 31 日 |项目编号 15542 | Vertrag hochladen |!|

触发:

触发器已在 onEdit 上设置 + 发生更改时向我发送电子邮件

编码:

function onEdit(e){
  if (e.range.columStart != 5 || e.value != "!") return;
  const rData = e.source.getActiveSheet().getRange(e.range.rowStart,1,1,4).getValues();
  let n = rData[0][2];
  let items = rData[0][3];
  let loc = rData[0][1];
  let now = new Date().toLocaleString("en-US");
  
  let msg = n + items + loc + now;
  Logger.log(msg);
  GmailApp.sendEmail("myemail@gmail.com", "Problem!", msg)
}

失败按摩: TypeError:无法读取未定义的属性“columStart”

问题: 我认为这段代码可以工作,但我总是收到这个失败消息,我看不出这段代码是否真的将所有 4 行都带入了邮件中。

有人知道解决方案吗?

在此处输入图像描述

在此处输入图像描述

标签: google-apps-scriptgoogle-sheets

解决方案


我认为您的脚本有 2 个修改点。

修改点:

  1. 请修改e.range.columStarte.range.columnStart.

  2. onEdit()作为可安装的 OnEdit 触发器安装时,当单元格被编辑时,onEdit()以异步过程运行 2 次。一个作为可安装触发器运行。另一个作为简单触发器运行。在您的脚本中,当onEdit()作为简单触发器运行时,会在GmailApp.sendEmail().

    • 因此,请将函数名称onEdit从重命名为其他名称,并将重命名的函数安装为可安装的 OnEdit 触发器。

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

function installedOnEdit(e){ // Modified
  if (e.range.columnStart != 5 || e.value != "!") return; // Modified
  const rData = e.source.getActiveSheet().getRange(e.range.rowStart,1,1,4).getValues();
  let n = rData[0][2];
  let items = rData[0][3];
  let loc = rData[0][1];
  let now = new Date().toLocaleString("en-US");
  
  let msg = n + items + loc + now;
  Logger.log(msg);
  GmailApp.sendEmail("myemail@gmail.com", "Problem!", msg)
}

参考:

添加:

从您的以下回复中,

嗨@Tanaike,我再次对其进行了测试,它返回了失败消息:“TypeError:无法读取未定义的属性'columnStart'”。是的,你是对的,如果“!” 在列 E 中,脚本应该运行。这 ”!” 由公式自动填充。我也尝试手动将其放入,但脚本也无法正常工作。我读过一些关于,当公式触发 onEdit 事件时,可能是触发器不起作用。但即使我尝试将它放入没有配方的 manuelle 中,它也不起作用。你怎么看?会不会是我的代码不适合这个转换?谢谢你的时间<3

我知道您想在编辑“D”列并且“E”列是!时运行脚本,您想运行脚本。为此,以下修改后的脚本怎么样?

修改后的脚本:

function installedOnEdit(e){
  const range = e.range;
  if (range.columnStart != 4 || range.offset(0, 1).getValue() != "!") return;
  const rData = e.source.getActiveSheet().getRange(range.rowStart,1,1,4).getValues();
  let n = rData[0][2];
  let items = rData[0][3];
  let loc = rData[0][1];
  let now = new Date().toLocaleString("en-US");
  
  let msg = n + items + loc + now;
  Logger.log(msg);
  GmailApp.sendEmail("myemail@gmail.com", "Problem!", msg)
}
  • 当您要运行脚本时,请将可安装的 OnEdit 触发器安装到功能installedOnEdit()并编辑“D”列。当同一编辑行的“H”列为!时,脚本有效。

推荐阅读