入力を検証し、送信時にメールを送信するGoogleドライブフォームに取り組んでいます。問題は、Google が作成したフォーム コントロールにハンドラーをアタッチすることです。一部のチュートリアルでは、コントロールを作成して UiApp のインスタンスに追加し、ハンドラーをアタッチした後に関数からそのオブジェクトを返します。フォームを開いたときにそのような関数を呼び出そうとしましたが、機能しませんでしたが、このように送信時に関数を呼び出すことができます。
function sendFormByEmail(e)
{
var email = "some@email.com";
var subject = "Form Results";
var message = ""; for(var field in e.namedValues)
{
message += field + ' :: ' + e.namedValues[field].toString() + "\n\n";
}
MailApp.sendEmail(email, subject, message);
}
ただし、クライアント側とサーバー側の検証を行いたいです。html がコントロールに対してどのような属性を持っているかを確認するだけで、その方法でコントロールを見つけることができるという考えが頭に浮かびましたが、Google が ID、クラス、またはその件についてはいつでも名前を付けてください。最後に使用して UiApp のインスタンスを返そうとしたコードを次に示しますが、コントロールを取得して自分のやり方で処理したいと思います。
function doGet(){
//create app
var app = UiApp.createApplication();
//controls
var txtbAccountNumber = app.createTextBox().setId('tbAccountNumber').setName('tbnAccountNumber');
var txtbOwnerEmail = app.createTextBox().setId('tbOwnerEmail').setName('tbnOwnerEmail');
var txtbAccountAdjustment = app.createTextBox().setId('tbAccountAdjustment').setName('tbnAccountAdjustment');
var btnSubmit = app.createButton("Submit").setEnabled(false);
var lblEmailFailed = app.createLabel("The email was not valid");
var lblAccountNumber = app.createLabel("The account number was not valid");
var lblAccountAdjustment = app.createLabel("The account adjustment was not valid");
//handler for submit click
var handler = app.createServerHandler("validateInput")
.validateEmail(txtbOwnerEmail)
.validateNumber(txtbAccountNumber)
.validateNumber(txtbAccountAdjustment)
.addCallbackElement(txtbAccountNumber)
.addCallbackElement(txtbOwnerEmail)
.addCallbackElement(txtbAccountAdjustment);
//callback control handlers
var validEmail = app.createClientHandler()
.validateEmail(txtbOwnerEmail)
.forTargets(txtbOwnerEmail)
.setStyleAttribute("color","black")
.forTargets(btnSubmit)
.setEnabled(true)
.forTargets(lblEmailFailed)
.setVisible(false);
var validAccountNumber = app.createClientHandler()
.validateNumber(txtbAccountNumber)
.forTargets(txtbAccountNumber)
.setStyleAttribute("color","black")
.forTargets(btnSubmit)
.setEnabled(true)
.forTargets(lblAccountNumber)
.setVisible(false);
var validAccountAdjustment = app.createClientHandler()
.validateNumber(txtbAccountAdjustment)
.forTargets(txtbAccountAdjustment)
.setStyleAttribute("color","black")
.forTargets(btnSubmit)
.setEnabled(true)
.forTargets(lblAccountAdjustment)
.setVisible(false);
var invalidEmail = app.createClientHandler()
.validateEmail(txtbOwnerEmail)
.forTargets(txtbOwnerEmail)
.setStyleAttribute("color","red")
.forTargets(btnSubmit)
.setEnabled(false)
.forTargets(lblEmailFailed)
.setVisible(true);
var invalidAccountNumber = app.createClientHandler()
.validateNumber(txtbAccountNumber)
.forTargets(txtbAccountNumber)
.setStyleAttribute("color","red")
.forTargets(btnSubmit)
.setEnabled(false)
.forTargets(lblAccountNumber)
.setVisible(true);
var invalidAccountAdjustment = app.createClientHandler()
.validateNumber(txtbAccountAdjustment)
.forTargets(txtbAccountAdjustment)
.setStyleAttribute("color","red")
.forTargets(btnSubmit)
.setEnabled(false)
.forTargets(lblAccountAdjustment)
.setVisible(true);
txtbOwnerEmail.addBlurHandler(validEmail);
txtbOwnerEmail.addBlurHandler(invalidEmail);
txtbAccountNumber.addBlurHandler(validAccountNumber);
txtbAccountNumber.addBlurHandler(invalidAccountNumber);
txtbAccountAdjustment.addBlurHandler(validAccountAdjustment);
txtbAccountAdjustment.addBlurHandler(invalidAccountAdjustment);
btnSubmit.addClickHandler(handler);
app.add(txtbOwnerEmail);
app.add(txtbAccountNumber);
app.add(txtbAccountAdjustment);
app.add(lblEmailFailed);
app.add(lblAccountNumber);
app.add(lblAccountAdjustment);
return app;
}
function validateInput(e){
var app = UiApp.getActiveApplication();
var pattern = /^[a-zA-Z0-9._]+@[a-zA-Z0-9._]+\.[a-zA-Z0-9._]{2,4}/;
return pattern.test(e.parameter.txtbOwnerEmail);
}
Google Doc の生成されたフォームにハンドラーをアタッチしてフィールドを検証するにはどうすればよいですか?