iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0

上一次講到的是取得資料範圍後再讀取裡面的內容
可是通常出題應該要隨機出題
不然永遠只會寫到相同的題目
另外本篇也會講如何自動找題目呈現的分頁寫入


首先說隨機挑題
由於我平時工作主要的語言是 python
所以我一開始在想有沒有向python 那樣的 random.sample
結果找來找去好像沒有QQ
(也有可能是我沒找到,如果知道怎麼做的捧油歡迎留言告訴我)

所以我使用的是取隨機值排序後取前k個

function randomChoose(total_number, want_number){
  /*
  隨機選題,回傳被選中的題號
  total_number : 該章節題庫的總題數
  want_number  : 該章節要出題的題數
  */

  // 取隨機值
  var random_list = [];
  var count = 0;
  while (count<total_number){
    random_list.push(Math.random());
    count = count + 1;
  }
  
  // 將隨機值由大到小排列
  sorted = random_list.slice().sort(function(a,b){return b-a});
  
  // 如果是前 k 個就放入要回傳的list
  result = [];
  for (var s in random_list){
    if (sorted.indexOf(random_list[s])<want_number){
      result.push(s);
    }
  }
  return result;
}

搞定隨機選題後
就可以來看看如何寫到新的頁面了

如果你想要指定寫入的分頁
例如我自己有一個「出題呈現」的分頁
你就可以用 var show_ques = SpreadSheetApp.getActiveSpreadsheet().getSheetByName(你的分頁名稱)

在這裡要注意的是
因為我的這份google script 是用google spread sheet → 工具 → 指令碼編輯器 開啟的
所以使用 SpreadSheetApp.getActiveSpreadsheet() 會直接連動到這個google spreadsheet
如果你是在google apps script 開啟的專案
需要改為SpreadSheetApp.openById(你的試算表ID)


如果你也跟我一樣習慣一個章節用一個分頁當作紀錄
就可以用getSheetByName 開啟那個章節的題庫抓題
再利用getSheetByName 把抓到的題目放到你要呈現的分頁上

另外在寫入時建議使用 getValues 一次寫完比較快
有點像是pymysql 中的 executemany
才不容易超過google script 的運行時間限制!!

所以目前題庫抓題、出題的基本都會了
然後就可以依照題型往google form 出題了!!
再接下來會講「回應試算表」的部分
也就是與google form 連動的回應紀錄的部分~


上一篇
[DAY 15] getValues 與 setValues
下一篇
[DAY 17] 回應試算表
系列文
一份考卷不夠你可以出兩份!用 google apps script 出線上考題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言