2015-09-30 2 views
0

У меня есть диапазон данных, первым столбцом которого являются даты, а второй столбец - числовые значения. Есть несколько строк, в которых значение второго столбца пустое, и я не хочу, чтобы они учитывались.Среднее число в столбце Если условие в другой колонке удовлетворено

Я пытаюсь найти среднее значение для значений второго столбца, если они удовлетворяют критериям пребывания в течение 3 месяцев назад с сегодняшнего дня (пустые значения не должны учитываться).

Но я застреваю, поскольку я даже не могу получить полное правильное. И я не знаю, как продолжить дальше, чтобы получить среднее.

Код, похоже, дает мне прилагаемые строки вместо математического суммирования чисел.

Помогите пожалуйста?

Заранее спасибо.

function average() { 
    // open spreadsheet 
    var spreadsheet = SpreadsheetApp.openById("spreadsheetID"); 
    // set the named sheet as active 
    var sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName("SheetName")); 

    // figure out what the last row is 
    var lastRow = spreadsheet.getSheetByName("Form responses 1").getLastRow(); 
    // the rows are indexed starting at 1, and the first row is the headers, so start with row 2 
    var startRow = 2; 
    // get the data range 
    var responsesValues = spreadsheet.getSheetByName("Form responses 1").getRange("A1:Q" + lastRow).getValues(); 

    // define the dates 
    var timeToday = new Date().getTime(); 
    var dateToday = new Date().getDate(); 
    var date = new Date(); 
    var threeMonthsAgo = new Date(date.getFullYear(), date.getMonth() - 3, 0); 

    // grab column 1 (date of entry column) (second variable in getRange function below) 
    var dataRange = sheet.getRange(2,1,lastRow-startRow+1,1); 
    var numRows = dataRange.getNumRows(); 
    var dateOfEntryValues = dataRange.getValues(); 

    // grab column 2 (values to be averaged) 
    range = sheet.getRange(2, 2, lastRow-startRow+1, 1); 
    var Values = range.getValues(); 

    var warning_count = 0; 
    var sumValues = 0; 

    // Loop over the values 
    for (var i = 0; i <= numRows - 1; i++) { 
    var dateOfEntry = dateOfEntryValues[i][0]; 
    if(dateOfEntry > threeMonthsAgo && dateOfEntry !== "") { 
    // if it's within 3 months ago, add the values. 
    sumValues += Values[i][0]; 
    warning_count++; 
    } 
    } 

ответ

1

Существует более простая версия. Просто поместите в Destination Cell формулы

= ArrayFormula (СРЕДНИЙ (IF (РАЗНДАТ (C1: C, сегодня(); "D") < = 90; E1: Е)))

заменяющей C1: C со столбцом с датами и E1: E с столбцом с номерами.

+0

Но я хотел бы сделать это со сценарием, а не работать с электронной таблицей. –

+0

Вы можете использовать это в ячейке и получить значение оттуда в скрипте. – Greaka

+0

попробуйте вместо 'if (dateOfEntry> threeMonthsAgo && dateOfEntry! ==" ") {' this 'if (dateOfEntry> threeMonthsAgo && dateOfEntry! =" ") {' DateOfEntry может отличаться от строки. – Greaka

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