Help us understand the problem. What is going on with this article?

フォームから送信された時のパラメータを比べてみる

More than 5 years have passed since last update.

フォームから送信時に走るスクリプトのパラメータを確認するために、下記のようなスクリプトで実験してみました。
フォームは「テスト」というタイトルのテキスト入力欄のみのフォームです。

また、GoogleAppsのみの機能でユーザー名(メールアドレス)を自動的に収集するオプションをつけています。
https://support.google.com/drive/answer/160166?hl=ja

function myFunction(e){
  MailApp.sendEmail({
    to: 'hoge@gmail.com',
    subject: 'パラメータテスト',
    body : e
  });
}

スプレッドシートのスクリプトでの場合

{values=[Ljava.lang.Object;@*****, namedValues={タイムスタンプ=[Ljava.lang.Object;@**, ユーザー名=[Ljava.lang.Object;@**, テスト=[Ljava.lang.Object;@*****}, range=Range, source=Spreadsheet}

※[Ljava.lang.Object;@の後ろは********に置換しています。

[Ljava.lang.Object;@********の部分については後ろに「+''」とすることで正しく取得することができます。
正しく取得すると下記のようになります。

namedValues.タイムスタンプ : 2013/10/09 11:21:30
namedValues.ユーザー名 : [メールアドレス]
namedValues.テスト : 回答内容だよ
namedValues : [object Object]
values : 2013/10/09 11:21:30,回答内容だよ,[メールアドレス]
source : Spreadsheet
range : Range

sourceのSpreadsheetはこの回答が記録されるスプレッドシートのオブジェクトで、rangeは回答部分のみのRangeのようです。
各種値が[Ljava.lang.Object;@********のようになってしまうのでいちいち変換しなくてはいけない分ちょっと面倒な感じ。(環境周りの問題?)

フォームのスクリプトでの場合

{response=FormResponse}

こっちはシンプルにFormResponseオブジェクトがそのまま取得できます。
https://developers.google.com/apps-script/reference/forms/form-response

また、GoogleAppsの場合はgetRespondentEmail()を呼び出すことによって自動的に収集したユーザーメールアドレスを取得することができるので、自動メール返信なども簡単に行うことができます。

メールの自動返信をする場合の注意

よく見かけるのがスプレッドシートのスクリプトで、送信された時にフォームの最後の行を取得して~というやり方ですが、このやり方だと、処理内容にもよりますがほぼ同時に送信された場合、スクリプト内で取得する最後の行が同じ内容になる場合があります。(フォームから送信→スクリプトが走るまでの間にスプレッドシートの行が増えてしまう)

同時に多量の送信がなされる可能性がある場合、なるべく引数の値を使ってメール返信を行うのがベターだと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away