Google Meetで
チーム対抗
クイズ大会

2020年8月初頭に、Google Meetを使ってチーム対抗のクイズ大会を開催しました。参加者は6チーム25人、所要時間は2時間でした。楽しめたと思います。以下は、その大会をどのように行ったかを書いたものです。

[2021-12-29追記] 採点の仕組みを改良した上で、解答用紙・採点について英語で説明した記事を書きました。そちらからは解答用紙・採点のファイルもコピーできるようになっています。

クイズの形式

  1. 司会者が問題をスライドで示し、各チームが「回答用紙」(Google Sheetsを使いました)に記入していきます。つまり、早押しではなく、正解数を競います。

  2. 全体は6ラウンドに分かれ、各ラウンドでラウンドのテーマに沿った問題が10問出されます。問題の中には動画や、音声が含まれます。

  3. 出題後回答が締め切られ、答えが示されます。その後、各チームのそのラウンドの点数ならびに、その時点までの合計点が示されます。

  4. 参加はスマホやタブレットからはではなくパソコンからのみとしました。

クイズ会場とチームの部屋

司会者が問題出したり答えを説明したりする「クイズ会場」に加えて、各チームの部屋を使いました。具体的には、今回は6チームだったので、6つのチーム部屋とクイズ会場の合計7つのGoogle Meetの「会議」を使いました。

参加者は、クイズ会場と自チームの部屋両方に同時に参加します。Google Meetではパソコンからなら複数の「会議」への同時参加が簡単にできるのです。ウェブブラウザーの複数のウィンドウまたはタブで https://meet.google.com を開くだけです。

参加者は、クイズ会場で示される問題を見つつ、チーム部屋で相談します。クイズ会場についてはミュート(自分の音声が流れないように)しておきます。そうしないとチームでの相談内容が聞かれてしまうことになるので。

Zoomでは?

チーム対抗ならZoomのブレークアウトルームでも、と思われるかも知れません。それも考えましたが、クイズ大会には向かないと判断しました。なぜなら、問題が出されて、チーム内で相談している間、問題のスライドが見えている必要があるからです。Zoomの会議の状態は全体かブレークアウトかのどちらか一方で、ブレークアウトしている間、Zoom内で全体に対して何かを見せることはできません。更に、問題を1つ示すたびにブレークアウトして全体に戻るというのは、クイズ大会としてはかなりぎこちなくなってしまいます。

問題や答えはGoogle Slidesで

問題や答えを示すスライドにはGoogle Slidesを使いました。Google Meetでは、画面全体やウィンドウを共有することができます。それに加えて、少なくともChromeブラウザーでGoogle Meetを開いているなら、Chromeの一つのタブの表示を共有することができます。そのタブで再生されている動画も音声も参加者に届きます。動画はウィンドウや画面全体の共有ても届きますが、かなりコマ落ちになります。あと、再生している音声が届きません。Google SlidesをChromeで開いていれば、動画もちゃんと流れ、音声も届くのです。

司会者とオペレーター

司会者がすべての操作を行うことは不可能ではありませんが、大変ですし、間違いも起こりやすくなります。司会者はスライドを操作してつつ問題を出し、答えの解説することに集中して、それ以外の仕事をオペレーターが行うのが確実です。また、全体の進行を一人ではなく、二人が理解・事前検証・実施することで、見落としを減らすことができます。以下、オペレーター役がいると仮定して説明します。

Google Meetの準備

オペレーターは、Google Calendarを使って、クイズ大会の予定を参加者に送ります。予定を作成する際に、Google Meetを使うことにすると、自動的に「会議」が作成され、そのURLが予定に入ります。その「会議」がクイズ会場になります。

この際に、できれば、@gmail.com など個人アカウントではなく、G Suiteのアカウントを使うほうが便利です。理由は、G Suiteのアカウントで作成されたGoogle Meetの会議には、Googleにサインインすることなく参加できるからです。参加者が全員Googleアカウントを持っていて、常にそれを意識して使っているのなら個人アカウントで作成したGoogle Meetの会議で何も支障はありません。しかし、実際には、パソコンでは普段Googleにサインインしていない人もいます。

