【GAS】Googleフォームの様々な項目の回答取得方法について徹底解説

​ GAS(Google Apps Script)を使ってGoogleフォームの回答を取得する際、複数回答やアップロードファイルの取得に悩んだことがある方も多いでしょう

単一の回答であれば簡単に取得できますが、複数回答可能なチェックボックスタイプの質問や、アップロードファイルの取得方法等、どのように回答を取得するのか苦慮するケースも少なくありません

そこで、本記事ではGASを使用して、Googleフォームの各項目から回答データを取得方法を詳しく解説します

こーすけ先生

Googleフォームでどのように値を取得すればよいのか
基礎的な内容をしっかり解説していきます!

本記事の内容
  • Googleフォームのフォーム項目をGASで取得する
  • 回答内容をGASで取得して、console.logに出力する
  • 回答形式に応じた回答の取得方法を学ぶ
こーすけ先生

本記事では各フォーム項目値ごとの取得方法を徹底解説します!
Googleフォームを扱う上での基礎が知りたい人は絶対に抑えておくべき内容です

この記事を読めば、Googleフォームの回答データの取得方法について学ぶことができます!

この記事の執筆者について
  • GASの人
  • ITベンダSEとして12年勤務する中で民間、金融、官公庁の現場を一通り経験済
  • 現在は公務員をやりながら起業に向けて着々と準備中
GASなら任せろ!

​GASを極めたい方や、業務の効率化を図りたい方は、ぜひこの記事を読んください!
難しいことはGASに任せて、我々人間は楽しちゃいましょう!

こーすけ先生

当ブログでは実際に仕事でGASを扱っている私が、GASの魅力について徹底的に取り上げていきます!

目次

【お題】GASを用いてGoogleフォームの各項目を取得する

本記事で取り組む演習
  • Googleフォームのフォーム項目をGASで取得する
  • 回答内容をGASで取得して、console.logに出力する
こーすけ先生

本記事は初心者の方向けに丁寧に解説しているので【STEP3】が見たい!という方はここをクリックして、【STEP3】までジャンプしてください

【事前準備①】Googleフォームを作成する

こーすけ先生

参考に私が作成したフォームは以下となります!

項目種別一覧
  • 記述式
  • 段落
  • ラジオボタン
  • チェックボックス
  • プルダウン
  • ファイルのアップロード
  • 均等目盛
  • 選択式_グリッド
  • チェックボックス_グリッド
  • 日付
  • 時刻
がすぴょん

正直、こんな項目あったんだ!
という項目もあるね笑

こーすけ先生

作る項目が多いけど、知見を深めるために
真似して作ってみて

【事前準備②】作成したGoogleフォームに回答する

こーすけ先生

Googleフォームを作成したら、右上の「プレビュー」ボタンを
押下して、一度回答してみましょう

のちほど回答データを取得するためだけなので、どのような回答でも構いません

【STEP1】Googleフォームのフォーム項目をGASで取得する

準備したGoogleフォームからコンテナバインド型でGASプログラムを記述していきましょう
Googleフォームからコンテナバインド型のGASを開く場合は、こちらを参考にしてください

こーすけ先生

では、どんどんいきますよ!
しっかり、ついてきてください

function gaslog_formSubmit(e) {
  let itemResponses;
  // フォームの回答をイベントオブジェクトまたはフォーム自身から取得する。
  if (e !== undefined) {
    itemResponses = e.response.getItemResponses();
  } else {
    const wFormRes = FormApp.getActiveForm().getResponses();
    itemResponses =  wFormRes[wFormRes.length-1].getItemResponses();
  }
  console.log(itemResponses);
}
12:05:13	お知らせ	実行開始
12:05:14	情報	[ { toString: [Function],
    getFeedback: [Function],
    getItem: [Function],
    setScore: [Function],
    setFeedback: [Function],
    getScore: [Function],
    getResponse: [Function] },
…
  { toString: [Function],
    getFeedback: [Function],
    getItem: [Function],
    setScore: [Function],
    setFeedback: [Function],
    getScore: [Function],
    getResponse: [Function] } ]
12:05:14	お知らせ	実行完了
こーすけ先生

