web-dev-qa-db-ja.com

送信イベントハンドラーでフォーム値を取得する方法は?

ほんの2、3の質問(2つのオプションと短いテキストを含む複数の選択肢)を含む非常にシンプルなGoogleフォームで始めようとしています。作成後、スクリプトエディターを開いて入力しました

_function onSubmit(e) {
  Logger.log("onSubmit(%s)", JSON.stringify(e));
}
_

[編集]メニューの[現在のプロジェクトのトリガー]を使用して、[フォーム送信]トリガーのハンドラーとしてonSubmitを構成しました。

フォームに入力して送信すると、ハンドラーが呼び出されますが、ログにはこれしか表示されません。

_[17-04-15 18:56:23:584 CEST] onSubmit({"response":{},"source":{},"authMode":{},"triggerUid":1870249629})
_

つまり、応答フィールドは空です。私もFormApp.getActiveForm().getResponses()を使ってみましたが、いくつかの空のオブジェクトの配列も返します(OTOH、FormApp.getActiveForm().getTitle()はフォームに与えたタイトルを返します)。

フォームデータにアクセスするには、スクリプトに追加のアクセス許可を与える必要があると思いますが、その方法や、これが本当に問題なのかどうかもわかりません。

なぜフォームの値が取得されないのか、それらを取得するにはどうすればよいのか誰もが知っていますか?前もって感謝します!

13
VZ.

送信された値を取得するための2つのパターンがあります。両方のパターンについて、フォーム送信から値を取得するための関数をトリガーとしてインストールする必要があります。インストール可能なトリガーの詳細情報は https://developers.google.com/apps-script/guides/triggers/installable です。

1.スクリプトがスプレッドシートで開かれます。

この場合、トリガーをインストールすることにより、スクリプトによって送信された値を取得できます。イベントオブジェクトの詳細情報は https://developers.google.com/apps-script/guides/triggers/events#form-submit です。

スクリプト:

function onSubmit(e){
  Logger.log("%s", JSON.stringify(e));
}

結果:

{
  "values": [
    "date and time",
    "test"
  ],
  "namedValues": {
    "fromtestform": [
      "test"
    ],
    "timeStamp": [
      "date and time"
    ]
  },
  "range": {
    "columnStart": 1,
    "rowStart": 2,
    "rowEnd": 2,
    "columnEnd": 2
  },
  "source": {},
  "authMode": {},
  "triggerUid": #####
}

2.フォームでスクリプトが開かれます。

この場合、送信された値は次のスクリプトで取得できます。詳細情報は https://developers.google.com/apps-script/reference/forms/form-response です。

スクリプト:

function onSubmit(e){
  Logger.log("authMode=%s, source.getId()=%s", e.authMode, e.source.getId());
  var items = e.response.getItemResponses();
  for (i in items){
    Logger.log("getItem().getTitle()=%s, getResponse()=%s", items[i].getItem().getTitle(), items[i].getResponse());
  }
}

結果:

authMode=FULL, source.getId()=### form ID ###
getItem().getTitle()=## item's title ##, getResponse()=test

あなたの質問を誤解した場合、ごめんなさい。

22
Tanaike