2015-05-16 37 views
0

我有一個腳本來更新命名區域時,新的數據行被添加到電子表格中的問題:在改變觸發器不行書在更改

function updateNamedRanges() { 

     // get to the right place 
     var ss = SpreadsheetApp.getActiveSpreadsheet(); 
     var sheet = ss.getSheetByName('ga weekly data pull'); 

     //now update the named ranges if they have changed in length 
     var openEnded = ["gaCampaign", "gaMedium", "gaSource", "gaSubscriptions", "gaUsers", "gaWeek"]; 

     for(i in openEnded) { 
     var r = ss.getRangeByName(openEnded[i]); 
     var rlr = r.getLastRow(); 
     var s = r.getSheet(); 
     var slr = s.getMaxRows(); 
     if(rlr==slr) continue; // ok as is-skip to next name 
     var rfr = r.getRow(); 
     var rfc = r.getColumn(); 
     var rnc = r.getNumColumns(); 
     var rnr = slr - rfr + 1; 
     ss.removeNamedRange(openEnded[i]); 
     ss.setNamedRange(openEnded[i], s.getRange(rfr, rfc, rnr, rnc)); 
     } 
     sheet.getRange("D2").setValue(0); // this gets all the formulas in the sheet to update - just changing any cell 
    } 

中,APS腳本編輯器中,我去資源>當前項目觸發器>運行updateNamedRanges>從電子表格→更改。

現在,如果我手動添加一行數據腳本運行 - 太棒了!

但我使用Google Analytics附加功能提取數據。當數據的長度比表單長時,這個附加擴展了所討論的標籤。但是,當發生這種情況時,腳本不會更新。

我能在這裏做什麼嗎?

作爲一個備份,我想如果我可以弄清楚如何讓GAS從表格底部添加一行可能會這樣做,但似乎是一種解決方法。在我走下這條路之前還有更好的辦法嗎?

+0

關於我的最後一個段落甚至不會工作,因爲我不能讓劇本跑到第一位 –

回答

1

在每分鐘運行一次的時間觸發器上運行它,直到Google解決未捕獲更改事件和/或無法定義開放式命名範圍的問題。

編輯運行開放

腳本從每次重新計算它或打開是否需要跟不上紙張。

上述循環的地方:

var recalc = false; 

內環路下面if(rlr==slr) continue;

recalc = true; 

重新計算表僅在必要時:

if(recalc) {sheet.getRange("D2").setValue(0)}; 
+0

我結束了我們在腳本本身中創建一個onOpen()事件。因此,如果附加組件每週早上7點添加數據,那麼當有人打開它時腳本會更新。每分鐘添加一個計時器大概會每分鐘更新一次腳本,並且這會使最終用戶使用該表變得非常棘手,因爲在更新範圍時會運行相當數量的公式。 但是,我對觸發器的理解是否正確?應該資源>當前項目觸發器>運行updateNamedRanges>從電子表格「在變化已經奏效,這只是一個GAS問題,而不是我的理解? –

+1

打開事件可能會減慢加載時間,但如果自上次打開表單後未添加任何行,則可能無關緊要。你對觸發器的理解是正確的。無論什麼來源,只要發生變化,該事件都會觸發。這是一個錯誤,應該這樣報告。 – ScampMichael

+0

當我提到如果沒有任何改變,執行時間並不重要,我忘記了你正在重新計算表格。它可能需要一些時間,並且在每種情況下都不是必需的。見編輯的答案。 – ScampMichael

4

正如您發現的那樣,應用程序腳本觸發器僅在應用程序腳本執行更改時才起作用。是它的跛腳。如果應用程序腳本之外的api修改表單,則它們不會觸發。

您唯一的選擇是使用時間觸發器來檢測更改並再次處理整個工作表(因爲您不知道發生了什麼變化)。一種更高效地實現這一點的方法是記住(在腳本屬性中)觸發器的最後修改日期。然後1分鐘的時間觸發器檢查修改日期現在是否大於最後一次保存的日期。如果是的話,處理整個表。