みなさん、Googleフォームは活用されていますでしょうか?
アンケートや理解度チェック、使い方によってはタスク管理などにも使える回答フォームをお手軽に作れる便利サービスですね。
デフォルトでスプレッドシートに回答を転記してくれる機能も備わっていますが、自分で用意したフォーマットに従って決められた場所に転記したい、回答されたタイミングでメールやチャットに投稿したい、といった場合にGASの出番です!
今回はフォームの回答を受け付けたタイミングで、その内容を取得してコンソールに出力するところまでをサンプルを交えながら紹介していきます。
フォームとGASの関連付け
回答結果を受け取るためには、当たり前ですがフォームとGASの紐付けを行う必要が出てきますので、まずはフォームからスクリプトエディタを開きます。
スクリプトエディタで以下のようなコードを追加して保存しておきます。
function onSubmit(e) {
}
続いて、トリガー画面を開きます。
右下の「トリガーを追加をクリック」
フォーム送信時にonSubmitを呼ぶようにしたら完了です!
回答を取得するプログラムの作成
それでは先ほどの onSubmit にて設問と回答を取り出すコードを書いてみましょう。
各設問の情報は引数のイベントの e.response.getItemResponses()
にて取得可能です。
function onSubmit(e) {
// 設問の回答結果
let result = '';
const itemResponses = e.response.getItemResponses();
for (let itemResponse of itemResponses) {
// 設問
const item = itemResponse.getItem();
const itemIndex = item.getIndex();
const title = item.getTitle();
// 回答
const response = itemResponse.getResponse();
result += '▼ 設問 ' + itemIndex + '\n';
result += 'タイトル:' + title + '\n';
result += '回答:' + response + '\n';
result += '\n';
}
Logger.log(result);
}
回答を取得するプログラムの作成(改良版)
前項のプログラムで手元で試したところ、回答を itemResponse.getResponse()
で受け取るときに一部思った通りの結果が得られない、、となったので追加です。
公式リファレンスによると
Gets the answer that the respondent submitted. For most types of question items, this returns a String.
For CheckboxItem questions, this returns a String[] array containing the responder's choices. The order of the strings in the array may vary.
For GridItem questions, this returns a String[] array in which the answer at index n corresponds to the question at row n + 1 in the grid. If a respondent did not answer a question in the grid, that answer is returned as ''.
For CheckboxGridItem questions, this returns a String[][] array in which the answers at row index n corresponds to the question at row n + 1 in the checkbox grid. If a respondent did not answer a question in the grid, that answer is returned as ''.
とのことで、どうやら設問の種類によっては単純な文字列ではなく配列として返ってくるパターンがあるようですね。。
getResponse()で得られる結果
・チェックボックス → String[]
・選択式(グリッド) → String[]
・チェックボックス(グリッド) → String[][]
・その他 → String
これに合わせて先ほどのプログラムをちょっと修正してみました。
function onSubmit(e) {
// 設問の回答結果
let result = '';
const itemResponses = e.response.getItemResponses();
for (let itemResponse of itemResponses) {
// 設問
const item = itemResponse.getItem();
const itemIndex = item.getIndex();
const itemType = item.getType();
const title = item.getTitle();
// 回答
const response = itemResponse.getResponse();
let responseText = '';
switch(itemType) {
// チェックボックス
case FormApp.ItemType.CHECKBOX:
responseText = response.join(',');
break;
// 選択式(グリッド)
case FormApp.ItemType.GRID:
responseText = response.join('\n');
break;
// チェックボックス(グリッド)
case FormApp.ItemType.CHECKBOX_GRID:
responseText = response.map(e => {
return e.join(',')
}).join('\n');
break;
default:
responseText = response;
break;
}
result += '▼ 設問 ' + itemIndex + '\n';
result += 'タイプ:' + itemType + '\n';
result += 'タイトル:' + title + '\n';
result += '回答:' + responseText + '\n';
result += '\n';
}
Logger.log(result);
}
これで回答結果が見やすく表示されるようになりました。
サンプルフォームと実行例
実際に作成したサンプルと出力結果をご紹介します。一通りの設問を用意して回答してみましたのでどの設問がどんな出力になるのか見比べてみてください。
回答内容
出力
▼ 設問 0
タイプ:TEXT
タイトル:記述式(短文)
回答:短文を入力しました
▼ 設問 1
タイプ:PARAGRAPH_TEXT
タイトル:段落(長文)
回答:長文を
入力
しました
▼ 設問 2
タイプ:MULTIPLE_CHOICE
タイトル:ラジオボタン
回答:選択肢1
▼ 設問 3
タイプ:CHECKBOX
タイトル:チェックボックス
回答:選択肢 2,選択肢 3
▼ 設問 4
タイプ:LIST
タイトル:プルダウン
回答:選択肢 5
▼ 設問 5
タイプ:FILE_UPLOAD
タイトル:ファイルアップロード
回答:1OlyvOwFRlnpotA77FVGbf02ArL4knIis
▼ 設問 6
タイプ:DATE
タイトル:日付
回答:2021-03-09
▼ 設問 7
タイプ:TIME
タイトル:時刻
回答:05:01
▼ 設問 8
タイプ:GRID
タイトル:選択式(グリッド)
回答:1 列目
2 列目
3 列目
▼ 設問 9
タイプ:CHECKBOX_GRID
タイトル:チェックボックス(グリッド)
回答:1 列目,2 列目
1 列目,3 列目
2 列目
▼ 設問 10
タイプ:SCALE
タイトル:均等メモリ
回答:8