コミュニケーション促進のため質問ビンゴ大会を企画し盛り上がった話

# はじめに
こんにちは！エンジニアとしての業務の傍、イベントの企画運営をする機会が何度かありました。
そこで質問ビンゴ大会を開いたところ、とても盛り上がり好評だったのでそれについて書きます。
こちらの記事は、役割としてイベント運営を担っている方のお役に立てれば幸いです。

特にエンジニア組織はコロナ禍のリモートワークの普及であったり流動性の高い業界柄、メンバー同士のコミュニケーション不足が課題となっています。やはりお互いに仲良く話せる間柄の人が多い方が、仕事もしやすいですし、生産性も上がります。たまには本社で皆で顔を合わせる機会もあると思いますが、お互いに初めましてだとよそよそしいですよね。話したことはない人同士でも関係を深めたい、楽しみたいという要望が高まっており企画を考えていました。そこでお互いのことを知れる、コミュニケーションのきっかけになことを目的とし、質問ビンゴ大会を企画したのでした。

# どのような企画か

質問ビンゴ大会のルールは以下です。
1. 3人1組に分かれます
2. まず組の中でお互い自己紹介します
3. 質問をする順番をジャンケンで決めます
4. マスから2つ選んで他2人に質問します
5. 質問された人はエピソードを話します
6. 質問に当てはまる人がいたらそのマスにその人の名前を書きます
7. 1マスに2人の名前が書けたらマスが埋まります
8. 7分測るので上記の自己紹介と質問を一周まわします
9. (ビンゴになった方には豪華景品があります)
10. ビンゴになった方には、印象に残ったエピソードを話してもらいます

各グループで、お互いに質問をし合います。
![スクリーンショット 2024-01-02 23.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/a49378c9-af96-4899-f0df-bf6e45650610.png)

このような状態になれば、ビンゴです！
![スクリーンショット 2024-01-02 23.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/9f6dae60-501d-001b-bdc2-ddcdc83be4d2.png)

# 運営の準備

## 質問の用意
質問は、Yes/Noで答えられる、エピソードを引き出せるようなものを用意します。例えば、

> 一人で海外に行ったことはありますか？

のような質問を用意します。海外に行ったことのある人の場合、なぜ行こうと思ったのか？どこに行ったのか？思い出は？のようなエピソードを引き出せますよね！
あの人の意外な一面が分かtたりすることで、お互いのパーソナリティを知ることができます。

用意した質問は以下の35個です。
| 番号 | 質問 |
|:-:|:-|
|1|一人で海外に行ったことはありますか？|
|2|有名人の知り合いはいますか？|
|3|自宅でペットを飼っていますか？|
|4|幽霊を見たことはありますか？|
|5|1万円以上寄付をしたことはありますか？|
|6|部活で県大会以上のレベルに参加したことはありますか？|
|7|ボランティア活動をしていますか？|
|8|瞑想やヨガをしていますか？|
|9|中学受験をしたことはありますか？|
|10|今月本を一冊以上読みましたか？|
|11|楽曲を制作したことはありますか？|
|12|Youtubeに出演したことはありますか？|
|13|スカイダイビングしたことはありますか？|
|14|今月美術館or博物館に行きましたか？|
|15|自分で植物を育てていますか？|
|16|今年、手書きで手紙を書きましたか？|
|17|今年、演劇や舞台芸術を見に行きましたか？|
|18|VRゲームを体験したことはありますか？|
|19|ラジオ番組を定期的に聞いていますか？|
|20|ゲテモノを食べたことはありますか？|
|21|クラシック音楽やジャズを聞くことはありますか？|
|22|異文化の料理を自分で作ったことはありますか？|
|23|自分でウェブサイトやブログを運営していますか？|
|24|マラソンやハーフマラソンに参加したことはありますか？|
|25|異国の言語を勉強していますか？|
|26|朝のジョギングやウォーキングを習慣にしていますか？|
|27|自分で絵を描いたり、アート作品を作ったことはありますか？|
|28|海外での就労経験はありますか？|
|29|星空観測をしたことはありますか？|
|30|専門的な資格や認定を取得していますか？|
|31|自転車で長距離を旅したことはありますか？|
|32|今月映画館で映画を見ましたか？|
|33|伝統的な踊りやダンスを習ったことはありますか？|
|34|自然の中でのキャンプやハイキングを楽しむことはありますか？|
|35|手作りの工芸品やDIYに取り組んだことはありますか？|

## ビンゴカード作成のスクリプトを用意する
ビンゴカードはスプレッドシートを用いて自作します。また、GASで上記35個の質問から9つランダムに選び、ランダムに配置するスクリプトも作成します。

まずスプシ次のようにビンゴカードの雛形を書きます。太線で囲った部分が、ビンゴカードの本体で、各マスは質問内容と二名分の名前記入欄で構成されています。
![スクリーンショット 2024-01-03 0.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/644ed4d0-38b1-8215-c7dd-d20c0c090be7.png)

「ビンゴカード作成」のボタンをクリックすると、後述のGASによりB1:D3セルには1~35の数字がランダムに配置されます。
そして、ビンゴカードの各マスには以下のようにスプシの関数を書きます。
`=VLOOKUP(B1,'質問一覧'!$A$1:$B$35,2)`
この例は左上マスの関数です。質問一覧シートのA1:B35の範囲に番号と質問一覧を書いておくことで、ランダムに9つの質問内容が選ばれ、ランダムに配置されます。

![スクリーンショット 2024-01-08 20.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/e6e187c9-8d1d-eba8-0e60-2825135a337c.png)

