2016-12-11 17 views
1

Совершенно новый для программирования и застрял после долгих поисков. Я пытаюсь создать скрипт Google, который может искать конкретный столбец и подсчитывать, сколько раз в столбце отображаются значения «ДА» или «НЕТ» (после этого они будут действовать на основе этих чисел).Подсчет количества строк, появляющихся в диапазоне

Пробовал различные способы сделать это, но все неудачно, что я думаю, что это самый близкий пример ниже:

function billChecker() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheets()[0]; 

var values = sheet.getSheetValues(3, 5, 20, 1); 
Logger.log(values); 

    var unpaidEntries = values.indexOf("YES"); 

var email = Session.getActiveUser().getEmail(); 

    var subject = "Test"; 

    var body = "The number of unpaid items is " + unpaidEntries + "." + "The values contained are: " + values; 

GmailApp.sendEmail(email, subject, body); 
} 

Как вы можете сказать, цель сценария сказать, сколько неоплаченных счетов есть , Я отправляю по электронной почте результаты, это единственный способ, который я могу проверить, чтобы проверить это на данный момент! Я думал, что лучший способ сделать это - это, вероятно, использовать метод example.indexOf(), однако он всегда производит «-1».

ответ

1

Метод getSheetValues возвращает двойной массив: массив, в котором каждый элемент представляет собой массив элементов в соответствующей строке. Например, если диапазон заполнен

1 2 
3 4 

вы собираетесь получить [[1,2], [3,4]]. Если диапазон имеет только один столбец, как в вашем примере, эта структура по-прежнему применяется:

1 
3 

представлен как [[1], [3]].

Итак, вы никогда не найдете строку «ДА» в качестве элемента массива, так как вместо этого будет ["YES"]. Кроме того, indexOf предназначенный для поиска на первых определенных значений, а не их подсчета. Вот как вы можете сосчитать их:

var unpaid = values.reduce(function(a, b) { 
    return a + (b[0] == 'YES' ? 1 : 0); 
}, 0); 

Здесь a это счетчик, изначально установлен в 0. Метод reduce пересекает values массив, обслуживает до каждого из его элементов, таких как ["YES"] или ["NO"], как аргумент b. Функция уменьшения добавляет 1 к счетчику, когда b[0] «ДА».

+0

Спасибо за ваш вклад! Объяснение очень полезно. У меня было ощущение, что он возвращал нечто иное, чем обычный массив, но не мог понять, как это выяснить. Документация на самом деле не прояснила (по крайней мере, для меня). Как вы можете сказать? – Josh

+0

Команды отладки, такие как 'Logger.log (values);' (которые записываются в журнал, доступный через меню) могут быть полезны. И в Документации говорится: «Возвращаемый объект [] [] - двухмерный массив значений» – FTP

1

Используйте этот код, который я сделал. Это именно то, что вы ищете:

Sample данные:

Range Start: A5 (5,1) 

enter image description here

function countRepitition() { 

    var ss = SpreadsheetApp.openById("ENTER_SPREADSHEET_ID"); 
    var sheetname = ss.getSheetByName("ENTER_SHEET_NAME"); 

    var count = 0; 
    var values = sheetname.getRange(5, 1, 9, 2).getValues(); //Start of Range (5,1) -> A5, End of Range (9,2) -> B9 

    for (var row in values) { 
    for (var col in values[row]) { 

     if (values[row][col] == "YES") { 
     count++; //increment count everytime we find the string 'YES' upon given range 
     } 

    } 
    } 

    Logger.log('count is '+ count); //print the valuoe of count in the Logs 
} 

Это результат в консоли:

enter image description here

Смежные вопросы