在谷歌表单上自动生成多项选择测验
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)上?如何删除?