我可以随机化 MultipleChoiceItem 中的项目吗?

Posted

技术标签:

【中文标题】我可以随机化 MultipleChoiceItem 中的项目吗?【英文标题】:Can I randomize items in MultipleChoiceItem? 【发布时间】:2020-05-23 12:37:49 【问题描述】:

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

我想在重新加载 Google 表单时随机播放 MultipleChoiceItem 中的项目。

下面是我当前脚本的一部分,稍微修改了this code,如下所示。

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

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

【问题讨论】:

"当谷歌表单被重新加载时" 你的意思是当表单的编辑器版本被重新加载或者当用户刷新他收到的表单 URL 时?第一个是可能的,第二个不是没有第一个。 感谢您的回复!我希望实施第二个,以便为每个用户(学生)提供相同的 qiuz,但问题和选择的顺序不同。 setShuffleQuestions() 可能用于随机化问题,但我找不到用于随机播放项目的类似功能。 不幸的是,不存在类似的洗牌方法。我用我能想到的最佳解决方法更新了我的答案。 我明白了。我会尝试你提到的替代解决方案。非常感谢您的帮助! 感谢您抽出宝贵时间回答我的问题。现在,我使用学习管理系统 Moodle 代替谷歌表格,使用来自测验库的随机项目进行测试。再次感谢您的帮助。 【参考方案1】:

正如所解释的,对此没有直接的答案,考虑到有一个通过前端界面随机播放选项顺序的选项,这相当令人惊讶。 (see here)

对我来说,每 1 分钟触发一次重新洗牌的提议效率太低,并且不能确保每个用户的顺序都会改变。在我看来,一种不太糟糕的方法(虽然不是解决方案)是手动创建一个检查了 Shuffle 选项顺序的MultipleChoiceItem,然后是duplicate the MultipleChoiceItem,而不是创建一个新的。

您需要有一些硬编码的引用,例如 get the ID 的 MultipleChoiceItem ,但是一旦有了这些,您就可以根据需要不断创建尽可能多的问题,从而完全按照这个问题的要求提出问题。

这是一个示例项目以及一个在表单中显示所有多项选择项目 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());
  

【讨论】:

【参考方案2】: 为了在每次重新加载表单时对值进行洗牌,您需要使用 onOpen trigger 将脚本绑定到表单 检索所有问题并为每个问题检索选项 使用 shuffle 函数随机化选择 将打乱的选项重新分配给问题

示例:

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 这样的方法。 目前您所能做的只是一种解决方法,例如您可以绑定到installable time-driven trigger 上方的示例,这将以所需的时间间隔(最短为一分钟)随机播放项目。这并不能保证每个用户都会看到不同的测验,但至少每分钟测验都会有所不同。

【讨论】:

以上是关于我可以随机化 MultipleChoiceItem 中的项目吗?的主要内容,如果未能解决你的问题,请参考以下文章

随机化弹性盒顺序

在 Java 中随机化整数数组的最快方法

任何好的教程可以帮助我创建用于在 C、C++ 中随机化的头文件 [关闭]

在砌体中随机化砖块

是否可以使用 VTL 随机化 DynamoDB 查询结果?

随机化整数行为