とりあえず、ばっちりとオブジェクトを
取得できていることが分かります!

  • getItemResponses()
    フォームのレスポンスに含まれるすべてのアイテムのレスポンスを、フォームに表示されるアイテムと同じ順序で取得する
こーすけ先生

クリックすると、公式リファレンスにジャンプします

【STEP1】の補足説明

こーすけ先生

分かる方はここをクリックして、【STEP2】へ進んでください

function gaslog_formSubmit(e) {
  let itemResponses;
  // フォームの回答をイベントオブジェクトまたはフォーム自身から取得する。
  if (e !== undefined) {
    itemResponses = e.response.getItemResponses();
  } else {
    const wFormRes = FormApp.getActiveForm().getResponses();
    itemResponses =  wFormRes[wFormRes.length-1].getItemResponses();
  }
  console.log(itemResponses);
}
 // フォームの回答をイベントオブジェクトまたはフォーム自身から取得する。
  if (e !== undefined) {
    itemResponses = e.response.getItemResponses();
  } 

もし 、イベントオブジェクトeundefined でない場合、イベントオブジェクトから回答情報を取得します

e.response はイベントオブジェクト内のフォームの回答に関するプロパティであり、getItemResponses() メソッドは回答に含まれる個々の質問と回答のペアを含むオブジェクトの配列を返します

 } else {
    const wFormRes = FormApp.getActiveForm().getResponses();
    itemResponses =  wFormRes[wFormRes.length-1].getItemResponses();
  }

eundefined である場合、このブロックが実行されます

こーすけ先生

つまり、直接フォームの回答を取得する必要があります

 const wFormRes = FormApp.getActiveForm().getResponses();

フォームの全ての回答を取得し、それを wFormRes という変数に格納しています

itemResponses =  wFormRes[wFormRes.length-1].getItemResponses();

wFormRes 配列の最後の要素(最新の回答)を取得し、その回答に含まれる質問と回答のペアを含むオブジェクトの配列を itemResponses に代入しています

こーすけ先生

この条件分岐を使用することで、送信イベントが発生した場合と、直接回答を取得する場合の2つのケースに対応できます!

イベントオブジェクトが存在する場合は、それから回答情報を取得し、存在しない場合はフォームの全回答から最新の回答を取得しています

【STEP2】回答内容をGASで取得して、console.logに出力する

こーすけ先生

では、回答内容を確認していきましょう
まずは単純にタイトルと回答を取得してみます!

function gaslog_formSubmit(e) {
  let itemResponses;
  // フォームの回答をイベントオブジェクトまたはフォーム自身から取得する。
  if (e !== undefined) {
    itemResponses = e.response.getItemResponses();
  } else {
    const wFormRes = FormApp.getActiveForm().getResponses();
    itemResponses =  wFormRes[wFormRes.length-1].getItemResponses();
  }
  // 取得したフォーム項目を1件ずつ処理する
  itemResponses.forEach(function(itemResponse){
    console.log('********************');
    console.log(itemResponse.getItem().getTitle());
    console.log(itemResponse.getResponse());
  });
}
12:29:11	お知らせ	実行開始
12:29:12	情報	********************
12:29:12	情報	記述式
12:29:12	情報	記述式の回答です。
12:29:12	情報	********************
12:29:13	情報	段落
12:29:13	情報	段落の回答です。
改行もできるのが特徴です。
12:29:13	情報	********************
12:29:13	情報	ラジオボタン
12:29:13	情報	その他は自由記述ができるので便利です。
12:29:13	情報	********************
12:29:13	情報	チェックボックス
12:29:13	情報	[ '選択肢 2', 'その他は自由記述ができるので便利です。' ]
12:29:13	情報	********************
12:29:13	情報	プルダウン
12:29:13	情報	選択肢 2
12:29:13	情報	********************
12:29:13	情報	ファイルのアップロード
12:29:13	情報	[ '14hA8OJAK3pVLB7HVjA3pI5SzJRqBjI6F' ]
12:29:13	情報	********************
12:29:13	情報	均等目盛
12:29:13	情報	2
12:29:13	情報	********************
12:29:13	情報	選択式_グリッド
12:29:13	情報	[ '列 2', '列 1' ]
12:29:13	情報	********************
12:29:13	情報	チェックボックス_グリッド
12:29:13	情報	[ [ '列 2' ], null ]
12:29:13	情報	********************
12:29:13	情報	日付
12:29:13	情報	2023-11-16
12:29:13	情報	********************
12:29:14	情報	時刻
12:29:14	情報	22:51
12:29:14	お知らせ	実行完了

