Как использовать цикл for с .createChoice в Google Apps Script, чтобы создать тест из листа? - PullRequest
0 голосов
/ 27 февраля 2019

Я использую Google Apps Script для создания форм Google из листа.Вопросы в строках и варианты вопросов в столбцах.

enter image description here Вот ссылка на страницу Google , если необходимо.

Этоявляется простой задачей при использовании .setChoiceValues(values)

if (questionType == 'CHOICE') {
  var choicesForQuestion = [];
  for (var j = 4; j < numberColumns; j++)
    if (data[i][j] != "")
      choicesForQuestion.push(data[i][j]);

  form.addMultipleChoiceItem()
    .setChoiceValues(choicesForQuestion);
}

Однако, когда я пытаюсь использовать .createChoice(value, isCorrect), параметры вызывают для value бытьстрока и isCorrect должны быть логическими.

Пример без цикла выглядит так:

  var item = FormApp.getActiveForm().addCheckboxItem();
  item.setTitle(data[3][1]);
  // Set options and correct answers
  item.setChoices([
    item.createChoice("chocolate", true),
    item.createChoice("vanilla", true),
    item.createChoice("rum raisin", false),
    item.createChoice("strawberry", true),
    item.createChoice("mint", false)
  ]);

Не могу понять, как добавить цикл.Прочитав другие посты, я попробовал следующее:

if (questionType == 'CHOICE') {
  var questionInfo = [];
  for (var j = optionsCol; j < maxOptions + 1; j++)
    if (data[i][j] != "")
      questionInfo.push( form.createChoice(data[i][j], data[i][j + maxOptions]) );

    form.addMultipleChoiceItem()
      .setChoices(questionInfo);
  }

optionsCol - это первый столбец вопросов. maxOptions - это количество параметров, разрешенных таблицей (в настоящее время 5).Информация isCorrect - 5 столбцов справа.

Однако это не работает, поскольку массив questionsInfo пуст.

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 27 февраля 2019

Возможно, ваша проблема связана с методом, на который вы ссылаетесь - Form#createChoice - не существует.Вам нужно вызвать MultipleChoiceItem#createChoice, сначала создав элемент:

/**
 * @param {Form} formObj the Google Form Quiz being created
 * @param {any[]} data a 1-D array of data for configuring a multiple-choice quiz question
 * @param {number} index The index into `data` that specifies the first choice
 * @param {number} numChoices The maximum possible number of choices for the new item
 */ 
function addMCItemToForm_(formObj, data, index, numChoices) {
  if (!formObj || !data || !Array.isArray(data)
      || Array.isArray(data[0]) || data.length < (index + 2 * numChoices))
  {
    console.error({message: "Bad args given", hasForm: !!formObj, info: data,
        optionIndex: index, numChoices: numChoices});
    throw new Error("Bad arguments given to `addMCItemToForm_` (view on StackDriver)");
  }
  const title = data[1];

  // Shallow-copy the desired half-open interval [index, index + numChoices).
  const choices = data.slice(index, index + numChoices);
  // Shallow-copy the associated true/false data.
  const correctness = data.slice(index + numChoices, index + 2 * numChoices);
  const hasAtLeastOneChoice = choices.some(function (c, i) {
    return (c && typeof correctness[i] === 'boolean');
  });
  if (hasAtLeastOneChoice) {
    const mc = formObj.addMultipleChoiceItem().setTitle(title);

    // Remove empty/unspecified choices.
    while (choices[choices.length - 1] === "") {
      choices.pop();
    }
    // Convert to choices for this specific MultipleChoiceItem.
    mc.setChoices(choices.map(function (choice, i) {
      return mc.createChoice(choice, correctness[i]);
    });
  } else {
    console.warn({message: "Skipped bad mc-item inputs", config: data, 
        choices: choices, correctness: correctness});
  }
}

Вы должны использовать вышеуказанную функцию, как описано в ее JSDoc, - передать ей экземпляр объекта Google Form для созданияэлемент викторины, массив деталей для вопроса и описание местоположения информации выбора в массиве деталей.Например:

function foo() {
  const form = FormApp.openById("some id");
  const data = SpreadsheetApp.getActive().getSheetByName("Form Initializer")
    .getSheetValues(/*row*/, /*col*/, /*numRows*/, /*numCols*/);

  data.forEach(function (row) {
    var qType = row[0];
    ...
    if (qType === "CHOICE") {
      addMCItemToForm_(form, row, optionColumn, numOptions);
    } else if (qType === ...
    ...
}

Ссылки

...