0

這可能是一個基本的和容易回答,但我已經拔了我的頭髮一段時間了!谷歌文件 - 電子表格循環

我已經構建了下面的代碼 - 這是半僞的,因爲我找不到正確的方法來使事情工作!

var s = "Test"; 

function onEdit(event) 
{ 
    var ss = event.source.getActiveSheet(); 
    var r = event.source.getActiveRange(); 
    if (ss.getName() == s) 
    { 
    results = {"Currently On": 0, "Next Up": 0, "On Hold": 0, "Waiting on someone else":  0, "zDone": 0}; 
    last = ss.getMaxRows(); 
    start = ss.getRange("F3:"+last).getValues(); 
    var output = "J11"; 
    for (x=0;x<start.length;x++) 
    { 
    results[start[x]]++; 
    } 

    for (y=0;y<results.length;y++) 
    { 
     row = ss.getRow(output); 
     row.value = results[y]; 
     output++; 
    } 
    } 
} 

我有了這個圖像中的數據data example

的基本思想是通過每個任務的所有可能的類別來運行,並保持多少的側數字列表的例子每個都有。我也想讓它變成動態的(所以我不需要在類別列表中使用硬編碼),但我更感興趣的是現在就開始工作。

Google Apps調試器非常令人沮喪!

感謝您的幫助!

回答

1

首先,這個特殊的用例是一個電子表格公式很容易實現,如:

=QUERY(A2:F;"select F, count(A) where F != '' group by F label count(A) 'Count'";1) 

但爲什麼你想與GAS做到這一點有可能是一個原因。

那麼其次,這是我覺得可能有一些語法問題:

last = ss.getMaxRows(); 

我只想用var last = ss.getLastRow()這裏。

start = ss.getRange("F3:"+last).getValues(); 

範圍基準將評估爲類似「F3:100」,這是在GSheets(不知道是否GAS可以處理它)一個有效的參考,但無論如何你真的想要的東西,如「F3 :F100「,所以我會用var start = ss.getRange("F3:F"+last).getValues();

results[start[x]]++; 

當您創建從getValues()數組調用它是一個二維數組,所以你需要使用results[start[x][0]]++;

隨着下一個循環和output變量,我必須承認我有點失落,你在那裏做什麼。你想如何佈置結果表?

1

你有

output = "J11"; 

然後你做

ss.getRow(output); 
output++; 

這是所有的invalid.First,SS是表下有沒有getRow方法將。所以,你真的應該做的是這樣的事情

var row = 11 ; 
var col = 10 ; //Col J 
for (y=0;y<results.length;y++) 
{ 
    ss.getRange(row,col,1,1).setValue(results[y]); 
    row++: 
} 
0

像AdamL,我認爲這是更好的電子表格的本地能力範圍內進行處理。在我看來,你想要一個數據透視表,它會動態更新。或者,像= countif(F:F,「Currently On」)這樣的公式將滿足您的即時請求。 =唯一(F:F)會給你一個數組中的類別列表