gpt4 book ai didi

google-apps-script - 为什么 onChange 和 onEdit 触发器会同时触发?

转载 作者:行者123 更新时间:2023-12-04 19:30:41 26 4
gpt4 key购买 nike

我现在有一个电子表格,我想:

  • 跟踪何时有人更改了已有值的单元格中的值
  • 跟踪何时有人在没有值的单元格中添加新值
  • 跟踪何时有人删除了单元格中的值

现在,当我测试安装触发器甚至 onEdit() 和 onChange() 时,我只是不明白为什么每当我更改值或在空白单元格上添加新值时这两个触发器都会触发。

你可以在这里看到我的代码:

function onEdit(e){
Browser.msgBox('EDIT')
}
// trigger --> change
function onmychange(e){
Browser.msgBox('CHANGE')
}

如果我编辑一个带有值的单元格并将其更改为其他内容,两者都会被解雇如果我在一个新的单元格中写东西,两者都会被解雇

我的触发器:onmychange --> 在电子表格上 --> 在更改时

为什么都被解雇了?

最佳答案

作为documentation says ,“on change”触发器包括 EDIT 以及其他类型的更改:

The type of change (EDIT, INSERT_ROW, INSERT_COLUMN, REMOVE_ROW, REMOVE_COLUMN, INSERT_GRID, REMOVE_GRID, FORMAT, or OTHER)

如果您不想在更改是编辑时执行代码,请使用诸如

之类的条件
function onmychange(e) {
if (e.changeType != "EDIT") {
Browser.msgBox("Change that is not an edit");
}
}

就是说,您提到的所有操作(更改已有值的单元格中的值,在没有值的单元格中添加新值,删除单元格中的值)都是编辑,所以 onEdit 是您唯一需要的触发器。

如果目标是查找所做的编辑类型,请使用 e.valuee.oldValue。前者在使用简单触发器 onEdit(e) 时有一些怪癖:

  1. 如果用户直接输入“foo”(包括从外部源粘贴):e.value 是“foo”
  2. 如果用户粘贴从工作表其他地方复制的“foo”:e.value 是 {},空对象。
  3. 如果用户清除了之前有“foo”的单元格:e.value 是对象 {"oldValue":"foo"}

(如果使用在编辑时运行的可安装触发器,那么在情况 2 和 3 中,事件对象中根本没有属性“值”。)

为了解决上述怪癖,我使用以下方法:

function onEdit(e) {
var newValue = (typeof e.value == "object" ? e.range.getValue() : e.value);
//
}

这确保 newValue 具有现在位于单元格中的新值。

您可能希望使用以下日志记录触发器来观察触发器的行为:

function onEdit(e) {
e.range.offset(0, 1).setValue(JSON.stringify(e));
}

关于google-apps-script - 为什么 onChange 和 onEdit 触发器会同时触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45422906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com