Googleフォームでの回答内容をGAS(Google Apps Script)で参照する方法です。
Googleフォームの値を取得するには2種類の方法があります。
今回は、「フォームが実行されたときに値を取得」についての説明です。
Googleフォーム実行時に値を取得
Apps Scriptはトリガーを設定することができるのでフォームが送信されたときに実行することができます。
スクリプトは、フォームから直接か、
回答先のシートから記述します。
トリガーの設定
トリガーの設定は、スクリプトの左側にあるメニューの時計のアイコンからです。
下例では、後述するサンプルプログラムの getFormValue を選択しています。イベントの種類は「フォーム送信時」を選んでください。
function(e)とは?
フォーム送信時のトリガーで関数が実行されると、フォームの回答内容が関数の()内に指定した引数に渡されます。
function(e) のように引数をeとしている例が多いですが、これはイベントオブジェクトの表記に基づいているからだと思いますが、別に引数は e でなくても問題ありません。
連想配列で取得する(namedValues)
namedValue を使うと {キー:値} という形でデータを取得できます。pythonではディクショナリー(辞書型)と呼ばれている配列です。
実際のデータで説明するのがわかりやすいと思います。
① 下記のフォームで送信します
② トリガーでフォーム送信時に getFormValue を実行するように設定
getFormValue関数には、下記のコードを記載します。
namedValues でキーに質問名、値に回答内容を連想配列として取得したものをログに出力します。
function getFormValue(e) { console.log(e.namedValues) }
フォームの質問項目は、日付、時刻、氏名ですが、namedValues で取得すると、時刻、氏名、日付の順番となっています。タイムスタンプは、回答を送信したときの時間です。
{ '時刻': [ '11:11:00' ], '氏名': [ 'キリンと散歩' ], '日付': [ '2021/01/11' ], 'タイムスタンプ': [ '2021/01/10 12:25:19' ] }
質問名で値を取得する
namedValues['質問名'][0]
で、質問の回答を取得できます。[0]は、質問名の0番目(最初)の値を意味しますが、値がひとつしかないので省略可能です。
下記のコードで、質問名が氏名の内容を出力します。
function getFormValue(e) { var name = e.namedValues['氏名'][0] console.log('氏名 = ' + name) }
氏名 = キリンと散歩
一次元配列として取得する(values)
values を使うと一次元配列で取得できます。
function getFormValue(e) { console.log(e.values) }
こちらはフォームの順番に従っています。
[ '2021/01/10 12:25:19', '2021/01/11', '11:11:00', 'キリンと散歩' ]
namedValuesでのサンプルコードと同じく氏名の値を取得するのであれば、4番目の項目となるのでvalues[3]とします。
※配列は0からの指定なので、上記のデータであれば
- values[0] タイムスタンプ
- values[1] 日付
- values[2] 時刻
- values[3] 氏名
となります。
function getFormValue(e) { var name = e.values[3] console.log('氏名 = ' + name) }
氏名 = キリンと散歩
通常の配列なので、lengthを使ってforループで回して全ての項目を出力することも可能です。
function getFormValue(e) { for (var i = 0; i < e.values.length; i++) { console.log(e.values[i]) } }
2021/01/10 12:25:19 2021/01/11 11:11:00 キリンと散歩
分割代入で変数にフォーム値を代入
分割代入を使うと配列から値を取り出して個別の変数に代入することが可能です。
function getFormValue(e) { var [timeStamp, date, time, name] = e.values console.log(name) }
キリンと散歩
実行する上での注意事項
フォームの値を取得する関数は、スクリプトエディタからは実行できません。
getFormValueをスクリプトから実行すると、eの引数に何も渡されていないので、e.namedValues で 'namedValues' of undefined とエラーとなります。
「送信後に編集」は変更項目のみ取得可能
フォームの設定で「送信後に編集」をオンにしておくと、回答者は回答を編集をすることができます。
回答を編集して送信された場合は、変更された内容しか取得できません。何も回答を変更せずに送信されると取得できる項目はタイムスタンプだけとなります。
function getFormValue(e) { console.log(e.namedValues) console.log(e.values) }
{ '氏名': [ '' ], 'タイムスタンプ': [ '2021/01/10 12:50:40' ], '時刻': [ '' ], '日付': [ '' ] } [ '2021/01/10 12:50:40', '', '', '' ]
GASの基礎を学べる参考図書
ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。
「詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。
Udemy オススメ講座
【新IDE対応】Google Apps Script(GAS)の基礎を完全習得
講師:事務職たらこ
印象に残りやすい手書き風スライドを用いGASの基本的なプログラミングを気軽に学ぶことができる。本講座でGASを活用した自動化ができるレベルにはなれないが、基礎としては十分。
仕組みがよく分かりました。ありがとうございます。
返信削除少しでもお役に立てたのであれば光栄です!
削除>フォームの値を取得する関数は、スクリプトエディタからは実行できません。
返信削除この意味が理解できていないのですが、
まだGASについて初心者で、
現在'namedValues' of undefinedのエラーが出て対応できずにいるものです。
フォームから引数eに何も渡されていないのですね?
私は
function getFormValue(e) {
console.log(e.values);
}
で
TypeError: Cannot read property 'values' of undefined
が出て'values'すらできませんでした。
スクリプトから実行できないのであれば、何からなら実行できるのでしょうか?
トリガーからスクリプトが実行されたときだけ 引数eに値が受け渡されます。トリガーの設定で記載していますが、フォーム送信時にgetFormValuse()を実行するように設定してください。動作を確認するときには、都度フォームから送信する必要があります。フォームから送信後にログを確認するとconsole.log(e.values)の結果が表示されます。
削除e.response.getItemResponses()であれば通るのですが、e.valuesだと通らないのは何が原因でしょうか?
返信削除トリガーで起動しても下記がエラーとなるということでしょうか?
削除function getFormValue(e) {
console.log(e.values)
}
https://walking-elephant.blogspot.com/2021/01/gas.formapp.html で説明している方法は、フォームを指定して値を取得する方法ですが、こちらのサンプルでは、トリガー起動でないと引数eに値を受け取れません。マニュアルでプログラムを実行すると、TypeError: Cannot read property 'values' of undefined となります。「トリガーの設定」をしてフォームで回答すると実行されますので、エディタの右メニューの実行数から実行結果を確認してみてください。