google-apps-script - 使用 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 行都带入了邮件中。
有人知道解决方案吗?
解决方案
我认为您的脚本有 2 个修改点。
修改点:
请修改
e.range.columStart
为e.range.columnStart
.当
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”列为!
时,脚本有效。
推荐阅读
- c# - 使用来自 View 的输入搜索 JSON,然后将该数据返回给 View
- javascript - 使用 Ref 触发 OnSubmit() - 如何传递事件?
- html - 如何格式化输入信用卡的日期,到期日?
- python - 如何可视化训练集结果?
- asp.net-core-2.0 - 由于缺少服务结构包而不会添加依赖项
- python - 为什么“flags = cv2.CASCADE_SCALE_IMAGE”在制作人脸识别模型时会出现语法错误?
- java - 为杰克逊添加一个动态 json 属性作为 java pojo
- c# - 将图形设置为辅助 Y 轴
- f# - 如何覆盖 FsCheck 中所有属性的字符串生成
- laravel - 在 rest api 中编写链接的雄辩效率