forEach文を使って、itemResponses 配列に含まれる要素を順に取り出し、記述したコールバック関数に渡して処理することができます

フォームの質問を取得するには、以下のように記述し、

変数.getItem().getTitle()

フォームの回答を取得するには、以下のように記述します

変数.getItem().getTitle()

実行結果を見ると、getResponse()により、択一のものに関しては回答がそのまま、選択式のものに関しては配列で取得できていることがわかります

【STEP3】回答項目の種類ごとに回答を取得する

こーすけ先生

では、これを考慮して、各項目タイプにより回答の取得方法を変化させましょう

質問がテキスト、ラジオボタン、チェックボックス…等の種類によって処理が分かれています

function gaslog_formSubmit(e) {
  let itemResponses;
  // フォームの回答をイベントオブジェクトまたはフォーム自身から取得する。
  if (e !== undefined) {
    itemResponses = e.response.getItemResponses();
  } else {
    const wFormRes = FormApp.getActiveForm().getResponses();
    itemResponses =  wFormRes[wFormRes.length-1].getItemResponses();
  }
  itemResponses.forEach(function(itemResponse){
    switch (itemResponse.getItem().getType()) {
      case FormApp.ItemType.TEXT:             // 記述式
      case FormApp.ItemType.PARAGRAPH_TEXT:   // 段落
      case FormApp.ItemType.MULTIPLE_CHOICE:  // ラジオボタン
      case FormApp.ItemType.LIST:             // プルダウン
      case FormApp.ItemType.SCALE:            // 均等目盛
      case FormApp.ItemType.DATE:             // 日付
      case FormApp.ItemType.DATETIME:         // 時刻
        console.log(itemResponse.getResponse());
        break;
      case FormApp.ItemType.CHECKBOX:         // チェックボックス
        itemResponse.getResponse().forEach(function(item) {
          console.log(item);
        });
        break;
      case FormApp.ItemType.FILE_UPLOAD:      // ファイルのアップロード
        itemResponse.getResponse().forEach(function(item) {
          const upFile = DriveApp.getFileById(item);
          console.log(upFile);
        });
        break;
      case FormApp.ItemType.GRID:             // 選択式_グリッド
        itemResponse.getResponse().forEach(function(item, idx) {
          if (item) {
            console.log(`${idx+1}行目:${item}`);
          }
        });
        break;
      case FormApp.ItemType.CHECKBOX_GRID:    // チェックボックス_グリッド:
        itemResponse.getResponse().forEach(function(item, idx) {
          if (item) {
            item.forEach(function(choise){
              console.log(`${idx+1}行目:${choise}`);
            })
          }
        });
        break;
      default:
        console.log('タイプが別のものが来た場合')
        break;
    }
  });
}

各項目は、getType()により項目タイプの取得が可能であり、FormApp.ItemType判別が可能です
質問項目だけでなく、セクションやタイトルなども取得することが可能です

こーすけ先生

itemResponse.getResponse()で単純に取得できるものは置いといて、他のタイプを確認していきましょう!

「テキスト」「段落テキスト」等、回答が1つしかない場合

この部分では、フォームの質問の種類が「テキスト」「段落テキスト」「ラジオボタン」「プルダウン」「均等目盛」「日付」「時刻」のいずれかである場合に、その質問に対する回答を単一の回答として扱い、getResponse() を使用して取得し、それをコンソールに表示しています

