GAS(Google Apps Script)を使ってGoogleフォームの回答を取得する際、複数回答やアップロードファイルの取得に悩んだことがある方も多いでしょう
単一の回答であれば簡単に取得できますが、複数回答可能なチェックボックスタイプの質問や、アップロードファイルの取得方法等、どのように回答を取得するのか苦慮するケースも少なくありません
そこで、本記事ではGASを使用して、Googleフォームの各項目から回答データを取得方法を詳しく解説します
Googleフォームでどのように値を取得すればよいのか
基礎的な内容をしっかり解説していきます!
本記事では各フォーム項目値ごとの取得方法を徹底解説します!
Googleフォームを扱う上での基礎が知りたい人は絶対に抑えておくべき内容です
この記事を読めば、Googleフォームの回答データの取得方法について学ぶことができます!
GASを極めたい方や、業務の効率化を図りたい方は、ぜひこの記事を読んください!
難しいことはGASに任せて、我々人間は楽しちゃいましょう!
当ブログでは実際に仕事でGASを扱っている私が、GASの魅力について徹底的に取り上げていきます!
【お題】GASを用いてGoogleフォームの各項目を取得する
本記事は初心者の方向けに丁寧に解説しているので【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 お知らせ 実行完了
とりあえず、ばっちりとオブジェクトを
取得できていることが分かります!
クリックすると、公式リファレンスにジャンプします
【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();
}
もし 、イベントオブジェクトe
が undefined
でない場合、イベントオブジェクトから回答情報を取得します
e.response
はイベントオブジェクト内のフォームの回答に関するプロパティであり、getItemResponses()
メソッドは回答に含まれる個々の質問と回答のペアを含むオブジェクトの配列を返します
} else {
const wFormRes = FormApp.getActiveForm().getResponses();
itemResponses = wFormRes[wFormRes.length-1].getItemResponses();
}
e
が undefined
である場合、このブロックが実行されます
つまり、直接フォームの回答を取得する必要があります
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
で取得すると良いかと思います
チェックボックスグリッドの場合の回答取得方法
itemResponse.getResponse().forEach(function(item, idx) {
if (item) {
item.forEach(function(choise){
console.log(`${idx+1}行目:${choise}`);
})
}
});
チェックボックスグリッドは各行の回答が配列で、さらに各行内における回答もFormApp.ItemType.CHECKBOX
と同様に配列で返ってくるため、正確に回答を捕捉するためにはitemResponse.getResponse()
で得た回答の配列をforEach
で取得し、さらにそれをforEach
で取得すると良いかと思います
まとめ
本記事では、Googleフォームの項目ごとの回答取得方法や、様々な回答形式(テキスト形式やプルダウン形式、マトリクス形式など)にどうアクセスすればよいかについて重点的に解説しました
今回はconsole.logに出力するといった非常に単純なことしかしておりませんが、取得した回答を煮るなり焼くなりすればなんでもできます!
次回は私がとある案件で行った「Googleフォームで欠席フォームを作成し、その回答から欠席届を作成する」方法をご紹介したいと思います!!
案件で行っただけあって、超実践的な内容ですよ!笑
引き続き、GASを楽しみながら、業務効率化しちゃいましょう!!
X(旧:Twieer)にて、ブログの更新やQiita記事の更新、GAS情報をお届けしますので、是非フォローしてください!
おかげさまで今年5月に起業しました!
GASやGoogleサービス、プログラミング全般のご相談承ります!
YouTubeでGoogleサービスをより
快適に使う方法をご紹介しています!
見て頂けたらうれしいです
コメント