2013-04-04 162 views
1

我在電子表格中使用了一個腳本。它在B2單元格,並且需要像=myfunction(A2:A12)這樣的參數。該功能從內部獲取來自大範圍單元的信息。Google Apps腳本 - 電子表格運行腳本onEdit?

似乎沒有任何工作。我試着將它添加到
腳本>資源>當前項目的觸發器>在編輯
腳本>資源>當前項目的觸發器>在開放

我怎麼能有這樣的功能更新與每個文檔編輯的結果呢?

+0

「似乎沒有什麼工作」顯然是誇大其詞。什麼具體不起作用?例如,觸發器將一個事件作爲參數傳遞,所以一個預期範圍的自定義函數(如你所示)不會得到它。 – Mogsdad 2013-04-05 13:56:21

+0

該函數在電子表格的單元格內使用,並在該單元格中顯示返回的結果。我希望函數更新文檔編輯中的單元格結果。 – HelpyHelperton 2013-04-05 14:30:19

回答

1

當你正在你的自定義函數中調用谷歌Apps服務(如getRange和的GetValues等),遺憾的是沒有與每個編輯更新這樣的自定義函數的方式,不是通過細胞的所有等你正在「觀看」編輯。

而且,也許更令人沮喪的,路過的解決辦法說你所有的「注視」單元的引用與公式單細胞不觸發更新 - 這似乎是一個需要引用「觀看「細胞直接。

您可以傳遞GoogleClock()作爲參數,它至少每分鐘更新一次函數輸出。

但是這個論壇上很多成員的建議(誰對這個東西比我有更多的知識)只是:「不要使用自定義函數」。

1

我不知道這確切的代碼將工作,但你可以嘗試這樣的事情......

function onEdit(event){ 
    var activeSheet = event.source.getActiveSheet(); 
    if(activeSheet.getName() == "ActiveSheetName") { 
    var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TargetSheetName"); 
    targetSheet.getRange(2,2).setValue("=myfunction(A2:A12)"); 
    } 
} 

假設在片「TargetSheetName」對B2單元格,並假設編輯的單元格上工作表「ActiveSheetName」,當您編輯任何工作表中的任何單元格時,onEdit函數將觸發。由於有一個if語句來檢查該編輯單元格是否位於工作表「ActiveSheetName」上,因此只有當編輯單元格位於該工作表上並且將B單元格設置爲value = myfunction(A2:A12)時,纔會觸發該單元格。迫使它來更新(我猜)。

希望我是正確的,而且我是有幫助的

0

好希望我的回答,並將其與該AdamL給了你第一個我想我的回答WAA愚蠢lool。 您可以使用OnEdit事件您的自定義功能代碼將值直接放到B2單元格中...

對不起,我的英語不是我的主要語言

0

我有類似的問題,對我來說,我想「看」一個特定的單元格來觸發我的功能。

我做了以下(假裝A1是我正在看的細胞)

IF(LEN(A1) < 1, " ", customFunction()) 

這如果我編輯的細胞成功地觸發。但是:

「自定義函數返回值,但不能設置值外 它們在細胞在大多數情況下,在 A1單元格的自定義函數不能修改單元格A5。但是,如果自定義函數返回一個 雙數組,則結果會溢出包含函數 的單元格,並將單元格填充到包含 自定義函數的單元格的下方和右側。你可以用含有 返回自定義函數測試這個[1,2],[3,4];」來自 :https://developers.google.com/apps-script/execution_custom_functions

這使得它幾乎是無用的,但它可能對你的工作情況?

如果自定義功能被分配到一個項目觸發它有更多的功率,從而親自最後我將它添加到「腳本>資源>當前項目的觸發器>上編輯」

基本上「看着一列」,所以如果當前單元格處於「編輯範圍」內,它只會執行某些操作。這有點不妥,需要一些隱藏的單元格,但它現在爲我工作

var rowIndex = thisspreadsheet.getActiveCell().getRowIndex(); 
    var colIndex = thisspreadsheet.getActiveCell().getColumn(); 
    //clamp to custom range 
    if(rowIndex < 3 && colIndex != 5) 
    { 
     return 0; 
    } 

    //check against copy 
    var name = SpreadsheetApp.getActiveSheet().getRange(rowIndex, 5).getValue(); 
    var copy = SpreadsheetApp.getActiveSheet().getRange(rowIndex, 6).getValue(); 
    if(name != copy) 
    { 
    ///value has been changed, do stuff 
    SpreadsheetApp.getActiveSheet().getRange(rowIndex, 6).setValue(name); 
    } 
相關問題