2015-09-16 119 views
1

計數的多個不同的條目我發現這個腳本片材和改性了一點,因此它會在所選單元格的值,分別計算它們並用的結果返回一個瀏覽器的消息(如「100 「:12(次), 「不可用」:5 「延遲」:4等)。有人可以幫我修改腳本,以便它可以還分別在單細胞分析不同的值\字符串(通過一些特定的符號分隔,例如)。此外,一種方法它來計算\只返回一個標記值,然後將他們的結果標明值的總和。腳本用於在選擇的細胞

function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var menuEntries = [ {name: "Count Stuff", functionName: "countStuff"}]; 
    ss.addMenu("aQ", menuEntries); 
} 

function countStuff() { 
    var s = SpreadsheetApp.getActiveSheet(), 
     r = s.getActiveSelection(), 
     v = r.getValues(), 
     d = {}, 
     i = v.length - 1, 
     t; 

    while (i > 0) { 
    if ("" === (t = v[i--][0])) { 
     continue; 
    } 

    d[t] ? d[t]++ : (d[t] = 1); 
    } 

    t = ""; 

    for (v in d) { 
    t += v + ":" + d[v] + "\n"; 
    i++; 
    } 

    i !== 0 && s.getRange(r.getLastRow() + 1, r.getLastColumn() - r.getNumColumns() + 1).setValue(i); 

    Browser.msgBox(i === 0 ? "No values selected!" : t); 

    delete s, r, v, d, i, t; 
} 

回答

0

這裏的一個計數功能,其分離由逗號entried ,

它前進在兩個步驟:(1)壓扁的值,通過連接各行一起;在該過程中,行的每個條目都被轉換爲一個字符串並以逗號分隔。 (2)統計條目;與平面陣列這很容易。中的計數保持在一個對象,以及用於消息框的格式由JSON.stringify

function countStuff() { 
    var v = SpreadsheetApp.getActiveSheet().getActiveSelection().getValues(); 
    var count = {}; 

    if (!v.map) { 
    Browser.msgBox("Select a range to count"); 
    return; 
    } 

    var flat = v.reduce(function(a, row) { 
    return a.concat(row.reduce(function(a, entry) { 
     return a.concat(entry.toString().split(',')); // adjust split as needed 
    }, [])); 
    }, []); 

    for (var i = 0; i < flat.length; i++) { 
    count[flat[i]] = count[flat[i]] + 1 || 1; 
    } 

    Browser.msgBox(JSON.stringify(count)); 
} 

如果不需要分割完成的,扁平陣列的計算簡化爲

var flat = v.reduce(function(a, row) { 
    return a.concat(row); 
    });