背景
スクラッチ開発するシステム(以下、独自システム)において、独自のアンケートを管理し、ユーザに回答させたい場合がある。
アンケート管理機能を自前で実装すると手間がかかるため、GoogleForms(以下、GForm)及びGoogleAppScript(以下、GAS)で、どこまで独自システムと連携できるのかを調査した。
GFormの基本的な説明は省略する。詳しくは以下のリンクを参照すること。
https://www.google.com/intl/ja/forms/about/
前提条件
- Googleは個人アカウントではなく、GoogleWorkspaceを利用する前提とする。
- 独自システムのユーザ管理は、Googleアカウントを使用しないものとする。
- Googleアカウントを持っていない、あるいはログインしていないユーザでも、GFormに回答可能とする。ただし、独自システムにはログインしている前提とする。
- GForm1件に対する回答数は数十〜数百件とする。
調査内容
①多言語対応
原則不可。
GFormを複数種類作成することで代用可能。
ただし、フォームが分かれるので、複数言語をまたいだ集計(主に選択式の質問)が面倒になる。
その場合、各言語での選択肢の頭に記号などを共通で付け、
集計時に各言語分の結果のスプレッドシートを、1つのシートにまとめることで、
記号で引っ掛ければ、各言語をまたいだ集計が可能となる。
※GForm上で、「必須」「送信」などのボタン名が固定表記になっているが、GFormのURLの末尾に、hl=enなどのクエリストリングを付けることで、変更可能。
※MicrosoftFormsの一定のプランであれば、1種類のフォームから、多言語の質問文を生成することができる。ただし、いくつかの言語(ミャンマー語など)が非対応だった。
https://support.microsoft.com/ja-jp/office/%E8%A4%87%E6%95%B0%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%A7%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B-e948a2ea-31c8-432f-91bf-67790e226706
②GFormオープン時の動的な初期値の指定
可能。
クエリストリングを利用して、GFormの回答画面を開いたタイミングで、テキストボックスに文字列を埋め込んだり、選択式の質問を、選択させることができる。
これを利用すれば、独自システム側のユーザIDなどを、GForm側に渡すことで、独自システム側のユーザ情報と、GForm側の回答情報を、後から突合することができる。
独自システム内で、GFormの回答画面へのリンクを表示する画面を用意して、その画面の描画処理の中で、リンクのクエリストリングを動的に生成すると良い。
※MicrosoftFormsだと、単体ではできないらしい。
https://answers.microsoft.com/ja-jp/msoffice/forum/all/forms%E3%81%A7%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB/391e9519-14f6-474c-9ce6-d4b3e0e4e49b
参考
https://support.google.com/a/users/answer/9308781
https://web-breeze.net/googleform-pre-input/
ただし、GFormを開いた後は、埋め込まれた初期値を、ユーザが編集できてしまうことに注意。
よって、ユーザIDは、ただの連番ではなく、適当に入力しても、当たらないもの(会員番号
など)にするべき。
入力欄をhidden扱いにすることは、技術的には可能のようだが、かなり手間がかかる印象を受ける。
少なくとも、GFormの管理コンソール画面や、GASでは標準で対応していない。
参考
https://www.monotalk.xyz/blog/Customize-Google-Form-and-set-hidden-field/
https://formfacade.com/website/is-it-possible-to-hide-fields-in-google-forms-on-1FAIpQLScsQxfv3qbfi-qzk7Xty7IIq8ifoGih3d-LAN5EBIPJXgUaDA.html
③ユーザがアンケートを回答したことを、独自システム側が検知する
GASでアンケート送信時をトリガーとして、スクリプトを起動し、独自システム側であらかじめ用意したWebAPIを呼び出すと良い。
その際に、パラメータとして、GFormのIDと、②で受け渡したユーザIDを指定すると良い。
フォームの回答結果は、FormResponseオブジェクトが保持している。
参考
https://developers.google.com/apps-script/guides/triggers/events#form-submit_1
https://developers.google.com/apps-script/reference/forms/form-response
④GForm回答後に、ユーザが自分の回答内容を後から確認する
可能。
GForm標準の機能で、回答時に、回答者が指定したメールアドレスに回答内容をメールで送ることができるので、それを使うと良い。
ただし、以下の制約が発生する。
・回答者が送信先メールアドレスを必ず手入力しなければならない。(②で自動入力はできない)
・回答者に、ロボットでないことの確認作業(複数の絵の中から、〇〇が映っているものを選択してください)が発生する場合がある。
代案として、③の仕組みで、独自システム側で回答内容を受け取り、独自システム内の画面で、ユーザに回答内容を表示する方法がある。その場合、他人のユーザIDが特定されて勝手に使われないように注意すること。
⑤独自システムのユーザが、同一のGFormに対して、1回のみ回答できるように制限する
不可。
これを行う場合は、独自システム側に、GFormへのリンクを表示する画面を実装し、過去に回答済みかどうかを判断して、リンクの表示・非表示を切り替えるなどの処理を入れると良い。
仮に、GFormでの回答が重複したところで、GFormの回答結果のデータに、同じユーザIDが複数件含まれるだけなので、回答日が最新のレコード以外は削除する、などの処置を集計時に挟めば良いだけ。