为什么onChange和onEdit同时触发?

时间:2017-07-31 18:30:08

标签: google-apps-script google-sheets triggers

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

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

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

您可以在此处查看我的代码:

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

如果我使用值编辑单元格并将其更改为其他内容,则两者都会被触发 如果我在新单元格中写入内容,则都会触发

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

为什么两者都会被解雇?

1 个答案:

答案 0 :(得分:6)

作为documentation says,"在变更"触发器包括EDIT以及其他类型的更改:

  

更改类型(EDIT,INSERT_ROW,INSERT_COLUMN,REMOVE_ROW,REMOVE_COLUMN,INSERT_GRID,REMOVE_GRID,FORMAT或OTHER)

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

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

也就是说,您提到的所有操作(在已经有值的单元格中更改值,在没有值的单元格中添加NEW值,在单元格中删除值)都是编辑,因此{{1是你需要的唯一触发器。

如果目标是查找进行了哪种修改,请使用onEdite.value。使用简单触发器e.oldValue时,前者有一些怪癖:

  1. 如果用户输入" foo"直接(包括从外部来源粘贴):e.value是" foo"
  2. 如果用户粘贴" foo"从工作表中的其他位置复制的:e.value是onEdit(e),空对象。
  3. 如果用户清除了有" foo"先前:e.value是对象{}
  4. (如果使用在编辑时运行的可安装触发器,那么在情况2和3中,事件对象中根本没有属性"值")

    为了解决上述问题,我使用以下内容:

    {"oldValue":"foo"}

    确保function onEdit(e) { var newValue = (typeof e.value == "object" ? e.range.getValue() : e.value); // } 具有现在在单元格中的新值。

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

    newValue