2017-07-31 81 views
1

我现在有一个表格,我想:当有人改变在已经有一个值时,有人在一个没有价值的小区增添了新的价值 为什么onChange和onEdit同时触发?

  • 跟踪的单元格的值

    • 轨道
    • 当有人删除单元格的值现在

    当我测试安装的触发,甚至onEdit()和的onChange(

  • 轨道)我只是不明白这就是为什么这两个火灾每当我改变值或者在空白单元格上添加新的值。

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

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

    如果我编辑单元格与价值,将其更改为别的,都被炒 如果我写一个新的单元格的东西,无论是开除

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

    为什么双方都被解雇?

  • +1

    有2触发类型,(简单)https://developers.google.com/apps-script/指南/触发器/]和(可安装)[https://developers.google.com/apps-script/guides/triggers/installable]。由于Change事件没有简单的触发器,所以您必须将'onmychange()'定义为Installable触发器。你是否将它们都设置为编辑触发器?你希望它是一个更改触发器。 onEdit()是一个简单的触发器,因此您无需在Installable触发器位置中定义该触发器,因为该函数的名称足以在编辑时触发它。 –

    +0

    有关触发器类型的解释,请参阅https://stackoverflow.com/questions/22389875/google-application-script-onchange-or-onedit – terrywb

    +0

    onmychange()在触发器中发生变化,onEdit上我什么都没有。仍然是火,而不仅仅是一个。 当我在一处山坳改变既重视火灾
    当我在空白栏BOTH火灾 伊夫试图触发变化和编辑触发器增加价值,但我不知道为什么这happends,即时通讯意识到触发类型的terrywb – Asim

    回答

    4

    作为documentation says中, “上改变” 触发器包括其他类型的更改中编辑:

    类型变化(EDIT,INSERT_ROW,INSERT_COLUMN,REMOVE_ROW,REMOVE_COLUMN,INSERT_GRID,REMOVE_GRID,格式或其他的)

    如果你想在改变编辑不执行代码,使用条件,如

    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. 如果用户糊剂“富“这是从表中的其他地方复制的: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)); 
    }