【Google Apps Script(GAS)】Googleフォームの作り方とScriptでの回答の取得方法

2021年6月26日

Googleフォームというサービスをご存知の方は多いと思います。簡単に投稿用のフォームが作れて、無料で使えるので重宝している方も多いのではないでしょうか。

単に投稿するだけのフォームは簡単に作れますが、GoogleAppsScriptを併用するとGmailやGoogleドライブといった他のGoogleのサービスと連携して高度な動きもプラスできるので、無料とは思えないほどとても優秀なサービスです。

GoogleAppsScriptを併用した動きの例

  • アップロードされた画像ファイルをある規則に沿って自動的にリネームする
  • フォームに投稿されたことを管理者にメールで通知する
  • 投稿を受け付けたことを投稿者にメールでお知らせする

GoogleフォームをGoogle Apps Scriptでカスタマイズする際、「回答内容を取得する」処理は必ず実行すると言っていいほど頻繁に行います。
しかし、回答を取得する方法は質問の種類によってバラバラで、間違った取得方法だと意図しない処理実行されたり、場合によっては強制終了してしまいます。

回答の取得方法はGoogle公式リファレンスにも掲載されていないので、実装者が手探りで見つけるしかありません。
(取得方法のパターンとしては3つだけなので手探りでもできなくはないですが、調査に一手間かかります。。。)

そこで本記事では、Googleフォームで使用できる質問の種類と質問の種類に応じた回答の取得方法をまとめていこうと思います。

この記事を見れば、全ての質問の種類についてGoogleフォームで回答を取得する際にどのように実装すれば良いかがわかります。
取得した回答内容を使って、様々な処理をScriptに実装することができるので、知っておいて損はないと思います。

Googleフォームとは

Googleフォームの作り方と回答の取得方法を説明する前に、念のためGoogleフォームとは何かを簡単にご紹介します。
初耳の方は、便利ですので使ってみてください。

GoogleフォームはGoogleが提供する無料で使える投稿フォーム作成サービスです。
Googleアカウントを持っていれば使用することができ、直感的に質問を追加できてわかりやすいので、簡単に導入ができるのが魅力です。
Webで公開するページはプログラム(HTML、CSS、JavaScript)が必要となりますが扱えなくても作成でき、回答内容をGoogleスプレッドシートに記録できる他、GoogleAppsScriptを使うことでGmail等その他のサービスとも連携できます。

たくみん

コードを書かずに投稿フォームが作成できる、
いわゆる「ノーコード」と呼ばれるサービスです。

投稿フォームを作るための手順(6ステップ)

Googleフォームで投稿フォームを作成する手順は下記の6つです。
質問の数に応じて手順2〜手順4を繰り返し行います。

手順5のプレビューで確認して、質問を追加したい!ここをもうちょっと変えたい!など変更があれば手順2に戻って修正していきます。

アンケート作成手順

  1. Googleドライブから「Googleフォーム」を起動する(新規作成メニューにない場合は追加する必要あり)。
  2. 「質問を追加」を押下し、設問を追加する。
  3. 「質問のタイトル」、「質問の種類」を選択する。
  4. タイプによっては選択肢を追加するなど、細いか設定を行う。
  5. 質問の追加が完了したら、プレビューを表示して確認する。
  6. プレビューで確認が終わったら、投稿フォームを公開します。公開方法は「メールで送信する」「リンクを教える」「Webページに埋め込む」の3つです。

質問の種類

質問の種類は下記の11種類があり、質問の種類によって回答の取得方法がありますが、大きくString、String[]、String[][]の3種類に分類されます。
このあと、それぞれ解説していきます。

全てString型(配列も含め)となっているがポイントで、「均等目盛」の項目は数字に見えて実は文字となっているので計算する場合は注意が必要です。
「日付」、「時刻」も計算(日付を進めたり、戻したり)する時には、Date型に変換が必要となります。

質問の種類回答の型(取得方法)
記述式String
段落String
ラジオボタンString
チェックボックスString[]
プルダウンString
ファイルアップロードString[]
均等目盛String
選択式(グリッド)String[]
チェックボックス(グリッド)String[][]
日付String
時刻String
質問の種類と回答の型

記述式

