我正在制作一个Google表单,我想给它添加一些问题,但是这些问题应该是从随机抽取的,这些问题将出现在Google 中。为此需要做些什么?例如:我想从Google工作表中显示出20个问题库中的5个随机问题
P.s :我确实尝试过关于Stackoverflow的解决方案,但对我的目的并没有帮助。
发布于 2020-12-01 20:07:50
为了创建一个解决问题的脚本,我创建了一个示例表,如下所示:
其中A是问题,后面的列是选项。注意:如果您只需要生成没有任何选项的问题,您可以选择将其从工作表中删除。我包括了选项,因为这将是最坏的情况在你的问题。
因此,首先,我们需要有表单和电子表格的ID:
var formID = <FORM_ID>;
var ssID = <SPREADSHEET_ID>;
var fData = FormApp.openById(formID);
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Sheet1");
下一步是尝试从电子表格中生成问题:
function populateForm() {
// get all values from spreadsheet
var ssValues = wsData.getDataRange().getValues();
// traverse all values
for(var row = 0; row < ssValues.length; row++){
var newItem;
var options = [];
for(var col = 0; col < ssValues[row].length; col++){
var cellValue = ssValues[row][col];
switch(col) {
case 0:
// if question, add as item
newItem = fData.addListItem().setTitle(cellValue).getId();
break;
default:
// if not question, add as choice
options.push(cellValue);
}
}
// add accumulated options as choices for the recently added item
fData.getItemById(newItem).asListItem().setChoiceValues(options);
}
}
在这个步骤之后,您应该能够将所有的问题添加到表单中。现在,由于我们只需要生成5个随机问题,所以我添加了下面的函数供我们使用。
function getFiveRandomQuestions(array){
// randomly remove questions until 5 remains
for(var i = array.length - 1; i >= 5; i--){
array.splice(Math.floor(Math.random() * array.length), 1);
}
return array;
}
上面的函数接受一个数组(getValues()
的结果),然后随机地从它中删除项,直到只剩下5个条目。
下面是集成上述所有功能后的代码。注意:我添加了clearForm()
以删除现有项,所以每当我运行populateForm()
时表单就会重置。这是为了测试,以防你需要它。尽可能多地修改代码。
// Randomize Form from Sheets
var formID = <FORM_ID>;
var ssID = <SPREADSHEET_ID>;
var fData = FormApp.openById(formID);
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Sheet1");
function clearForm(){
// clears all items
var items = fData.getItems();
while(items.length > 0){
fData.deleteItem(items.pop());
}
}
function getFiveRandomQuestions(array){
// randomly remove questions until 5 remains
for(var i = array.length - 1; i >= 5; i--){
array.splice(Math.floor(Math.random() * array.length), 1);
}
return array;
}
function populateForm() {
// call clearForm to prevent appending newly randomized questions
clearForm();
var ssValues = wsData.getDataRange().getValues();
// remove random questions until 5 are remaining
var formItems = getFiveRandomQuestions(ssValues);
for(var row = 0; row < formItems.length; row++){
var newItem;
var options = [];
for(var col = 0; col < formItems[row].length; col++){
var cellValue = formItems[row][col];
switch(col) {
case 0:
// if question, add as item
newItem = fData.addListItem().setTitle(cellValue).getId();
break;
default:
// if not question, add as choice
options.push(cellValue);
}
}
// add accumulated options as choices for the recently added item
fData.getItemById(newItem).asListItem().setChoiceValues(options);
}
}
下面是示例输出:
请注意,这个答案很简单,仍然可以根据您的测试用例进行优化。如果有什么不清楚的地方,可以随意提问。
编辑:
如果您想添加硬编码的问题,您需要在循环之前添加它。
// remove random questions until 5 are remaining
var formItems = getFiveRandomQuestions(ssValues);
// start of hardcoded questions
fData.addListItem().setTitle('Name').getId();
fData.addListItem().setTitle('Email').getId();
// end of hardcoded questions
for(var row = 0; row < formItems.length; row++){
另外,如果您希望只有五个问题,并且已经通过硬代码获得了2个问题,那么我们需要将随机化函数减少到3而不是5。
// note that I renamed the function to getRandomQuestions so bear in mind to update the function call too
function getRandomQuestions(array){
for(var i = array.length - 1; i >= 3; i--){
array.splice(Math.floor(Math.random() * array.length), 1);
}
return array;
}
样本输出:
发布于 2020-12-07 08:39:33
对于有多个部分,您也可以使用分页。在你的情况下
fData.addPageBreakItem();
这将在表单的新页上形成一个部分。
https://stackoverflow.com/questions/65093674
复制相似问题