各チームの部屋は、チームに任せてもいいのですが、主催者が用意するほうが無難です。クイズ会場と同様にGoogle Calendarで予定を作成し、それはチームの部屋であることを言及した上で、チームのメンバーに送ります。

開場、参加者来場

オペレーターは、会開始時刻の少し前に、クイズ会場と全チーム部屋に接続します。クイズ会場以外ではミュートし、カメラも切っておきます。そうして、入室許可が必要な参加者に、許可を与えます。Google Calendarで予定を送ったメールアドレスでGoogleにサインインしていれば、入室許可は必要ないのですが、Googleにサインインしていない人、Calendarから送った先以外のメールアドレスでGoogleにサインインしている人などには、入室許可を与える必要があります。

参加者に入室許可を与える必要がないとしても、各チームの部屋の入室状況を確認し、参加者が揃ったところで、司会者にその旨を伝え、大会を始めるのが理にかなっています。

回答用紙

先にも書いたように、回答用紙にはGoogle Sheetsを使いました。オペレーターが全チームのファイルを作成し、それぞれ対応するチームと共有します。

一つのラウンドが一つのシート(タブ)に対応します。今回は6ラウンドで、シートが6つ、各ラウンド10問で、A1からA10に記入することにしました。下の画像は、実際に使ったもので、回答はすべて択一になっています。回答用紙のA1〜A10が赤で囲まれているのは、ファイルが実際にそのようになっているのです。そこに回答を入力するのだと強調するためです。

問題は択一に

問題は択一式にすることをお勧めします。自由記述だと採点に時間がかかり、また、間違いや議論の余地が生まれやすくなります。チームの正解の数を競う形では、問題数とチーム数を掛け算した数の正誤判定が必要になりますから、正誤判定の効率性、確実性は重要です。また、択一式なら選択肢を多言語にすることもできます。

回答締切

1つのラウンドの出題が終わったら回答を締め切ります。そのために対応するシートをプロテクトし、持ち主だけが変更できる状態にします。これをチームの数だけ手作業でやるのは大変なので、私は以下をスクリプトを使いました。

スクリプト入力

スクリプトの入力はTools→Script editorで行います。入力後 保存します。

スクリプトの内容は以下の通りです。

function customMenu() {

var ui = SpreadsheetApp.getUi();

ui.createMenu('Custom')

.addItem('Protect', 'protectSheet')

.addItem('Unprotect', 'unprotectSheet')

.addItem('Rest Ans', 'resetAnswers')

.addToUi();

}

function protectSheet() {

var sheet = SpreadsheetApp.getActiveSheet();

var protection = sheet.protect();

protection.removeEditors(protection.getEditors());

}

function unprotectSheet() {

var sheet = SpreadsheetApp.getActiveSheet();

var protection = sheet.protect();

protection.remove();

}

function resetAnswers() {

var sheet = SpreadsheetApp.getActiveSheet();

sheet.getRange('A1:A10').setValue('');

}

customMenu関数の実行

スクリプトを入力し、保存したら、customMenu関数を実行します。

スクリプトの実行許可

初めて実行すると、「Authorization required」と言われます。詳細は割愛しますが、以下のようにクリックして行けば、実行できます。

そして、Googleからは警告のメールが届く。

スクリプトの使い方

これにより、「Custom」というメニューができ、その中に、Protect、Unprotect、Reset Ansができます。

Protect、Unprotect、 Reset Ansの中で実際に使うのは主にProtectで、これにより、回答の変更ができなくなります。一旦 参加者による変更をできなくした後で、何らかの事情で、再び変更を可能にしたい場合は、Unprotectを使います。Reset Ansは、本番前にテストとして入力した回答をすべて消すのに使います。

customMenu関数を手動実行する理由

オペレーターは、回答締切などの操作にCustomメニューが必要です。いっぽう、参加者にはCustomメニューは不要です。ファイルが開かれた際に、誰が開いたかによってCustomメニューが作られたり作られなかったりできればいいのですが、不可能なようです。そこで、オペレーターは、スクリプトエディターを開いてcustomMenu関数を実行するようにしています。

既知の問題点