記述式は「改行ができないテキスト入力」です。「氏名」「メールアドレス」などの改行させない項目に利用されます。
入力内容はフリー入力になりますが、改行をさせない以外に下記のように入力内容をチェックして、不適合の場合はエラーにしてフォームを送信させないことも可能です。

設定できるエラーチェック

  • 数値チェック
  • テキスト形式チェック(指定文字列を含む/含まない、メールアドレス、URL)
  • 文字列長チェック(最大文字列、最小文字列)
  • 正規表現

入力内容チェックエラーが発生した場合、エラーメッセージが表示されます。
エラーメッセージはデフォルトのものがありますが、変更することも可能です。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    // String形式で取得できる質問
    if (question == '記述式'){
      console.log(question + ' : ' + answer);
    }
  }
}

段落

段落は「改行ができるテキスト入力」です。「お問合せ内容」など、長文の入力に利用されます。
入力内容はフリー入力になりますが、下記のように入力内容をチェックして、
不適合の場合はエラーにしてフォームを送信させないことも可能です。

設定できるエラーチェック

  • 文字列長チェック(最大文字列、最小文字列)
  • 正規表現

入力内容チェックエラーが発生した場合、エラーメッセージが表示されます。
エラーメッセージはデフォルトのものがありますが、変更することも可能です。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    // String形式で取得できる質問
    if (question == '段落'){
      console.log(question + ' : ' + answer);
    }
  }
}

ラジオボラン

ラジオボタンは「複数の選択肢の中から一つだけ選択できる入力」です。
ラジオボタンの入力は選択肢の設定とフォーム回答者に入力を要求できる「その他」の設定を行います。
この質問では、下記のような設定もできます。

ラジオボタンの設定内容

  • 選択した内容に応じて移動するセクションを変更する
  • 選択肢の順番をシャッフルする

例えば、ラジオボタンで性別を選択させて、回答次第で「男性向けの質問セクション」と「女性向けの質問セクション」に移動先を分けることができます。
選択肢の順番をシャッフルするは、テスト問題として利用すると有効かもしれません。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    // String形式で取得できる質問
    if (question == 'ラジオボタン'){
      console.log(question + ' : ' + answer);
    }
  }
}

チェックボックス

チェックボックスは「複数の選択肢の中から複数選択できる入力」です。
チェックボックスの入力は選択肢の設定とフォーム回答者に入力を要求できる「その他」の設定を行います。
この質問では、下記のような設定もできます。

チェックボックスの設定

  • 選択肢の順番をシャッフルする
  • 選択する個数をチェックできる(最低個数、最多個数、個数)
function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();

    // String[]形式で取得できる質問
    if (question == 'チェックボックス') {
          for (var j = 0; j < answer.length; j++) {
            console.log(question + '\[' + j + '\]' + ' : ' + answer[j]);
          }
    }
  }
}

プルダウン

プルダウンは「複数の選択肢の中から一つだけ選択できる入力」です。
通常のWeb画面では複数選択できるプルダウンもありますが、Googleフォームのプルダウンでは択一のみです。
プルダウンの入力は選択肢の設定を行います。
この質問では、下記のような設定もできます。

プルダウンの設定

  • セクションを設けている場合、選択した内容に応じて移動するセクションを変更できる
  • 選択肢の順番をシャッフルできる
たくみん

ラジオボタンとほぼ同じ用途の入力ですので、私はラジオボタンの選択肢が多くなったらプルダウンに切り替えて使っています。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    // String形式で取得できる質問
    if (question == 'プルダウン'){
      console.log(question + ' : ' + answer);
    }
  }
}

ファイルアップロード

ファイルアップロードは「ファイルをアップロードできる入力」です。
ファイルアップロードを選択するとGoogleドライブ上のフォームと同じフォルダにファイルの置き場所が新たに作られ、アップロードされたファイルはそこに格納されます。
アップロードできるファイル形式はGoogleドライブにアップロードできる全ての形式ですが、下記のどれかに特定することもできます(複数指定できる)。

特定できるファイル形式

  • ドキュメント
  • スプレッドシート
  • プレゼンテーション
  • PDF
  • 図形描画
  • 画像
  • 動画
  • 音声

「ファイルの最大数」「1ファイルあたりの最大サイズ」「ファイルの合計サイズ」を指定することもできます。

