Google フォームでの送信時にユーザーが入力したデータへのアクセス
-
21-12-2019 - |
質問
次の 2 つのフィールドを持つ Google フォームがあります。
- 電子メールアドレス:- テキストボックス
- 道具:- ラジオボタン
- ツール1
- ツール2
- ツール3
ユーザーは自分の電子メール アドレスを入力し、ツールを選択して、[送信] をクリックします。次のメッセージが表示されるようにしたいと思います。
ご返信いただきありがとうございます。電子メールが次の宛先に送信されました 入力したメールアドレス ダウンロードする 選択したツール.
スクリプトエディタに次のコードがあります
function emailFormSubmission() {
var form = FormApp.getActiveForm();//the current form
var dest_id = form.getDestinationId(); //the destination spreadsheet where form responses are stored
var ss = SpreadsheetApp.openById(dest_id);//open that spreadsheet
var theFormSheet = ss.getSheets()[0]; //read the first sheet in that spreadsheet
var row = theFormSheet.getLastRow(); //get the last row
var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
form.setConfirmationMessage('Thanks for responding. An email has been sent to you '+ emailid + ' to download' + tool);
}
も設定しました triggers
実行する -> emailFormSubmission
, 、イベント -> from Form
, onFormSubmit
.
何が起こるかというと:最初のユーザー (「A」) が自分の情報を入力し、[送信] をクリックしたとします。入力した情報は正しく表示されます。2 番目のユーザー (「B」) が自分の情報を入力して送信をクリックすると、A の情報が表示されます。3 番目のユーザー (「C」) が自分の情報を入力して「送信」をクリックすると、B の情報が表示されます。スプレッドシートが更新されたため、問題は「getlastrow()」にあることがわかりました 後 emailForm送信が処理されます。
上記のコードのどこが間違っているのでしょうか?これを修正するにはどうすればよいですか?
アップデート
@wchiquitoのコメントに基づいて、機能するようにコードを次のように変更しました。
function emailFormSubmission(e) {
var form = FormApp.getActiveForm();
//Check this link on how to access form response:
//https://developers.google.com/apps-script/understanding_events?hl=en
var responses = e.response;//e is of type formresponse.
var emailid = responses.getItemResponses()[0].getResponse();
var tool = responses.getItemResponses()[1].getResponse();
Logger.log(emailid);
Logger.log(tool);
form.setConfirmationMessage('Thanks for responding. An email has been sent to '+ emailid + ' with instructions to download ' + tool +'. If you do not find our email in your inbox, please check your spam folder');
Logger.log(form.getConfirmationMessage());
}
解決
イベントを思い出してください On form submit
(イベントを理解する) は、次の構造を持つパラメーターを受け取ります。
- 価値観
- 範囲
- 名前付き値
そして次のようなことができます:
function emailFormSubmission(e) {
...
var row = e.range.getRow();
...
}
次のコードを試して、パラメータの構造を観察してください。 e
:
function emailFormSubmission(e) {
...
Logger.log(e);
...
}
アップデート
まず、混乱していることをお詫びします。 の構造を示しました。 Spreadsheet form submit event
実際に使用しているとき Form submit event
.
案の定、 Form submit event
は次の構造を持っています。
- 応答
型のオブジェクトを返す FormResponse
.
したがって、イベントを定義すると次のようになります。 On submit form
(Form submit event
)、次のようなことができます。
function emailFormSubmission(e) {
var itemResponses = e.response.getItemResponses();
for (var i = 0, len = itemResponses.length; i < len; ++i) {
Logger.log('Response #%s to the question "%s" was "%s"',
(i + 1).toString(),
itemResponses[i].getItem().getTitle(),
itemResponses[i].getResponse());
}
}
ただし、フォームの応答として送信されたデータに従って設定された確認メッセージは、あまり明確ではないようです。メッセージを設定することはできますが、次の応答ではない場合、アクティブな応答では表示されません。
他のヒント
私の最初の推測は、ここにある次の 2 行です。
var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
電話をかけるとき getLastRow()
シート上 - 最後の行を取得します。もちろんですが、イベントの順序とこれらの値がどのように処理されるかを考慮すると、 +1
, 、最新の提出物を取得します。現在、フォーム確認メッセージを更新するためにコードを実行すると、1 行遅れています。
したがって、コードを次のように変更するだけです。
var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();
私の意見では、スプレッドシートは Google サービスの中で最もわかりにくいです。スプレッドシートで値を取得すると、それらは []
または [][]
電話をかけるときの範囲に応じて getValues()
. 。しかし getRange()
に sheet
インデックス 1 から始まります (コードを読みやすくするためだと思います)。データの受け渡し方法が原因で、off-by-one エラーが発生していることがよくあります。スプレッドシートを使用するときは、このことに留意してください :)
短い答え:欲しいものはGoogleフォームではできません。
説明:form.setconfirmationMessage() は、現在アクティブなフォームではなく、サーバーに保存されているフォームの確認メッセージを設定します。form.setTitle() などにも同じことが当てはまります。アクティブなフォームは変更されません。確認メッセージでは異なる動作が期待されるかもしれませんが、残念ながらそうではありません。