Сумма массива и средняя

ужен скрипт Google (GAS) для получения электронной почты и общего количества баллов из формы Google, которая была превращена в тест.

В GAS вы можете получить оценку по каждому вопросу, но мне нужно получить оценку по всем вопросам, а затем усреднить итоговую оценку (в каждом тесте 20 вопросов). Мне также нужен адрес электронной почты каждого человека, который закончил тест. Эти тесты проводятся в учреждениях, поэтому выбран «Сбор адресов электронной почты».

Мне нужно это, а НЕ «электронная таблица ответов», потому что я буду делать сотни тестов, и мне нужно сложить все оценки в одну электронную таблицу в качестве сводки. Я не хочу иметь сотни электронных таблиц ответов.

То, что у меня есть до сих пор, ниже, но я не могу получить среднюю оценку каждого теста и поместить его рядом с электронным письмом в электронную таблицу. Любая помощь будет оценена.

function getPoints() {
var form = FormApp.openById('ID');
 var formResponses = form.getResponses();
 var formItems = form.getItems();

 for (var i = 0; i < formResponses.length; i++) {
  var formResponse = formResponses[i];
   var email = formResponse.getRespondentEmail();

/* I need to get all emails from those who responded, 
   not just one and put them in column A.*/

   var s = SpreadsheetApp.openById("ID").getSheetByName("Sheet1");
   var sr = s.getRange("A:A").setValues(email);
 }

 for (var j = 0; j < formItems.length; j++) { 
   var item = formItems[i];
    if (item.getType() === item.getType().TEXT){
    var points = item.asTextItem().getPoints(); 
    var itemResponse = formResponse.getGradableResponseForItem(item);
    var answer = itemResponse.getResponse();
    var sc = itemResponse.getScore();

    /* I need to get all the scores, not just one, and then average
       them, and them put them in column B, beside the corresponding
       email in column A. */

    var s = SpreadsheetApp.openById("ID").getSheetByName("Sheet1");
    var sr = s.getRange("B:B").setValues(sc);
    }
 }
}
 Jason Allshorn27 дек. 2017 г., 00:58
Не уверен, если вы знаете это. Но вы можете указать все формы на одну таблицу.support.google.com/docs/answer/2917686?hl=en

Ответы на вопрос(1)

Решение Вопроса

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

Пример:

Следующий скрипт, предназначенный для использования в качестве ограниченного скрипта, включает три функции:

OnOpen Добавляет пользовательское менюshowAvarage основная функция, которая устанавливает форму для обработки и вызывает функцию, которая создает 2D-массив. Его можно использовать для отправки значений в электронную таблицу, но для простоты это было опущено.calculateAvarage Собирает электронные письма респондентов и вычисляет средний балл для каждого теста (отправка ответа).
function onOpen(e) {
  var ui = FormApp.getUi();
  var menu = ui.createMenu('My Menu')
  .addItem('Average', 'showAverage')
  .addToUi();
}

function showAverage(){
  // Works for bounded scripts called from custom menus or the script editor
  var form = FormApp.getActiveForm(); 

  Logger.log(calculateAverage(form));
}

/**
 * Calculate the average score for each submitted response
 *
 * @param {Object} form      The form to be processed.
 * @return {Array}           2D array. First column respondent email, 
 *                             second column response average.
 */
function calculateAverage(form){

  var formResponses = form.getResponses();

  // If there aren't submitted responses, exit.
  if(formResponses.length == 0) return 'No responses';

  // Initialize output
  var output = [];

  for(var i = 0; i < formResponses.length ; i++){
    var itemResponses = formResponses[i].getGradableItemResponses();

    // Initialize scores array. Later it will be used to calculate the score average.
    var scores = [];
    for(var j = 0; j < itemResponses.length; j++){
      var score = itemResponses[j].getScore();
      scores.push(score);
    }

    // Average calculation. Reference https://stackoverflow.com/a/10624256/1595451
    var sum = scores.reduce(function(a, b) { return a + b; });
    var avg = sum / scores.length;

    // Add row
    var email = formResponses[i].getRespondentEmail();
    output.push([email,avg]);
  }

  return output;
}

Ссылка

Сумма массива и средняя

Ваш ответ на вопрос