制約事項設定値
ファイルの最大数「1」「5」「10」から選択
1ファイルあたりの最大サイズ「1MB」「10MB」「100MB」「1GB」「10GB」から選択
ファイルの合計サイズ「1GB」「10GB」「100GB」「1TB」から選択
ファイルアップロード項目の設定
function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();

    // String[]形式で取得できる質問
    if (question == 'ファイルアップロード') {
          for (var j = 0; j < answer.length; j++) {
            console.log(question + '\[' + j + '\]' + ' : ' + answer[j]);
          }
    }
  }
}

均等目盛

均等目盛は「開始が『0』or『1』、終了が『2』〜『10』までの設定できる目盛り入力」です。
レビューや口コミでよく見かける★に近い入力です。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    // String形式で取得できる質問
    if (question == '均等目盛'){
      console.log(question + ' : ' + answer);
    }
  }
}

選択式(グリッド)

選択式(グリッド)は「行ごとに1つ選択できる入力」です。
1つの質問に対して、複数の観点で回答を要求する場合に使用できます。
例えば、ある料理に対して、「ご意見をください」という質問を用意して「味」「盛り付け」など複数の観点で回答が欲しい場合に利用できます。
質問によっては1列につき1つの回答に制限する必要がある場合も対応可能です。
行の並び替えがもできるのでテストの問題にも使えそうです。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();

    // String[]形式で取得できる質問
    if (question == '選択式(グリッド)') {
          for (var j = 0; j < answer.length; j++) {
            console.log(question + '\[' + j + '\]' + ' : ' + answer[j]);
          }
    }
  }
}

チェックボックス(グリッド)

チェックボックス(グリッド)は「各行で複数選択できる入力」です。
選択式(グリッド)と同様に1つの質問に対して、複数の観点で回答を要求する場合に使用できます。
1列につき1つの回答に制限する必要がある場合も対応可能です。
行の並び替えがもできるのでテストの問題にも使えそうです。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();

    // String[][]形式で取得できる質問
    if (question == 'チェックボックス(グリッド)') {
      for (var j = 0; j < answer.length; j++) {
        for (var k = 0; k < answer[j].length; k++) {
          console.log(question + '\[' + j + '\]' + '\[' + k + '\]' + ' : ' + answer[j][k]);
        }
      }
    }
  }
}

日付

日付は「カレンダー選択式の日付入力」です。直接入力することもできます。
日付の形式は、下記の4通りが設定できます。

カレンダーの入力形式

  • 年月日
  • 月日
  • 年月日 時分
  • 月日時分

日付のチェックは自動で設定されていて、存在しない日付(02/30など)を入力した場合はエラーとなります。
時刻も入力することができますが、直接入力のみで時分までです(入力できる範囲は00:00〜23:59)。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    // String形式で取得できる質問
    if (question == '日付'){
      console.log(question + ' : ' + answer);
    }
  }
}

時刻

時刻は「時刻の入力」です。日付とは異なり、直接入力のみです。
回答の種類が「時刻」と「経過時間」の2種類あり、「時刻」は00:00〜23:59の範囲、「経過時間」の最大入力は「72:59:59」で入力できます。

function myFunction(e) {
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    // String形式で取得できる質問
    if (question == '時刻'){
      console.log(question + ' : ' + answer);
    }
  }
}

まとめ

Googleフォームを使った投稿フォームの作り方と投稿フォームに設定できる質問の種類、GoogleAppsScriptを使った際の回答の取得方法を解説してきました。

GoogleフォームはGoogleが提供する無料の投稿フォーム作成サービスで、6ステップと簡単に作れますが、GoogleAppsScriptと呼ばれるプログラムを使えば自由にカスタマイズして高度な動きを追加できる優秀なサービスです。

回答の種類は11種類あり、回答の取得方法はitemResponse.getResponse()ですが、取得結果のデータ型(データ型についてはこちらを参考:Wikipedia)がString、String[]、String[][]の3種類あります。
answerの変数がString、String[]、String[][]のどれかでデータの読み出し方が異なるということでした。

Googleフォームの回答を使ってGoogleAppsScriptを実行する時には回答の取得が必須になりますので、ぜひマスターして欲しい内容です。