こんにちは。
今日はGASを使ってGoogleフォームの回答を、フォームに紐づいているスプレッドシート上で自動処理する方法を簡単にまとめます。
私の経験上、こういった対応をするケースは
- スプレッドシート内で回答を集計し、再計算したい
- 回答に応じてデータを仕分けしたい
- スプレッドシート上で編集のうえ、PDF化したい
みたいな場合に使われることがありました。
なお、今回はスプレッドシートからフォームの回答イベントを取得するケースです。
Googleフォーム内でのイベント処理とは異なりますので、ご注意ください。
ちなみにスプレッドシートとフォームでイベントオブジェクトが変わるので、できることが異なります。
今回扱うイベントオブジェクトについての公式リファレンスは以下になります。
事前準備
まずはGoogleフォームと、それに紐づくスプレッドシートを作成しましょう。
もしこの手順の解説が不要でしたら、次の章までスキップしてください。
→ Googleフォームの回答をGASで取得する(スプレッドシート側)
Googleフォームの作成
まずはGoogleフォームを作成しましょう。
GASで処理すると言っても、フォーム側は特別何かする必要はありません。
今回の主題ではないので今回は割愛しますが、質問を順次作成しフォームを完成させます。
今回はサンプルとして、以下の質問を入れてみます。
- 氏名
- 生年月日
- 連絡先
今回のスコープではありませんが、プライバシーポリシー等には注意してくださいね。
質問の文言は重複させないようにする
経験上のTipsになりますが、質問の文言は重複させないようにしましょう。
Googleフォームは質問に任意のIDを付与することなどはできません。
質問の文言で判定して処理をしていくことになります。
そのため、同じ文言の質問があると「初出の質問はAについてで、二番目のはBについてで…」と、順番で判断する必要が出てしまい、メンテナンス性が著しく低下します。
スマートな実装にするのであれば、せめて「1, 2, …」のように質問の頭に番号を振っておくなどして、完全重複は避けるのがおすすめです。
フォームに紐付くスプレッドシートの作成
次にフォームに紐づくスプレッドシートを作成します。
この紐付けができていないと、スプレッドシート側でフォーム回答のイベントを受け取れないのでご注意ください。
作成したスプレッドシートの[回答]タブを選択すると、一番上に[スプレッドシートにリンク]というテキストリンクがあります。これをクリックします。
以下のダイアログが表示されるので、スプレッドシートを新しく作るのか、既存のスプレッドシートに紐づけるのかを選択します。
今回の手順ではスプレッドシートをまだ作成していないので、新規作成します。
作成されたスプレッドシートには[フォームの回答 1]というシートがあります。
シート名の箇所にフォームのアイコンがついているのが、紐づいている証拠です。
今後フォームに回答があると、ここに回答内容が格納されていくので、集計等にも使えます。
これで基本となる準備は完了です。
Googleフォームの回答をGASで取得できるようにする(スプレッドシート側)
それでは、肝心のGASで回答を取得する方法について解説します。
やることはGASの処理を書いて、トリガー設定をすること。
それぞれ説明いたします。
GASのコーディング
早速GASを書いていきます。
スプレッドシートの上部メニューにある[拡張機能] > [Apps Script]を選択してGAS編集画面を開きます。
ソースコードは以下を参考にしてください。
function onFormSubmit(e) {
const dictValues = e.namedValues //{"質問": ["回答"]}のセットを取得する
const userRes = e.values //回答のみを一覧で取得する
console.log(dictValues)
// 質問の文言で回答を取得する
let nameDic = dictValues["氏名"][0] //回答は配列なので0を指定
let birthDic = dictValues["生年月日"][0]
let addressDic = dictValues["連絡先"][0]
// 取得した回答によって好きな処理を入れる
console.log(nameDic)
console.log(birthDic)
console.log(addressDic)
console.log(userRes)
// 質問の順番で回答を取得する(0スタート、0は回答時刻が入る)
let nameNum = userRes[1]
let birthNum = userRes[2]
let addressNum = userRes[3]
// 取得した回答によって好きな処理を入れる
console.log(nameNum)
console.log(birthNum)
console.log(addressNum)
}
これで取得した値を確認できるようになりました。
あとは任意で処理を書いていき、便利に活用できるようにしましょう。
トリガーを設定する
最後に、トリガーを設定します。
トリガーはどのタイミングで関数(今回のサンプルだとonFormSubmit)を実行するタイミングのことです。今回はGoogleフォームで回答があったら、onFormSubmit()を実行するトリガーを設定します。
GAS画面の左側にあるメニューから[トリガー]を選択し、[ + トリガーを追加 ]ボタンを押します。
すると設定用のダイアログが出るので、以下のとおり設定してください。
大切なポイントは「実行する関数を選択」欄と「イベントの種類を選択」欄です。
ここが適切に設定できれば、どのタイミングでどの処理をするかが確定します。
最後に保存ボタンを押すのを忘れずに。
注意点
シンプルトリガーに注意
GASのトリガーにはユーザが設定するものとは別で、内部であらかじめ設定されているものがあります。
これらをシンプルトリガーと言うのですが、GASの関数名がこれらと一致してしまうと思わぬタイミングで関数が実行されてしまいます。
事故を未然に防止する観点でも、あらかじめ把握しておきましょう。
回答によって質問を分岐している場合は注意
Googleフォームは回答によって質問を分岐させることも可能です。
分岐設定している場合、イベントの内容にも違いが出てきてしまいます。
基本的には紐づいているスプレッドシートの表示通りに取得されるのですが、稼働開始させる前に、どのように分岐されるかを確認しておくのがおすすめです。
慣れれば楽に作れる
今回はスプレッドシート側のGASでGoogleフォームの回答内容を取得する方法について解説しました。
Googleフォーム側の実装と少しだけ要領が違いますが、いずれにしろ慣れればそれほど難しいものではりません。
上手に使って、作業を楽にしてくださいね。