10

我有一個Google時間表數據電子表格;它每個月都有一個表格,每個表格有六個列塊,每個客戶端一個塊。腳本來總結數據不更新

我創建了去,並得到總額爲每個客戶端,並將其顯示在列表彙總單:

function getClientTotals(sheetname, colcount) 
{ 
    colcount = colcount ? colcount : 6; 
    var res;  
    var ss = SpreadsheetApp.openById('myid_goes_here'); 
    if(ss) 
    { 
    res = []; 
    var totrow = ss.getRange(sheetname + '!A1:ZZ1').getValues()[0]; 
    for(var i = 0; i < totrow.length; i += colcount) 
    { 
     res.push([totrow[i], totrow[i + colcount - 1]]); 
    } 
    } 
    return res; 
} 

我已經然後只是增加了一個電池含有=getClientTotals($C$7,$C$8)其通過在我的彙總表表格名稱和每個客戶端的列數(在「模式」修改的情況下)

這一切工作正常,但是,它不會更新源數據更改時我添加了一個onEdit觸發器;沒有喜悅,它更新如果你去腳本編輯器並點擊保存,但這不是有用的湖我錯過了什麼嗎?

+0

不缺少任何東西;這可能有助於在Google問題跟蹤器中投票申請此功能請求:https://issuetracker.google.com/issues/36763858 –

回答

28

您錯過了挑剔的高速緩存錯誤功能。它的工作原理如下:

Google認爲您的所有自定義函數都依賴於只有直接返回它們的參數值(您可以選擇性地依賴於其他靜態數據)。

有了這個先決條件,他們只有在參數改變時才能評估你的函數。例如

讓我們假設我們有B1單元格中的文字「10」,然後在其他一些細胞中我們輸入=myFunction(B1)

myFunction的進行評估,並將其結果檢索。然後,如果將單元格B1的值更改爲「35」,則將按照預期重新評估自定義,並正常檢索新結果。 現在,如果您再次將單元格B1更改爲原始「10」,則不會重新評估,原始結果將立即從緩存中檢索出來。

因此,當您使用工作表名稱作爲參數來動態獲取並返回結果時,您正打破緩存規則。

不幸的是,沒有這個驚人的功能,你不能擁有自定義功能。因此,您必須將其更改爲直接接收值,而不是表名,或者不要使用自定義函數。例如,您可以在腳本上擁有一個參數,告訴其摘要應該到哪裏,並且每當總數發生變化時,都會有一個參數更新它們onEdit

+1

嗯,這很煩人,但謝謝你的答案!通過向函數添加一個虛擬參數,我得到了一個討厭的解決方法;如果我然後傳遞一個單元格引用,我可以通過在該單元格中增加一個數字來強制刷新數據。不要以爲無論如何我都可以創建一個刷新按鈕,點擊就可以做到這一點,是嗎?這很好,它不需要自動,只是簡單明瞭。 – Whelkaholism

+0

那麼,你可以創建一個按鈕,實際上是一個繪圖併爲其分配一個腳本函數,這將增加你將強制更新的虛擬參數單元。 –

+0

太棒了,完美的作品,謝謝! – Whelkaholism

1

緩存問題的另一種解決方案。

在您的方法中有一個虛擬變量。 pass

Filter(<the cell or cell range>,1=1) 

作爲該參數的值。

例如

=getValueScript("B1","B4:Z10", filter(B4:Z10,1=1)) 

過濾器的輸出未被使用。但是它向電子表格顯示此公式對B4:Z10範圍敏感。

+3

它不再工作。您將看到錯誤「如果您嘗試以這種方式執行此功能,則不允許使用NOW(),RAND()或RANDBETWEEN()引用單元格 –

-1

正如@Brionius所說的那樣在功能上加了一個額外的動態論據。如果你現在使用()你可能有超時問題,使更新慢一點...

cell A1 = int(now()*1000) 
cell A2 = function(args..., A1) 
+2

它不再起作用。您將看到錯誤「如果您嘗試以這種方式執行此操作,則不允許此函數使用NOW(),RAND()或RANDBETWEEN()引用單元格 –

0

你可以做的是地方設立另一個單元格將被每次添加新的工作表時更新電子表格。請確保它不更新的每一個變化,但只有當你想要做的計算(在你的情況下,當您添加紙張)。然後,您將對此單元格的引用傳遞給您的自定義函數。如前所述,自定義函數可以忽略此參數。

1

我也有類似的問題,創造工作的儀表板。以上(即使用的值在你的函數傳遞給一個虛擬變量表的Filter功能)Chamil的解決方案工作得很好,儘管阿爾森更近的評論。就我而言,我是用一個函數來監控範圍,因爲它創造了一個循環引用無法使用的過濾器在同一個範圍內。所以我只是有一個電池(在我的情況E45在下面的代碼)中,我改變了數只要我希望我的功能更新:

=myFunction("E3:E43","D44",filter(E45,1=1)) 

由於Chamil表示,過濾器是不是在腳本中使用:

function myFunction(range, colorRef, dummy) { 
    variable 'dummy' not used in code here 
} 
0

鑑於由恩裏克·阿布雷烏解釋功能,您可以嘗試出的現成的電子表格功能QUERY,即SQL喜歡查詢是我在工作 經常使用的原始數據,並獲取數據彙總到不同的選項卡,結果數據在更改後實時更新原始數據。

我的建議是基於你的劇本還沒有先進的工作,如URL抓取,只是數據的工作,因爲沒有實際的數據讀取,我不能給人以查詢精確的解決方案的事實。

關於由恩裏克·阿布雷烏提到緩存功能(我沒有足夠的聲譽直接他的回答下評論),我做了測試,結果發現:

  1. 看起來沒有緩存工作以下所示的測試功能的腳本:

    功能加法器(基){ 使用Utilities.sleep(5000); return base + 10; }

通過調用一個細胞施加在片材的自定義功能加法器(),然後將每個時間我看到的裝載消息,並總時間超過5秒改變了單元格的值來回。 這可能與在此GAS issue:

此問題現已得到解決提到的更新。新表格中的自定義功能現在可以識別上下文,並且不會積極緩存值。

  • 本主題中提到的問題仍然存在,我的測試表明,谷歌片重新計算自定義函數每個只有當

    • 值直接函數調用的是時間改變。

    功能getCellValue(SHEETNAME,行,列) { 變種SS = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getSheetByName(sheetName); return sh.getRange(row,col).getValue(); }

    enter image description here
    在黃色細胞的任何值的變化將導致自定義函數的重新計算;函數忽略實際的數據源值更改。

    • 包含單元格位置的函數在表單中更改。恩。插入/刪除上方或左側的行/列。