Могу ли я рандомизировать элементы в MultipleChoiceItem? - PullRequest
0 голосов
/ 07 февраля 2020

Я новичок в GoogleAppsScript и теперь делаю тесты в форме Google и электронной таблице с помощью GAS.

Я хочу перетасовать элементы в MultipleChoiceItem при перезагрузке формы Google.

A часть моей нынешней рукописи, слегка измененная форма , этот код , представлена ​​ниже.

//vars from spreadsheet
var form = FormApp.openById(id);
var ss = SpreadsheetApp.openById(question_bank_ID);
var text = sheet.getSheetValues(questions[i]+1, 2, 1, 1)[0][0];
var options = sheet.getSheetValues(questions[i]+1, 5, 1, 5)[0];
var ans = sheet2.getSheetValues(questions[i]+1, 5, 1, 5)[0];

//MultipleChoiceItem
var mc = form.addMultipleChoiceItem().setTitle(text);
        mc.setPoints(1) // set point 
         // add choices with isCorrect
        while (options[options.length - 1] === "") {
          options.pop();
        }
        mc.setChoices(options.map(function (options, i) {
          return mc.createChoice(options, ans[i]);
        }
                                 )
                      )

Может кто-нибудь сказать, пожалуйста, решение? Спасибо за вашу помощь!

1 Ответ

1 голос
/ 07 февраля 2020
  • Чтобы перетасовывать значения при каждой перезагрузке формы, вам необходимо привязать к своей форме скрипт с onOpen триггером
  • Получить все вопросы и для каждого вопроса извлекайте варианты
  • Используйте функцию перемешивания, чтобы рандомизировать варианты
  • Назначьте перемешанные варианты обратно на вопрос

Пример:

function onOpen(){
  form = FormApp.getActiveForm();
  var questions = form.getItems();
  for (var i =0; i < questions.length; i++){
    var question = questions[i];
    var choices = question.asMultipleChoiceItem().getChoices();
    var newChoices = shuffle(choices);
    question.asMultipleChoiceItem().setChoices(newChoices);
  }

}


function shuffle(array) {
  for (var i = array.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  return array;
}

ОБНОВЛЕНИЕ:

Если вы хотите дать каждому пользователю одну и ту же викторину, но со случайными вопросами, прямого способа сделать это не существует - до сих пор не существует метода типа setShuffleItems. Все, что вы можете сделать на данный момент, - это обходной путь, например, , который вы можете привязать к образцу выше устанавливаемого временного триггера , который будет перетасовывать элементы в желаемые интервалы (минимум один минуты). Это не гарантирует, что каждый пользователь будет видеть разные тесты, но, по крайней мере, каждую минуту тест будет отличаться.

...