2015-09-16 2 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); 
    }); 
Смежные вопросы