(亂序版)檔案位置:https://docs.google.com/spreadsheets/d/17H9qGlBGif7IKfqRxJZXY8w5hBULLiiy40d_it6k5k8/edit?usp=sharing
2021/6/28 第一版
2021/6/29 增加亂序題份數可產多份不同順序的考卷(0表示依原題號順序)、答案亂序(0表示依原答案順序)
修改參數及貼入 CSV 題目,修改測驗名稱、題數、每題分數、最多選擇數,並貼上你有題庫光碟中取得的 CVS 檔案內容,最後按下<製作測驗表單>鍵(第一次使用要取得授權,說明在下方)。
在你的雲端硬碟中主目錄會產生一個和測驗名稱相同的檔案。
連點開啟,可以再修改題目內容等。
在右上方設定圖示,可以再設定是否一定要登入google 帳號、回答次數、是否出現正確答案及得分等。
程式
function main() {
//version 20210529
//let url = 'google試算表網址'; //試算表網址
var startRow = 7 ;
let sheet = SpreadsheetApp.getActiveSheet();
let isAllRequired = true; //是否每題都要作答 true, false
exam_name = sheet.getRange(1,2).getValue(); //測驗卷名稱
let questionSize = sheet.getRange(2,2).getValue(); //匯入題目數
let scores = sheet.getRange(3,2).getValue(); //每題配分
let optionsSize = sheet.getRange(4,2).getValue(); //題目選項數, 4個表示2,3,4個選項都會計數到
///以下不用編輯///////////////////////////////////////////////////////////////////////
let exam = {};
//exam.url = url;
exam.scores = scores;
exam.size = questionSize;
exam.rand_oder = sheet.getSheetValues(2, 4, 1, 1); //題目順序隨機出幾份 0 表示按原順序。
exam.rand_ans = sheet.getSheetValues(3, 4, 1, 1); //答案順序是否要隨機 0 表示按原答案
//取得試題
let getSheet = function (exam) {
let questions = [];
exam.name = exam_name ;
for (let i = 0; i < exam.size ; i++) {
question = {};
if (!sheet.getRange(startRow+i , 1).isBlank()) {
//題目
question.description = sheet.getSheetValues(startRow+i, 1, 1, 1);
//正確答案
question.answer = sheet.getSheetValues(startRow+i, 2, 1, 1);
let index = 1;
let options = [];
let startColumn = 3
//選項, 第三欄位到第七欄位,
for (let j = startColumn; j < startColumn + optionsSize; j++) {
if (!sheet.getRange( startRow+i, j).isBlank()) {
let option = {};
option.description = sheet.getSheetValues(startRow+i, j, 1, 1);
option.value = parseInt(question.answer) === index ? true : false;
options.push(option);
}
index += 1;
}
question.options = options;
questions.push(question);
}
}
exam.questions = questions;
return exam;
}
//出考卷
let doExam = function (exam , ran_num ) {
exam.name_copy = exam.name ;
if (ran_num > 0)
exam.name_copy = exam.name + "亂序_" + ran_num ;
let form = FormApp.create(exam.name_copy);
form.setIsQuiz(true);
let userinfo = form.addTextItem();
userinfo.setTitle('請輸入您的班級座號,例如六甲一號:60101');
userinfo.setRequired(true);
let userName = form.addTextItem();
userName.setTitle('請輸入您的姓名:');
userName.setRequired(true);
//題號順序改變
if (ran_num > 0 )
questions = shuffleArray(exam.questions);
else
questions = exam.questions;
for (let i = 0; i < questions.length; i++) {
//選擇題
let item = form.addMultipleChoiceItem();
item.setPoints(exam.scores);
item.setTitle(questions[i].description);
//答案亂序
if (exam.rand_ans > 0){
options = shuffleArray(questions[i].options) ;
}else {
options = questions[i].options;
}
let choices = [];
for (let j = 0; j < options.length; j++) {
choices.push(item.createChoice(options[j].description, options[j].value))
}
item.setChoices(choices);
item.setRequired(isAllRequired);
}
Logger.log("done.");
}
//陣列亂數
function shuffleArray(array) {
var i, j, temp;
for (i = array.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i + 1));
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
exam = getSheet(exam)
//亂序的份數
for (ran_num = 0 ; ran_num <= exam.rand_oder ; ran_num ++)
{
doExam(exam , ran_num );
}
Browser.msgBox( exam.name + " 制作完成!") ;
}