2013-03-03 18 views
0

我想有輸出時,在我的電子表格中的特定單元格的值發生變化的時間線功能:添加時間軸,當單元格的值被改變(谷歌腳本)

在單元格A1是從變化的值時常。當A1改變時,我想在B1中添加當前值。 C1顯示值已被更改的時間戳。

下一次更改A1時,新值顯示在B2上,即C2上的時間戳。第三個改變是B3/B4,第四個改變是B4/C4,依此類推。

它似乎對我來說這是一個每一個通常的谷歌形式的功能,但我不知道如何將其轉換爲自定義腳本。

任何人都可以幫忙嗎?

+0

A1值如何變化?是否直接由SS中的用戶?如果最新的數據位於列的頂部,您不認爲閱讀起來並不容易嗎?在你描述的情況下,經過一些改變後,你不會看到最新的價值......他們會在頁面的底部... – 2013-03-04 16:50:49

回答

1

這是一個示例代碼,可以根據需要選擇更新的值,通過使用push或unshift將新值添加到列B或C的頂部或底部......我更喜歡不移位原因I給在發表評論,但它給你;-)

function timeline() { 
    var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() 
    if(sh.getActiveRange().getA1Notation()!='A1'){return} 
    var last = lastRowinCol(sh,'B'); 
    var cellA = sh.getRange('A1').getValues(); 
    var colB = sh.getRange('B1:B'+last).getValues(); 
    var colC = sh.getRange('C1:C'+last).getValues(); 
// colB.unshift(cellA); // add on top 
// colC.unshift([new Date()]); 
    colB.push(cellA); //add at the bottom 
    colC.push([new Date()]); 
    sh.getRange(1,2,colB.length,1).setValues(colB); 
    sh.getRange(1,3,colC.length,1).setValues(colC); 
} 

function lastRowinCol(sh,col){ 
    var coldata = sh.getRange(col+'1:'+col).getValues(); 
    for(var c in coldata){if(coldata[c][0]==''){break}} 
    return c 
    } 

注:還有其他的方式來實現這一點,但這個是相當「說教」我想......使用數組,子功能調用,批量讀取和寫...

編輯:我忘了提及,你需要分配一個onEdit觸發器的功能,讓它自動執行。


編輯2:從Mogsdad了非常中肯的意見遵循以下建議你用他的代碼,遍歷向後,這樣它處理空單元格列替換for-next循環中function lastRowinCol。此外,他的代碼有一個有趣的結構,因爲循環限制和條件都在同一個語句中。

function lastRowinCol(sh,col){ 
    var coldata = sh.getRange(col+'1:'+col).getValues(); 
    for (var c=coldata.length; (c) && coldata[c-1][0]==''; c--) {} 
    return c 
} 
+0

這正是我一直在尋找的!非常感謝,也是非移位/推送選項! – Bestof 2013-03-05 09:42:46

+0

+ for'lastRowinCol' - 一個方便的實用功能。 – Mogsdad 2013-03-05 16:25:18

+1

如果您希望它能夠容忍列數據中的空白,請從底部向上搜索。 'for(var c = coldata.length;(c)&& coldata [c-1] [0] ==''; c--){}' – Mogsdad 2013-03-05 16:32:08

相關問題