「ビンゴカード作成」は図形描画に以下のGASを割り当てたものです。
```js:GAS
function fillRandomNumbers() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getRange('B1:D3');
  var numbers = getRandomNumbers(1, 35, 9);
  var grid = [[numbers[0], numbers[1], numbers[2]],
              [numbers[3], numbers[4], numbers[5]],
              [numbers[6], numbers[7], numbers[8]]];
  range.setValues(grid);
}

function getRandomNumbers(min, max, count) {
  var numbers = [];
  while (numbers.length < count) {
    var num = Math.floor(Math.random() * (max - min + 1)) + min;
    if (numbers.indexOf(num) === -1) {
      numbers.push(num);
    }
  }
  return numbers;
}
```
1~35の数字の範囲から、9つランダムな数字を選ぶスクリプトとなっています。

## ビンゴカードを印刷する
上記のように作成したビンゴカードを当日の参加人数分、A4用紙で印刷します。
スプシからビンゴカード本体を含む範囲を選択し印刷する必要がありますが、なるべく楽に済ませたいです。
今回は、人数分のシートを複製しておきダウンロード→PDFを結合→まとめて印刷の手順を取りました。

以下はスプシの任意のシートと範囲でPDFのダウンロードを繰り返し実行するGASの例です。
```js:GAS
function exportSheetsToPDF(){
  var folderId = ''
  var numOfParticipants = 30
  var startCell = 'E3'
  var endCell = 'O10'
  for (let i = 1; i <= numOfParticipants; i++) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheetName = `card${i}`;
    
    var ssId = ss.getId();
    var sheetId = ss.getSheetByName(sheetName).getSheetId();
    
    var url = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?'
    
    var options = 'exportFormat=pdf&format=pdf'
    + '&gid=' + sheetId  //PDFにするシートの「シートID」
    + '&portrait=true'  //true(縦) or false(横)
    + '&size=A4'         //印刷サイズ
    + '&fitw=true'       //true(幅を用紙に合わせる) or false(原寸大)
    + '&gridlines=false' //グリッドラインの表示有無
    + `&range=${startCell}%3A${endCell}`   //セル範囲を指定。%3A はコロン(:)を表す
    
    var requestUrl = url + options;
    
    var token = ScriptApp.getOAuthToken();
    
    var params = {
      'headers' : {'Authorization':'Bearer ' + token},
      'muteHttpExceptions' : true
    };
    
    var response = UrlFetchApp.fetch(requestUrl, params);
    
    //Blobオブジェクトを作成
    var blob = response.getBlob();
    blob.setName(sheetName + '.pdf'); //PDFファイル名を設定
    
    //指定のフォルダにPDFファイルを作成
    var folder = DriveApp.getFolderById(folderId);
    folder.createFile(blob);
  }
}
```
Google Driveの指定のフォルダーに、指定の人数分、指定の範囲でPDFをダウンロードします。
シート名はcard1,card2,,,のようにします。

ダウンロードされたPDFは、結合しておくと一括印刷できるようになります。
筆者の場合、フリーソフトでPDFの結合をしました。

このようにして、作成されたビンゴカードを人数分印刷することができました。

## グループ作成のスクリプトを用意する
フリートーク形式で3人組を作ってもらうことも検討したのですが、自分から話しかけに行くのは勇気が要ることなのでランダムなグループ分けを強制することにしました。

例えば、以下のようなスクリプトを書くことで、30人のグループをランダムに3人ずつグループ分けできます。
```js:GAS
function createRandomGroups() {
  var numOfParticipants = 30; // 参加人数
  var numPerGroup = 3; // 3人1組

  // [1,2,3,,,]のように要素が1から始まる配列を用意
  var numbers = Array.from({ length: numOfParticipants }, (_, i) => i + 1);
  shuffleArray(numbers);

  var groups = [];
  for (let i = 0; i < numbers.length; i += numPerGroup) {
    groups.push(numbers.slice(i, i + numPerGroup));
  }
  /* groupsは以下のようになる
    [
      [ 24, 3, 29 ],
      [ 14, 27, 23 ],
      [ 1, 16, 4 ],
      [ 8, 25, 28 ],
      [ 26, 22, 13 ],
      [ 12, 21, 7 ],
      [ 11, 9, 30 ],
      [ 6, 5, 15 ],
      [ 2, 18, 20 ],
      [ 19, 17, 10 ]
    ]
  */ 
}

function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
}
```

あとはこれをうまく見せることができれば、良いですね✨

## 当日運営のためのスライドを用意する
ゲームルールの説明や、タイマー、グループ変えのような、司会進行用のスライドを用意します。
ここまでできたら、あとは当日楽しむ気持ちを持って臨むだけです！

# やってみて
実際にやってみると、狙い通り活発なコミュニケーションが生まれ、想像以上に盛り上がりました！

4週目くらいからビンゴが出始め、7週くらい実施しました。開始から終了までおよそ1時間くらいでした。
参加者アンケートの満足度もほぼ満点で、下記のような嬉しいコメントを頂くことができました😃。

> 強制的にグループを構築されたことで、あまり話す機会のないメンバーとコミュニケーションがとれた

> 目的通り普段話さない人と話題ベースに話せたので良い機会でした！

> この企画はいままでのなかでダントツ一番良いと思いました。

# おわりに
コミュニケーション活性化を目的として質問ビンゴ企画を考え、運営しました。

この企画を通して、強制的に話したことのないような人と話すきっかけ作りができます。また、質問の話題からエピソードを披露する機会になり、新たな一面をたくさん引き出すこともできました。

ビンゴ者には印象に残ったエピソードを発表してもらうことで、会場の一体感も作り出すことができます。

実施後、「楽しかったので定期的に開催したい」との声も多く出ました。
非常にメリットの多い素敵な企画だなと自負しているので、今後も引き続き機会を伺っていければと思います。

コミュニケーション活性化をしたい組織に対するイベント企画として検討、ご活用頂ければ幸いです。