2017-07-31 78 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)); 
    }