在谷歌表单上自动生成多项选择测验

Posted

技术标签:

【中文标题】在谷歌表单上自动生成多项选择测验【英文标题】:Automatically generating multiple choice quizzes on google forms 【发布时间】:2017-11-15 11:39:19 【问题描述】:

我是一名教师,需要为我的学生创建许多多项选择测验,例如 this。

您会看到每个多项选择题的格式完全相同 - 一个问题以图片形式上传,然后是 4 个多项选择选项 - A、B、C 和 D。

我的问题是,有没有办法自动化这个过程?

每批问题都在一个 googledrive 文件夹中,并被命名为“1.png”、“2.png”、“3.png”等 - 这些将作为图像上传到 google 表单上。

在一个单独的文件夹中,我有一个 googlesheet 列出了每个问题的所有答案,看起来像 this。

所以电子表格中与答案(字母)匹配的数字对应于图像文件(例如,上面电子表格的第一行显示问题 1.png 的答案是 A)

在一个单独的文件夹中,我有另一个 googlesheet,其中包含错误和正确答案的反馈,看起来像 this。并非所有问题都有反馈。

是否可以从这些 googlesheets 和 png 文件自动生成测验?

感谢您花时间阅读所有这些内容,如果您能提出解决方案,请特别感谢?

【问题讨论】:

【参考方案1】:

对于想要从题库中随机选择给定数量的问题的提问者来说,这是一个解决方案。这不使用 google 表单,而是使用 html 表单。

这是代码(欢迎您改编): 我对代码有一些疑问,并更正了问题,然后进入并更新了代码。它更有条理,更容易理解......我希望。

代码.gs:

function onOpen() 
    SpreadsheetApp.getUi().createMenu('Questions Menu')
      .addItem('Questions', 'launchQuestionsDialog')
      .addToUi();

问题.gs

function getQuestions() 
  var ss=SpreadsheetApp.getActive();
  var cpData=getCpData();
  var qnum=cpData.qNum;
  var qa=getQAndA();
  var qi=getAnswerIndexes();
  var html='';
  var clr=['#f6d1ac','#c5e9bd'];
  for(var i=0;i<qa.length;i++) 
    html+=Utilities.formatString('<div id=d%s style="font-weight:bold;background-color:%s;padding:5px;"><span id="q%s">%s</span><input type="hidden" value="%s" class="hiding" />',qa[i][0],clr[i % 2],qa[i][0],qa[i][1],qa[i][0]);
    html+=Utilities.formatString('<input type="hidden" value="%s" class="hiding" />',qa[i][0]);
    for(var j=qi.firstIdx;j<=qi.lastIdx;j++) 
      if(qa[i][j]) 
        html+=Utilities.formatString('<br /><input type="radio" name="n%s" value="%s" />%s',qa[i][0],qa[i][j],qa[i][j]);
      
    
    html+='</div>'  
  
  html+='<div id="controls"><br /><input type="button" value="Submit" onClick="recordData();" /></div>';
  return html:html


function launchQuestionsDialog() 
  var userInterface=HtmlService.createHtmlOutputFromFile('questions').setWidth(800).setHeight(500);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, "The new Questions");


function selectTest() 
  var qA=selectQuestions(5,24);
  Logger.log(qA);


function selectQuestionIndexes(n,m) 
  var set=[];
  do 
    var i=Math.floor(Math.random()*(m));
    if(set.indexOf(i)==-1) 
      set.push(i);
    
  while(set.length<n);
  return set;


function getCpData() 
  var ss=SpreadsheetApp.getActive();
  var cpSh=ss.getSheetByName('ControlPanel');
  var cpRg=cpSh.getDataRange();
  var cpVa=cpRg.getValues();
  var qsrcSh=ss.getSheetByName(cpVa[1][0]);
  var adesSh=ss.getSheetByName(cpVa[1][1]);
  var qnum=cpVa[1][2];
  var cpData='qSrc':cpVa[1][0],'aDes':cpVa[1][1],'qNum':cpVa[1][2];
  return cpData;


function getAnswerIndexes() 
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName(getCpData().qSrc);
  var rg=sh.getRange(1,1,1,sh.getLastColumn());
  var vA=rg.getValues();
  var re=/Answer \d1,2/i;
  var fidx=0;
  var lidx=0;
  var first=true;
  vA[0].forEach(function(e,i)if(String(vA[0][i]).match(re))if(first)fidx=i;first=false;elselidx=i;);
  return 'firstIdx':fidx,'lastIdx':lidx;