Google Sheetsのファイルに編集権限があるユーザーは、スクリプトの変更が可能です。シートを保護することはできますがスクリプトの保護はできません。ですから、参加者はスクリプトを変更して、オペレーターに嫌がらせをするこができます。これを防ぐには、回答締切の機能をadd-onにすればいいのですが、そもそも、レクリエーションのクイズ大会で、オペレーターへの嫌がらせを恐れる必要は高くないと判断し、そのままにしています。

なお、スクリプトで定義されている関数を参加者が実行することに問題はありません。protectSheet・unprotectSheet両関数はファイルの持ち主以外が実行しても保護状態は変化しません。また、resetAnswers関数を参加者が実行して得をするとは思えません。

採点の自動化

問題がすべて択一で回答がGoogle Sheetsに入っているいるのなら、採点は自動化できます。以下、採点用Google Sheetsファイルを、どう作り使ったかを説明します。

ファイルを構成するシートたち

  1. 各ラウンドの点数と、その合計を表示する、「Home」シート。各ラウンドの最後で、これを参加者に見せることになるでしょう。


2. 各チームの回答用ファイルのURLを集めてある「D」シート。

3. 各ラウンドの採点を行うシートは、「Round 1」から「Round 6」とします。これらのシートの名前は、回答用ファイルのシート名と一致する必要があります。採点を行うシートにはついては、より詳しく説明します。

スクリプト

回答用ファイルでの操作を効率化するためにスクリプトを使ったのと同様に、採点用ファイルでもスクリプトを使います。回答用ファイルと違い、参加者が採点用ファイルを開くことはないので、Customメニューの設定はonOpen関数で行っています。スクリプトを入力し、保存した後で、onOpen()を実行しておく必要があります。

function onOpen() {

var ui = SpreadsheetApp.getUi();

ui.createMenu('Custom')

.addItem('Mark', 'markAnswers')

.addItem('Unmark', 'unmarkAnswers')

.addToUi();

}


function markAnswers() {

var sheet = SpreadsheetApp.getActiveSheet();

var src = sheet.getRange('B16:B25').getValues();

sheet.getRange('B2:B11').setValues(src);

}


function unmarkAnswers() {

var sheet = SpreadsheetApp.getActiveSheet();

sheet.getRange('B2:B11').setValue('6Qpb');

}


function sheetName() {

return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();

}

回答ファイルの読み込み

採点を行うシートのC2〜H2は回答ファイルを参照しています。例えばRound 1シートのC2セルは以下のようになっています。

=importrange(D!B2,concatenate(sheetName(),"!A1:A10"))

読み込むファイルのURLはDシートで指定されたもの、読み込むシートはスクリプトで定義したsheetName()を使って、自分自身と同じ名前のものを、となっています。

答えと一致している数を数える

C13〜H13に、そのラウンドの得点が出ます。例えばC13は以下のようになっています。

=sumproduct(--($B2:$B11=C2:C11))*$E$15

B2〜B11と一致している数を数え、それにE15を掛けた答えが、そのラウンドの得点になります。E15の値を変更することで、そのラウンドの1問当たりの得点を変更することができます。

正解は背景を緑に

各回答が正解か不正解か一眼で分かると便利です。答えを示しているときに、この問題はTeam Bだけ不正解でしたとか、Team Cだけが正解でしたとかコメントすることが簡単になりますから。そこで、条件付きフォーマットで、解答と一致したら背景が緑になるようにしています。

クイズ大会の前の準備

クイズ大会の前に、各ラウンドのシートに対して以下を行う必要があります。

  1. 各問題の答えをB16〜B25に入力する。

  2. Custom→Unmarkを実行する。

答えをB2〜B11に入力しない理由は次の通りです。B2〜B11に答えが入力してあると、採点が行われてしまうからです。そして、それは、得点表に反映されてしまいます。まだ、行われていないラウンドの点数がついてしまうのは避けなければなりません。そのために、答えはB16〜B25に入力します。そして、Custom→Unmarkにより、B2〜B11に回答と決して一致しない文字列を入力するのです。

採点の操作

クイズ大会中、1つのラウンドの出題が終わり、回答締切の操作をした後、採点ファイルで採点の操作をすることになります。具体的には、ラウンドに対応するシートに対してCustom→Markを実行します。これにより、答えがB16〜B25からB2〜B11にコピーされ、採点が行われます。