Googleフォームで送信されたデータを、単純なJSONデータに変換するスクリプトです。フォームの「質問」をキーとして、回答をバリューとしたオブジェクトです。
変換されたJSON
{
"記述式は?": "記述式です。",
"段落は?": "段落です。",
"ラジオボタンは?": "ラジオボタン1",
"チェックボックスは?": [
"チェックボックス1"
],
"プルダウンは?": "プルダウン1",
"均等目盛は?": "1",
"選択式(グリッド)は?": {
"行1": "列1",
"行2": null
},
"チェックボックス(グリッド)は?": {
"行1": [
"列1"
],
"行2": null
},
"日付は?": "2022-02-03",
"時刻は?": "22:00"
}
-
チェックボックス
の値は配列です。 -
選択式(グリッド)
は、行名をキー、列名をバリューとするオブジェクトです。 -
チェックボックス(グリッド)
は、行名をキー、列名の配列をバリューとするオブジェクトです。
スクリプトはこちらです。
// 権限を付与するために一度だけ実行する。
function runOneTimeForAuthorization() {
FormApp.getActiveForm();
}
function getRows_(item, type) {
if (type === 'GRID') return item.asGridItem().getRows();
if (type === 'CHECKBOX_GRID') return item.asCheckboxGridItem().getRows();
throw 'invalid type: ' + type;
}
// フォーム送信時のトリガーとして登録しておく。
function onFormSubmit(e) {
const items = {};
e.response.getItemResponses().forEach(itemResponse => {
const item = itemResponse.getItem();
const response = itemResponse.getResponse();
const type = item.getType().toString();
if (type.includes('GRID')) {
const rows = getRows_(item, type);
const grid = {};
for (let i = 0; i < rows.length; i++) {
grid[rows[i]] = response[i];
}
items[item.getTitle()] = grid;
} else {
items[item.getTitle()] = response;
}
});
// Google Workspace だとフォームを送信した人のメールアドレスを取得できる。
handleResponse_(items, e.response.getEditResponseUrl(), e.response.getRespondentEmail());
}
// メイン処理。今回はログ出力するだけ。
function handleResponse_(items, url, email) {
console.log(JSON.stringify(items, null, 2));
console.log(url);
console.log(email);
}
-
runOneTimeForAuthorization()
は、スクリプトエディター上で一度だけ実行します。そうしないと、権限が付与できずに、フォーム送信時のトリガーが失敗します。 -
onFormSubmit()
を、フォーム送信時のトリガーとして登録します。 -
handleResponse()
に、JSONを使った処理(例えばメール送信)を書きます。よく使うので、回答を編集するためのURLも取得しています(ただしフォームの設定で回答の編集を許可しておく必要があります。このURLを知っている人は誰でも回答を編集できるので注意してください)。Google Workspaceで作ったフォームだと、フォームを送信した人のメールアドレスを取得できます。
FormAppのデータ構造をすぐに忘れてしまうので作りました。ご自由にお使いください✨