function recordData(responses) 
  if(responses) 
    var ss=SpreadsheetApp.getActive();
    var sheetname=getCpData().aDes;
    var sh=ss.getSheetByName(sheetname);
    var ts=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:ss"); 
    responses.forEach(function(e,i)e.splice(0,0,ts);sh.appendRow(e));
  
  return true;


function doGet() 
  return HtmlService.createHtmlOutputFromFile('questions');


function getQAndA() 
  var qa=[];
  var cma=',';
  var ss=SpreadsheetApp.getActive();
  var cpData=getCpData();
  var qsrcSh=ss.getSheetByName(cpData.qSrc);
  var qsrcRg=qsrcSh.getRange(2,1,qsrcSh.getLastRow()-1,qsrcSh.getLastColumn());
  var qsrcVa=qsrcRg.getValues();
  var qs=selectQuestionIndexes(cpData.qNum,qsrcVa.length);
  var aIdxs=getAnswerIndexes();
  for(var i=0;i<qsrcVa.length;i++) 
    var qas='';
    if(qs.indexOf(i)>-1) 
      qas+=qsrcVa[i][0] + cma + qsrcVa[i][1];
      for(j=aIdxs.firstIdx;j<=aIdxs.lastIdx;j++) 
        if(qsrcVa[i][j]) 
            qas+= cma + qsrcVa[i][j];
        
      
      qa.push(qas.split(cma));
    
  
  return qa;

questions.html:

<!DOCTYPE html>
<html>
<head>
 <!--<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>-->
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
 <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
 <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script>
    $(function() 
        google.script.run
        .withSuccessHandler(function(hObj)
          $('#container').html(hObj.html);
        )
        .getQuestions();
      );
    function recordData() 
      var responses=[];
      var cm=',';
      var divs = document.getElementsByTagName("div");
      for(var i=0;i<divs.length;i++) 
        var id=divs[i].getAttribute(['id']);
        var qnum=$('div#' + id + ' ' + 'input.hiding').val();
        //var question=document.getElementById(id).innerHTML;
        var question=$('#q' + qnum ).text(); 
        var answer=$('input[name="n' + qnum + '"]:checked').val();
        if(id!='controls') 
          if(!answer) 
            window.alert('You did not answer question number ' + Number(i+1) + '. It is a requirement of this survey that all questions must be answered.' );
            return;
          else 
            var end='is near';
            var s=qnum + cm + question + cm + answer;
            responses.push(s.split(cm));
          
        
      

      google.script.run
      .withSuccessHandler(displayThanks)
      .recordData(responses);
    
    function displayThanks() 
      var divs = document.getElementsByTagName("div");
      for(var i=0;i<divs.length;i++) 
        divs[i].style.cssText="display:none;text-align:center";
      
      var elemDiv = document.createElement('div');
      elemDiv.innerHTML="<br /><h1>Thank You For Your Participation in This Survey</h1>";
      document.body.appendChild(elemDiv);
    
    console.log('My Code');
    </script>
    <style>
    #replydisplay:none;
    #collectdisplay:block;
    body  
    background-image: url("http://myrabridgforth.com/wp-content/uploads/blue-sky-clouds.jpg");
    background-color: #ffffff;
    background-repeat: no-repeat;
    background-position: left bottom;
    
    </style>
</head>  
  <body>
    <div id="container">
    </div>
  </body>
</html>

电子表格上的各个选项卡如下所示:

控制面板选项卡:

问题库选项卡:

Test1 选项卡:

希望这对您有所帮助。

【讨论】:

哇!我真的在寻找这样的东西。看到你的名字后,甚至没有阅读整篇文章就复制和粘贴了……而且效果几乎完美!我收到的问题很少有额外的字符。无法在此处添加图像,因此我在下面发布了该图像以及另一件事……请您添加一种方法,以便我也可以保留参与者的数据吗?比如姓名、邮箱等?【参考方案2】:

克服高密度地区的问题 建议使用超密集网络。超密集网络 保持恒定的连接性,数据速度在高度 人口稠密的地区。

【讨论】:

欢迎来到 SO!感谢您花时间写一个答案。请查看How to write a good answer。您的回答似乎没有回答问题,并且缺少很多上下文,因此不太可能有帮助。

以上是关于在谷歌表单上自动生成多项选择测验的主要内容,如果未能解决你的问题,请参考以下文章

单击标记时,新按钮会自动出现在谷歌地图(Android)上?如何删除?

如何分隔不同列中的多项选择短语(谷歌表单)?

在谷歌表单时间戳列上查询“今天”?

如何在谷歌地图上画线

在 Google 测验表格之间复制项目 .getFeedbackForCorrect

在数据库中存储多项选择测验 - 确定模式