itemResponses.forEach(function(itemResponse){
    switch (itemResponse.getItem().getType()) {
      case FormApp.ItemType.TEXT:             // 記述式
      case FormApp.ItemType.PARAGRAPH_TEXT:   // 段落
      case FormApp.ItemType.MULTIPLE_CHOICE:  // ラジオボタン
      case FormApp.ItemType.LIST:             // プルダウン
      case FormApp.ItemType.SCALE:            // 均等目盛
      case FormApp.ItemType.DATE:             // 日付
      case FormApp.ItemType.DATETIME:         // 時刻
        console.log(itemResponse.getResponse());
        break;
こーすけ先生

回答が1つしかない「記述式」「段落」「ラジオボタン」等の
質問は、itemResponse.getResponse()で回答が取得できるね!

switch文とは

switch (式){
  case 値1:
    式 === 値1 の時に実行する処理;
    .....
    break;
  case 値2:
    式 === 値2 の時に実行する処理;
    .....
    break;
  default:
    式がいずれの値とも一致しないときに実行する処理;
    .....
}

switch 文は、 case の後に指定されたいずれかの値と一致する場合、 case 句の後に記述されている処理を switch 文の最後または break 文まで順に実行します

こーすけ先生

いずれの値とも一致しなかった場合は default 句の後に
記述されている処理を実行します

回答が複数あるパターンだと、回答の取得方法を工夫する必要があります

チェックボックスの場合の回答取得方法

itemResponse.getResponse().forEach(function(item) {
  console.log(item);
});
こーすけ先生

チェックボックスはラジオボタンとは異なり複数の選択がされる場合があります

そのため、itemResponse.getResponse()で得た回答の配列をforEachで取得すると良いかと思います。

アップロードファイルの取得方法

itemResponse.getResponse().forEach(function(item) {
  const upFile = DriveApp.getFileById(item);
  // これをどう扱うかは、やりたいこと次第。
});;
こーすけ先生

ファイルのアップロードはアップロードしたファイルのIDを配列で取得することができます

そのため、チェックボックスと同様にitemResponse.getResponse()で得た回答の配列をforEachで取得し、得たIDをDriveApp.getFileById()によりGAS内で扱いやすくすると良いかと思います。

選択式グリッドの場合の回答取得方法

itemResponse.getResponse().forEach(function(item, idx) {
  if (item) {
    console.log(`${idx+1}行目:${item}`);
  }
});

選択式グリッドは各行の回答が配列で返ってくるため、itemResponse.getResponse()で得た回答の配列をforEachで取得すると良いかと思います

主に「各行で1つの回答を必須にする」オプションを付与して利用することが多いかと思いますが、上記のようにif (item){…}で各行の回答がnullかどうかを判別すれば汎用的に使えます

チェックボックスグリッドの場合の回答取得方法

itemResponse.getResponse().forEach(function(item, idx) {
  if (item) {
    item.forEach(function(choise){
      console.log(`${idx+1}行目:${choise}`);
    })
  }
});

チェックボックスグリッドは各行の回答が配列で、さらに各行内における回答もFormApp.ItemType.CHECKBOXと同様に配列で返ってくるため、正確に回答を捕捉するためにはitemResponse.getResponse()で得た回答の配列をforEachで取得し、さらにそれをforEachで取得すると良いかと思います

選択式とグリッドと同様に「各行で1つの回答を必須にする」オプションを付与することができますので、上記のようにif (item){…}で各行の回答がnullかどうかを判別すれば汎用的に使えます

まとめ

本記事では、Googleフォームの項目ごとの回答取得方法や、様々な回答形式(テキスト形式やプルダウン形式、マトリクス形式など)にどうアクセスすればよいかについて重点的に解説しました

今回はconsole.logに出力するといった非常に単純なことしかしておりませんが、取得した回答を煮るなり焼くなりすればなんでもできます!

次回は私がとある案件で行った「Googleフォームで欠席フォームを作成し、その回答から欠席届を作成する」方法をご紹介したいと思います!!

こーすけ先生

案件で行っただけあって、超実践的な内容ですよ!笑

引き続き、GASを楽しみながら、業務効率化しちゃいましょう!!

こーすけ先生

X(旧:Twieer)にて、ブログの更新やQiita記事の更新、GAS情報をお届けしますので、是非フォローしてください!

こーすけ先生

おかげさまで今年5月に起業しました!
GASやGoogleサービス、プログラミング全般のご相談承ります!

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

GASの人。ITベンダSEとして12年勤務し、民間、金融、官公庁の現場を一通り経験済。html、css、JavaScript、Java、PHPも分かります。最近は専らGASで小規模アプリケーションを頻繁に作成しています。GASのことなら何でもお任せあれ!現在は公務員として働きながら、起業に向けて着々と準備中です!

コメント

コメントする

CAPTCHA


目次