彰化一整天的論壇

 找回密碼
 立即註冊
查看: 82|回復: 0

【Google表單教學】自動選擇題題庫產生器 (可選範圍+答案...

[複製鏈接]
發表於 2021-4-2 16:31:52 | 顯示全部樓層 |閱讀模式
本帖最後由 imingho 於 2021-4-4 12:43 編輯

自動選擇題題庫產生器 (可選範圍+答案類型+讀入工作表+固定網址)
google_from_exam_fix_url.jpg

請建立複本再使用.
https://docs.google.com/spreadsheets/d/1GaJQU83m9nTbdw_OLUxZI9NhyArz89xRRrY1B4UIQU4/edit?usp=sharing

  1. function onOpen() {
  2.   //update
  3.   /*
  4.   彰化一整天的blog: http://blog.bestdaylong.com
  5.   彰化一整天的論壇: http://discuz.bestdaylong.com
  6.   
  7.   影音教學: https://youtu.be/dNQvhb_T34c

  8.   作者:蔡明和
  9.   電子郵件:imingho@gmail.com
  10.   
  11.     v4.0 2021.04.04  第四版
  12.   
  13.   */
  14.   
  15.   var ss = SpreadsheetApp.getActiveSpreadsheet();

  16.   // These are the 2 menu entries
  17.   var menuEntries = [
  18.     {name: "自動產生選擇題題庫", functionName: "bestdaylong_auto_google_form_quiz"},

  19.     ];

  20.   // After defining the menu entries, then you define the menu itself
  21.   ss.addMenu("彰化一整天Blog工具", menuEntries);
  22.   
  23. }
  24. function bestdaylong_auto_google_form_quiz() {
  25.   //自動產生Google表單試題 by 彰化一整天blog
  26.   
  27.   //程式碼及討論 http://discuz.bestdaylong.com/thread-39245-1-1.html
  28.   
  29.   //影音教學: https://youtu.be/dNQvhb_T34c
  30.   
  31.   //儲存格格式 編號        題目        答案        選項1        選項2        選項3        選項4

  32.   
  33.   
  34.   var sheet=SpreadsheetApp.getActiveSheet();  //取得目前工作表

  35.   var exam = sheet.getRange("B1").getValue().toString(); //題庫工作表

  36.   var formUrl=sheet.getRange("B10").getValue().toString();

  37.   var startNum=sheet.getRange("B11").getValue();

  38.   var examSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(exam);
  39.   
  40.   var examname = sheet.getRange("B2").getValue().toString(); //考卷名稱

  41.   var form = FormApp.openByUrl(formUrl);



  42.   

  43.   //清除之前記錄
  44.   var items = form.getItems();
  45.   
  46.   Logger.log("I="+items.length);

  47.   for (var i=items.length-1; i>=startNum-1; i--) {
  48.     form.deleteItem(i);
  49.   }
  50.   
  51.   
  52.   form.setIsQuiz(true);  //設定表單為考試

  53.   var m=examSheet.getLastColumn();//取得欄數
  54.   var n=sheet.getRange("B6").getValue();//取得筆數
  55.   var i,j;//迴圈變數   

  56.   var min,max;
  57.   var min=sheet.getRange("B4").getValue();
  58.   var max=sheet.getRange("B5").getValue();

  59.   var examType=sheet.getRange("B3").getValue();

  60.   var showExamNo=sheet.getRange("B7").getValue();  //是否顯示原題號

  61.   var showNo=sheet.getRange("B8").getValue();  //是否顯示題號

  62.   var QuestionType=sheet.getRange("B9").getValue();  //答案類型
  63.   
  64.   var score=100/n;  //計算每題分數
  65.   
  66.   var answer;//正確答案

  67.   var question_no=[];

  68.   question_no=get_rand(min,max,n);

  69.   var data;

  70.   
  71.   
  72.   var exam_no;//取得題號
  73.   
  74.   Logger.log(question_no);

  75.   for(i=0;i<n;i++){   //從第0筆開始讀取  
  76.     //var item = form.addListItem();//下拉選單
  77.     exam_no=question_no[i]+1;//轉換成第幾列
  78.     if(examType=="選擇題")
  79.       item = form.addMultipleChoiceItem();//選擇題
  80.     else
  81.       item = form.addListItem();//下拉式選單

  82.     var data="";
  83.     if(showNo=="是")
  84.     {
  85.         data=(i+1)+'.';

  86.     }
  87.     Logger.log(exam_no);
  88.     data+=examSheet.getRange(exam_no,2).getValue();
  89.     if(showExamNo=="是")
  90.       data+=',原題號('+examSheet.getRange(exam_no,1).getValue()+')';
  91.       
  92.     answer=examSheet.getRange(exam_no,3).getValue();
  93.     item.setTitle(data);
  94.     var answers=[];//設定答案選項
  95.     for(j=4;j<=m;j++){  //從第4欄往右讀取
  96.       switch(QuestionType)
  97.       {
  98.       case "數字1.2.3.4.":
  99.         data=(j-3)+'.';
  100.         break;
  101.       case "數字(1)(2)(3)(4)":
  102.         data="("+(j-3)+')';
  103.         break;
  104.       case "英文(A)(B)(C)(D)":
  105.         data="("+String.fromCharCode(j-3+64)+')';
  106.         break;   
  107.       case "英文A.B.C.D.":   
  108.         data=String.fromCharCode(j-3+64)+'.';
  109.         break;
  110.       case "無任何提示":           
  111.         data="";
  112.         break;
  113.       }
  114.        data+=examSheet.getRange(exam_no,j).getValue(); //取得題目選項

  115.        answers[j-4]=item.createChoice(data, answer==(j-3)); //陣列從0開始,儲存格是從1開始
  116.     }
  117.     item.setChoices(answers);//填入選項
  118.     item.setRequired(true); //設為必填
  119.     item.setPoints(score);//設定每題分數
  120.   }
  121.   sheet.getRange("B15").setValue(form.getPublishedUrl());
  122.   sheet.getRange("B16").setValue(form.getEditUrl());
  123.   //Logger.log('公開網址: ' + form.getPublishedUrl());
  124.   //Logger.log('修改網址: ' + form.getEditUrl());  
  125.   Browser.msgBox('執行結果','公開網址: ' + form.getPublishedUrl()+'\\n修改網址: ' + form.getEditUrl(), Browser.Buttons.OK);
  126. }

  127. function get_rand(min,max,n)
  128. {
  129.   var question_no=[];
  130.   var m,temp;

  131.   for(i=min;i<=max;i++)
  132.   {
  133.     question_no[i-min]=i;
  134.   }
  135.   for(i=0;i<n;i++)
  136.   {
  137.     m=parseInt((max-min+1)* Math.random());
  138.     temp=question_no[i];
  139.     question_no[i]=question_no[m];
  140.     question_no[m]=temp;
  141.   }

  142.   return question_no;
  143. }

  144. function test_rand()
  145. {
  146.   var min,max;
  147.   var question_no=[];
  148.   var n,m,temp;
  149.   min=1;
  150.   max=20;
  151.   n=10;
  152.   for(i=min;i<=max;i++)
  153.   {
  154.     question_no[i-min]=i;
  155.   }
  156.   for(i=0;i<n;i++)
  157.   {
  158.     m=parseInt((max-min+1)* Math.random());
  159.     temp=question_no[i];
  160.     question_no[i]=question_no[m];
  161.     question_no[m]=temp;
  162.   }

  163.   Logger.log(question_no);
  164. }
  165. function test1()
  166. {
  167.    var sheet=SpreadsheetApp.getActiveSheet();  //取得目前工作表

  168.   var examSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("題庫");
  169.   
  170.   var examname = examSheet.getRange("A2").getValue().toString(); //考卷名稱
  171.   


  172.   var m=examSheet.getLastColumn();//取得欄數
  173.   var n=sheet.getRange("B5").getValue();//取得筆數
  174.   var i,j;//迴圈變數   

  175.   var min,max;
  176.   var min=sheet.getRange("B3").getValue();
  177.   var max=sheet.getRange("B4").getValue();
  178.   
  179.   var score=100/(n-1);  //計算每題分數

  180. }
  181. function GetSheetNames() {
  182.   //取得所有工作表到陣列
  183.   var out = new Array()
  184.   var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  185.   for (var i=0 ; i<sheets.length ; i++)
  186.   {
  187.     if(sheets[i].getName()!="參數設定")
  188.       out.push( [ sheets[i].getName() ] )
  189.   }
  190.   
  191.   return out
  192. }
  193. function GetExamSheet()
  194. {
  195.   //設定下拉選項
  196.    var data;
  197.    data=GetSheetNames();


  198.   var spreadsheet = SpreadsheetApp.getActive();
  199.   spreadsheet.getRange('B1').activate();
  200.   spreadsheet.getRange('B1').setDataValidation(SpreadsheetApp.newDataValidation()
  201.   .setAllowInvalid(true)
  202.   .requireValueInList(data, true)
  203.   .build());
  204. }


複製代碼


回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|彰化一整天的論壇(Excel,Office)

GMT+8, 2021-4-11 02:22 , Processed in 0.100660 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表