Translate

2021年1月11日

GASでGoogleフォームの値を取得する(トリガー編)

ゾウでもわかる Google Apps Script

Googleフォームでの回答内容をGAS(Google Apps Script)で参照する方法です。

Googleフォームの値を取得するには2種類の方法があります。

  1. フォームが実行されたときに値を取得
  2. フォームを指定して回答内容を取得

今回は、「フォームが実行されたときに値を取得」についての説明です。


Googleフォーム実行時に値を取得

Apps Scriptはトリガーを設定することができるのでフォームが送信されたときに実行することができます。

スクリプトは、フォームから直接か、

GoogleフォームでGoogle Scriptを書く

回答先のシートから記述します。

 GoogleシートでGoogle 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を最初に学ぶ一冊として良書です。

6 件のコメント:

  1. 仕組みがよく分かりました。ありがとうございます。

    返信削除
    返信
    1. 少しでもお役に立てたのであれば光栄です!

      削除
  2. >フォームの値を取得する関数は、スクリプトエディタからは実行できません。

    この意味が理解できていないのですが、
    まだGASについて初心者で、
    現在'namedValues' of undefinedのエラーが出て対応できずにいるものです。

    フォームから引数eに何も渡されていないのですね?

    私は
    function getFormValue(e) {
    console.log(e.values);
    }


    TypeError: Cannot read property 'values' of undefined

    が出て'values'すらできませんでした。

    スクリプトから実行できないのであれば、何からなら実行できるのでしょうか?

    返信削除
    返信
    1. トリガーからスクリプトが実行されたときだけ 引数eに値が受け渡されます。トリガーの設定で記載していますが、フォーム送信時にgetFormValuse()を実行するように設定してください。動作を確認するときには、都度フォームから送信する必要があります。フォームから送信後にログを確認するとconsole.log(e.values)の結果が表示されます。

      削除
  3. e.response.getItemResponses()であれば通るのですが、e.valuesだと通らないのは何が原因でしょうか?

    返信削除
    返信
    1. トリガーで起動しても下記がエラーとなるということでしょうか?
      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 となります。「トリガーの設定」をしてフォームで回答すると実行されますので、エディタの右メニューの実行数から実行結果を確認してみてください。

      削除

アクセス上位(過去7日間)