我可以随机化多项选择项中的项目吗?



我是GoogleAppsScript的新手,现在使用GAS在Google表单和电子表格中进行测验。

我想在重新加载谷歌表单时打乱多项选择项中的项目。

下面介绍我当前 scirpt 的一部分,略微修改了此代码。

//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]);
}
)
)

有人可以告诉我一个解决方案吗?感谢您的帮助!

  • 为了在每次重新加载表单时随机排列值,您需要将带有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的方法。 您目前所能做的只是一个解决方法,例如,您可以绑定到可安装的时间驱动触发器上方的示例,该触发器将按所需的间隔(最小值为一分钟(洗牌项目。这并不能保证每个用户都会看到不同的测验,但至少每分钟测验都会有所不同。

如前所述,没有直接的答案,考虑到有一个通过前端界面随机播放选项顺序的选项,这是相当令人惊讶的。(看这里(

对我来说,每 1 分钟触发一次洗牌的建议效率太低,并不能确保每个用户的顺序都会改变。在我看来,一个不太糟糕的方法(虽然不是解决方案(是手动创建一个选中随机选项顺序的MultipleChoiceItem,然后复制 MultipleChoiceItem,而不是创建一个新项目。

你需要有一些硬编码的参考,例如获取MultipleChoiceItem的ID,但是一旦你有了,你可以根据需要不断创建尽可能多的问题,这些问题将完全按照这个问题的要求去做。

下面是一个示例项以及一个用于在窗体中显示所有多项选择项的 ID 的函数。它并不完美,但也许是一种替代方案。

function makeShuffledQuestion() {
const theIDofShuffleQuestion = 2???????1; //<--- must find by getID()
const theShuffleQuestion = form.getItemById(theIDofShuffleQuestion);
//next line use duplicate, or start loops to duplicate types that
var mc = theShuffleQuestion.duplicate();
mc.setTitle("This one is new!");
mc.setPoints(1);
mc.setChoices([
mc.createChoice("alpha", fale),
mc.createChoice("bravo", false),
mc.createChoice("charlie", true),
mc.createChoice("delta", false)
])
}
function listAllItemsID() {
//function will display all multiplie choice items with title and ID
var allItems = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE);
for (var i = 0; i < allItems.length; i++) {
Logger.log(allItems[i].getTitle() + "  ID:" + allItems[i].getId().toString());
}
}

最新更新