彰化一整天的論壇

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

V6.0自動選擇題題庫產生器

[複製鏈接]
發表於 2021-6-11 15:57:18 | 顯示全部樓層 |閱讀模式
exam_v6.jpg


建立複本再使用


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

  8.   作者:蔡明和
  9.   電子郵件:imingho@gmail.com
  10.   
  11.     v6.0 2021.06.11  第六版
  12.     新增
  13.     1.可設定題目是否亂數

  14.     修改
  15.     1.選項改成有5個選項
  16.     2.修正題數0表示所選範圍之全部資料
  17.   
  18.   */
  19.   
  20.   var ss = SpreadsheetApp.getActiveSpreadsheet();

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

  24.     ];

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

  37.   
  38.   
  39.   var sheet=SpreadsheetApp.getActiveSheet();  //取得目前工作表

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

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

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

  43.   var examSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(exam);
  44.   
  45.   var examname = sheet.getRange("B2").getValue().toString(); //考卷名稱

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

  47.   form.setTitle(examname); //設定試卷名稱

  48.   var examRequired=sheet.getRange("B12").getValue(); //是否必填


  49.   var AnswerRand=sheet.getRange("B13").getValue(); //答案是否亂數

  50.   var QuestionRand=sheet.getRange("B15").getValue(); //出題是否亂數
  51.   

  52.   //清除之前記錄
  53.   var items = form.getItems();
  54.   
  55.   Logger.log("I="+items.length);

  56.   for (var i=items.length-1; i>=startNum-1; i--) {
  57.     form.deleteItem(i);
  58.   }
  59.   
  60.   
  61.   form.setIsQuiz(true);  //設定表單為考試

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

  65.   var min,max;
  66.   var min=sheet.getRange("B4").getValue();
  67.   var max=sheet.getRange("B5").getValue();

  68.   if(n==0)
  69.   {
  70.     n=max-min+1;
  71.   }

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

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

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

  75.   var QuestionType=sheet.getRange("B9").getValue();  //答案類型
  76.   
  77.   var score=100/n;  //計算每題分數
  78.   
  79.   var answer;//正確答案

  80.   var question_no=[];

  81.   if(QuestionRand=="是")
  82.     question_no=get_rand(min,max,n);
  83.   else
  84.     question_no=get_no(min,max,n);

  85.   var data;

  86.   
  87.   var OptionOffset=0;


  88.   
  89.   var exam_no;//取得題號
  90.   
  91. var reason;//詳解

  92.   var isComment;//是否有詳解
  93.   
  94.   //Logger.log(question_no);

  95.   //檢查是否有詳解
  96.   if(examSheet.getRange(1,m-1).getValue()=="" ||  examSheet.getRange(1,m).getValue()=="")
  97.     {  //有詳解
  98.         m=m-2;
  99.         isComment=true;
  100.     }

  101.   var t;
  102.   var t1;

  103.   for(i=0;i<n;i++){   //從第0筆開始讀取  
  104.     //var item = form.addListItem();//下拉選單
  105.     exam_no=question_no[i]+1;//轉換成第幾列
  106.     if(examType=="選擇題")
  107.       item = form.addMultipleChoiceItem();//選擇題
  108.     else
  109.       item = form.addListItem();//下拉式選單

  110.     var data="";
  111.     if(showNo=="是")
  112.     {
  113.         data=(i+1)+'.';

  114.     }
  115.     Logger.log(exam_no);
  116.     data+=examSheet.getRange(exam_no,2).getValue();
  117.     if(showExamNo=="是")
  118.       data+=',原題號('+examSheet.getRange(exam_no,1).getValue()+')';

  119.     Logger.log(data);

  120.     answer=parseInt(examSheet.getRange(exam_no,3).getValue(),10);
  121.     item.setTitle(data);





  122.     var answers=[];//設定答案選項

  123.       if(AnswerRand=="是")
  124.       {
  125.         //產一位移數數字1到3
  126.         OptionOffset=parseInt(3* Math.random())+1;
  127.       }

  128.     for(j=4;j<=m;j++){  //從第4欄往右讀取


  129.    
  130.       switch(QuestionType)
  131.       {
  132.       case "數字1.2.3.4.5.":
  133.         data=(j-3)+'.';
  134.         break;
  135.       case "數字(1)(2)(3)(4)(5)":
  136.         data="("+(j-3)+')';
  137.         break;
  138.       case "英文(A)(B)(C)(D)(E)":
  139.         data="("+String.fromCharCode(j-3+64)+')';
  140.         break;   
  141.       case "英文A.B.C.D.E.":   
  142.         data=String.fromCharCode(j-3+64)+'.';
  143.         break;
  144.       case "無任何提示":           
  145.         data="";
  146.         break;
  147.       }
  148.        t=(j-4+OptionOffset)%(m-4+1)+4;
  149.        data+=examSheet.getRange(exam_no,t).getValue(); //取得題目選項

  150.        //t1=(j+OptionOffset)%(m-4+1);
  151.        t1=(m-4+1+answer-OptionOffset-1)%(m-4+1);//計算位移後的答案
  152.        Logger.log(t+"-"+answer+"-"+OptionOffset+"-"+t1+"-"+data);
  153.        answers[j-4]=item.createChoice(data, t1==(j-4)); //陣列從0開始,儲存格是從1開始
  154.     }

  155.     if(isComment==true)
  156.     {
  157.        reason=examSheet.getRange(exam_no,m+2).getValue();
  158.         if(reason!='')
  159.         {
  160.           item.setFeedbackForIncorrect(
  161.           FormApp.createFeedback().setText(reason).build());
  162.           item.setFeedbackForCorrect(
  163.           FormApp.createFeedback().setText(reason).build());
  164.         }
  165.     }


  166.     item.setChoices(answers);//填入選項
  167.     if(examRequired=="是")
  168.        item.setRequired(true); //設為必填
  169.     item.setPoints(score);//設定每題分數
  170.   }
  171.   sheet.getRange("B17").setValue(form.getPublishedUrl());
  172.   sheet.getRange("B18").setValue(form.getEditUrl());
  173.   //Logger.log('公開網址: ' + form.getPublishedUrl());
  174.   //Logger.log('修改網址: ' + form.getEditUrl());  
  175.   Browser.msgBox('執行結果','公開網址: ' + form.getPublishedUrl()+'\\n修改網址: ' + form.getEditUrl(), Browser.Buttons.OK);
  176. }

  177. function add_form()
  178. {
  179.    
  180.   var sheet=SpreadsheetApp.getActiveSheet();  //取得目前工作表

  181.   var examname = sheet.getRange("B2").getValue().toString(); //題庫工作表

  182.   var field = sheet.getRange("B14").getValue().toString(); //欄位名稱

  183.   var form = FormApp.create(examname);  //建立表單

  184.   var fields=field.split(",");

  185.   for(var i=0;i<fields.length;i++)
  186.   {
  187.     var item=form.addTextItem();
  188.     item.setTitle(fields[i]);
  189.     item.setRequired(true); //設為必填
  190.   }

  191.   form.addPageBreakItem().setTitle(examname); //設定區段

  192.   sheet.getRange("B10").setValue(form.getEditUrl());
  193.   sheet.getRange("B17").setValue(form.getPublishedUrl());
  194.   sheet.getRange("B18").setValue(form.getEditUrl());
  195.   Browser.msgBox('執行結果','公開網址: ' + form.getPublishedUrl()+'\\n修改網址: ' + form.getEditUrl(), Browser.Buttons.OK);
  196. }

  197. function get_no(min,max,n)
  198. {
  199.   var question_no=[];
  200.   var i,m=0;

  201.   for(var i=min;i<=max;i++)
  202.   {
  203.     m=m+1;
  204.     question_no[i-min]=i;
  205.     if(m==n)
  206.       break;
  207.   }
  208.   return question_no;

  209. }

  210. function get_rand(min,max,n)
  211. {
  212.   var question_no=[];
  213.   var m,temp;

  214.   for(i=min;i<=max;i++)
  215.   {
  216.     question_no[i-min]=i;
  217.   }
  218.   for(i=0;i<n;i++)
  219.   {
  220.     m=parseInt((max-min+1)* Math.random());
  221.     temp=question_no[i];
  222.     question_no[i]=question_no[m];
  223.     question_no[m]=temp;
  224.   }

  225.   return question_no;
  226. }

  227. function test_rand()
  228. {
  229.   var min,max;
  230.   var question_no=[];
  231.   var n,m,temp;
  232.   min=1;
  233.   max=20;
  234.   n=10;
  235.   for(i=min;i<=max;i++)
  236.   {
  237.     question_no[i-min]=i;
  238.   }
  239.   for(i=0;i<n;i++)
  240.   {
  241.     m=parseInt((max-min+1)* Math.random());
  242.     temp=question_no[i];
  243.     question_no[i]=question_no[m];
  244.     question_no[m]=temp;
  245.   }

  246.   Logger.log(question_no);
  247. }
  248. function test1()
  249. {
  250.    var sheet=SpreadsheetApp.getActiveSheet();  //取得目前工作表

  251.   var examSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("題庫");
  252.   
  253.   var examname = examSheet.getRange("A2").getValue().toString(); //考卷名稱
  254.   


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

  258.   var min,max;
  259.   var min=sheet.getRange("B3").getValue();
  260.   var max=sheet.getRange("B4").getValue();
  261.   
  262.   var score=100/(n-1);  //計算每題分數

  263. }
  264. function GetSheetNames() {
  265.   //取得所有工作表到陣列
  266.   var out = new Array()
  267.   var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  268.   for (var i=0 ; i<sheets.length ; i++)
  269.   {
  270.     if(sheets[i].getName()!="參數設定")
  271.       out.push( [ sheets[i].getName() ] )
  272.   }
  273.   
  274.   return out
  275. }
  276. function GetExamSheet()
  277. {
  278.   //設定下拉選項
  279.    var data;
  280.    data=GetSheetNames();


  281.   var spreadsheet = SpreadsheetApp.getActive();
  282.   spreadsheet.getRange('B1').activate();
  283.   spreadsheet.getRange('B1').setDataValidation(SpreadsheetApp.newDataValidation()
  284.   .setAllowInvalid(true)
  285.   .requireValueInList(data, true)
  286.   .build());
  287. }

複製代碼



回復

使用道具 舉報

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

本版積分規則

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

GMT+8, 2021-9-21 15:34 , Processed in 0.096252 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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