こんにちは。今年の夏も暑さと戦うことなく、引きこもってハイラルの大地を駆け回っていた(ティアキン)さやかです。
今回は、Workatoを使って「事前に作成した問題群の中からランダムにテストを出題、テスト開始から結果の通知までをSlackで完結させるシステム」を作成したので記念にブログにてドヤらせていただきます。笑
はじめに
社内のコンプライアンス委員会から「コンプラ理解度テストを実施するために、ランダムにテストを出題できるようなシステムを作ってほしい」と依頼を受けたのが始まりです。
以前はこういった理解度テストなどの類はGoogleフォームを使用して実施していたので、今回もGoogleフォームを使用する流れでご依頼があったのですが、話し合いの中で「どうせシステムを作るなら使いやすくカッコいいものにしたいよね!」ということでユーザー操作がSlackで完結するシステムを作成することになりました。
システムの要点
- ユーザー操作がSlackで完結する
- 問題カテゴリ別に指定した出題数分問題一覧からランダムに抽出し出題する
- 事前にGoogle Sheets上に問題リストを準備しておく
- 回答は選択式(ラジオボタン)
- テスト情報が入ったGoogle Sheetsファイルは、コンプライアンス委員会メンバーのみが閲覧でき、システム実装者も閲覧することができない
今回使用したもの
- Workato
- Slack
- Google Sheets
- (Salesforce:弊社では従業員データをSalesforceに保存しているため使用しました)
システム紹介【時間がない人向け】
どんなシステムを作成したのか、簡単にご紹介させていただきます。
簡単なシステムの流れ
まず、ユーザー(受験者)がSlackにてコマンドを実行することをトリガーに出題フローが実行されます。
フローが実行開始すると、Google Sheetsから問題情報とテスト情報を取得します。(Google Sheetsのシートに入るデータは以下の「Google Sheets各シート」にて詳しくご紹介します)
その後各問題カテゴリで指定された出題数分の乱数配列をrubyで生成し、生成された乱数配列の問題番号の問題を1問ずつSlackのモーダルで出題します。
※実装テスト用問題です。コンプラ理解度テストとは一切関係ございません。
(ちなみに私は「芋」が好きですw)
回答は都度解答と照らし合わせ、正解かどうかを判定し回答データを変数リストに保存しておきます。 全問回答が終わると回答データをGoogle Sheetsの回答シートに書き込んでいきますが、そのとき回答者データはメールアドレスにして欲しいということだったので、トリガーとなったコマンドを実行したSlackユーザーから該当ユーザーのメールアドレスを参照するために今回はSalesforce上に存在する従業員リストを参照しました。
その後指定した合格点に達しているかを判定し、SlackのDMにて合否と解答(答え合わせ)を通知します。
最後に受験ユーザーの合否と点数の結果もGoogle Sheetsの結果シートに記載します。
Google Sheets各シートの解説
問題情報シート
このシートには、テストのカテゴリ一覧とその各カテゴリからの出題数のデータが入ります。
- A列:カテゴリ番号(1から順に振っていきます)
- B列:カテゴリ名
- C列:出題数
以下スクリーンショットの例だと、食べ物カテゴリから3問・飲み物カテゴリから2問を出題するように設定しています。
問題シート
このシートには、テスト問題とその選択肢・解答のデータが入ります。
- A列:問題番号(カテゴリ別で、1から順に振っていきます)
- B列:問題カテゴリ
- C列:問題
- D列:解答
- E列以降:選択肢A,B,C…
回答データシート
このシートには、1問ずつの回答の生データが入ります。
- A列:問題セットUUID(テストを計5問出題する場合、その5問を一括りとするためのUUIDです。以下スクショでは分かりやすくするため、同じUUIDの行に色をつけています。)
- B列:回答時間
- C列:受験者メールアドレス
- D列:問題番号(カテゴリ番号と問題番号のセット)
- E列:回答
- F列:正誤
結果シート
このシートには、受験ユーザーの合否データが入ります。
- A列:問題セットUUID
- B列:回答時間
- C列:受験者メールアドレス
- D列:スコア
- E列:合否
問題リストのGoogle Sheets閲覧権限を制限する
この問題リストと回答が入るシートは、関係者のみしか閲覧できないよう制限をかける必要があります。(解答や全員の合否情報が入るため)そのためシステム実装者の私の認証を使ってWorkatoのGoogle Sheetsアクションを実行することはできません。私の認証を使う=私がシートを閲覧できる状態となってしまうためです。困りましたね。
こんなときはGoogleのサービスアカウント認証を使用します。
Google Cloud Platform(以下、GCP)のプロジェクトがあることが前提で説明させていただきますと、まず
- Google Sheets API(https://console.developers.google.com/apis/api/sheets.googleapis.com)
- Google Drive API( https://console.developers.google.com/apis/library/drive.googleapis.com )
上記2つを有効化します。
あとは「APIとサービス」の「認証情報」( https://console.developers.google.com/apis/credentials )からサービスアカウントを作成し、作成した認証情報でWorkatoのGoogle Sheetsコネクションを作成します。
最後に使用する問題リストのGoogle Sheetsから、サービスアカウントのメールアドレスに「編集権限」を付与してください。
※今回は回答データの書き込みが発生するため、閲覧権限ではなく編集権限を付与する必要があります。
作成したWorkatoレシピ
アレンジレシピ ~複数問まとめて出題~
今回ご紹介したのは、モーダルで1問ずつ出題するやり方でした。問題数が少ないアンケートのような場合には以下のスクリーンショットのように複数問をまとめて1回のモーダルで出題することもできます。
しかしこのまとめて1回のモーダルにするやり方、少し厄介な部分もありまして。。。
問題数が多くなってもモーダル内はスクロールできるので受験ユーザーへの影響は特にありませんが、レシピ作成時に少々面倒な部分があります。モーダルを出すアクションの設定で、問題数分の問題・選択肢に入れるデータを1つ1つ手で設定しないといけないこと(1問ずつ出題する場合、問題データリストをループさせてループ内で出題するようにすればこの設定は1問分のみで済みます)、また出題した問題数分の回答ログがまとめて出力されることになるので、答え合わせの処理が面倒になることなど制作時の手間が結構増えます。
ですので基本的には今回ご紹介させていただいたように1問ずつ出題するやり方がおすすめではありますが、まとめて複数問を一気に出題するよう作成することも可能ではあるのでケースバイケースでご検討いただいたらいいと思います!
まとめと反省
今回作成したテスト出題システムは、今後他の分野で理解度テストを実施する際にもテンプレートとして使えるよう意識して作成したので、受験ユーザーが使いやすく、また問題シートを作成する方(今回で言えばコンプライアンス委員会の方)も使いやすいようにするため、考えることが多くかなり苦戦しました。
私は今年の初めからWorkatoを使い始め細々とした社内業務効率化のフローを作成してきましたが、今回はユーザー操作があり関わる方が多いシステムということで個人的には過去最高難易度だったなと思います。
シンプルなレシピで、ユーザー操作はSlack上で完結する結構いいシステムが出来上がったのではないでしょうか?
という記念にこのブログを書きましたが、このブログを書きながら「いややっぱこうした方がよかったな」と思い始めた部分もあったりします。
今回作成しスクリーンショットを掲載したレシピでは合否結果をWorkatoからGoogle Sheetsに書き込みにいっていますが、わざわざ書き込みに行ってAPI実行回数を増やさなくても回答の生データからGoogle Sheets上の関数で突合して合否を記載した「結果シート」を作成できるとこのブログを書きながら気がつきました。
弊社はメンバー数がそんなに多くないので今のレシピでAPI制限の上限に達することはないと思いますが、今からGoogle Sheetsの関数を書いてみようと思います。
Workato修行はまだまだ続く!