5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Googleフォームで送信されたデータを使いやすいJSONに変換する

Last updated at Posted at 2022-02-03

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のデータ構造をすぐに忘れてしまうので作りました。ご自由にお使いください✨

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?