はじめに
毎年数回医学部の学生に授業をする機会があります.
みなさんは授業を聞くのは得意ですか?
私は苦手です.
始まる前は興味あり!と思っていたような授業でも、ずっと聞いていると睡魔に襲われてしまいます.
今回症候学という症状からどんな病気かを考えるという授業の中で、自分と同じような学生さんを退屈させないために授業でクイズ大会をやってみました.
具体的な流れ
- 学生さんに授業の初めに該当のLINEアカウントを友だち追加してもらう.
- 問題を出す.
- 解答をしながら、他の人の解答が前のスクリーンで見られる.
- こちらは解答を見ながら、「正解がまだ出ていませんねー!」「ヒントは・・・です。」などコメント.
- 大体の解答が出たところで解説.
使用したもの
・LINE
・Googleスプレッドシート
・Google Apps Script
解答用のLINEアカウントの作成
スプレッドシートの準備
- 新規のスプレッドシートを作成し、"log", "main"の2シートを作る
- 拡張機能でGoogle Apps Script(GAS)を開く
logシートに今どの列に書き込むか指定するための数字を準備
解答がどんどん下に書き込まれる
var lastRow = mainsheet
.getRange(1, col)
.getNextDataCell(SpreadsheetApp.Direction.DOWN)
.getRow();
mainsheet.getRange(lastRow + 1, col).setValue(usermessage);
getNextDataCell(SpreadsheetApp.Direction.DOWN)を使用しましたが、これだと既に2行埋まっていないと1001列目に書き込まれてしまうとのことだったので、1,2行目は「第一問」「答え」など適当に埋めておきました.
このコードだけでは同時送信の場合にどちらかの解答がスプレッドシート上に反映されない時がありましたが、今回はそれでも大きな問題はない(もう1度送信してもらえばよいだけ)ので、これだけにしました.
まずテストとして第一問、「今日のお昼ご飯何食べましたか?」の回答
トマトロワイヤルは謎のまま(笑)最近の若者の間で流行っているんだろうか。
次の問題になったら行を変更する
if (usermessage == "next") {
col = col + 1;
logsheet.getRange("A1").setValue(col);
messages = [
{
type: "text",
text: "次の問題に移ります。",
},
];
}
LINEで「next」と送信すれば書き込む列が変わります.
実際のコード
var CHANNEL_ACCESS_TOKEN ="あなたのチャンネルアクセストークン";
var line_endpoint = "https://api.line.me/v2/bot/message/reply";
const logsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("log");
const mainsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("main");
var col;
col = logsheet.getRange("A1").getValue();
function doPost(e) {
var json = JSON.parse(e.postData.contents);
var reply_token = json.events[0].replyToken;
if (typeof reply_token === "undefined") {
return;
}
if (json.events[0].type == "message") {
const usermessage = json.events[0].message.text;
if (usermessage == "next") {
col = col + 1;
logsheet.getRange("A1").setValue(col);
messages = [
{
type: "text",
text: "次の問題に移ります。" + col + "問目です。",
},
];
} else {
var lastRow = mainsheet
.getRange(1, col)
.getNextDataCell(SpreadsheetApp.Direction.DOWN)
.getRow();
mainsheet.getRange(lastRow + 1, col).setValue(usermessage);
messages = [
{
type: "text",
text: "どんどん答えてください!",
},
];
}
UrlFetchApp.fetch(line_endpoint, {
headers: {
"Content-Type": "application/json; charset=UTF-8",
Authorization: "Bearer " + CHANNEL_ACCESS_TOKEN,
},
method: "post",
payload: JSON.stringify({
replyToken: reply_token,
messages: messages,
}),
});
}
return ContentService.createTextOutput(
JSON.stringify({ content: "post ok" })
).setMimeType(ContentService.MimeType.JSON);
}
その他
学生が約100人ほどいるので、1問につきスプレッドシート1列だと下の方がスクロールしないと見えないんじゃないか?という懸念があったため、実際の授業ではLINEアカウントを2つ作成しました(1つ目のアカウントはA列、2つ目のアカウントはB列に書き込み).
(※その場合はnextに対する挙動をcol = col +2に変更が必要です.)
2つ目のGASは、.getActiveSpreadsheet()が使用できなかったので、下記に変更.
const mainsheet = SpreadsheetApp.openById("スプレッドシートのID").getSheetByName('main');
const logsheet = SpreadsheetApp.openById("スプレッドシートのID").getSheetByName('log')
スプレッドシートのIDは***の部分
docs.google.com/spreadsheets/d/***/edit#gid=0
学生さんの反応
楽しかった、またやってほしいという反応をいただき、嬉しく思いました☺️
課題
- 同時送信で消滅してしまう問題の解決→
- どんな解答が多かったなど集計機能
- 正解が見た目で分かる機能もおもしろいかも?
- nextと送信して次の列にいく以外に方法はないか?