0

ユーザーから情報を収集するために、UiAppを使用してフォームを作成しました。複数のパネルとファイルのアップロードではかなり複雑なので、送信する前にユーザーに入力を確認する機会を与えたいと思います。私は、彼らの入力を1つの最終レビューパネルに表示して、情報を編集し、前のパネルに戻って編集することを決定できるようにしたいと考えていました。

以下はテストスクリプトです。私が得た最も遠いのは、textBoxの値ではなく、「textBox」を返すようにすることです。スクリプトのdoGet部分に留まっている間に値を取得することは可能ですか、それとも値にアクセスするためにdoPostに移動する必要がありますか?

あなたが提案する回避策は何ですか?助けてくれてありがとう!

function doGet(e){
var app = UiApp.createApplication();
var appPanel = app.createVerticalPanel();
var form = app.createFormPanel();
var panel1 = app.createHorizontalPanel();

var emailLabel = app.createLabel('Your Email');
var email = app.createTextBox().setName('email').setId('email');

app.add(form);

var button1 = app.createButton('Go to Review');

panel1.add(emailLabel);
panel1.add(email);
panel1.add(button1);
appPanel.add(panel1);
form.add(appPanel);


var panel2 = app.createHorizontalPanel().setVisible(false);
var reviewLabel = app.createLabel('Your Email:');
var reviewEmail = app.createLabel(email);

panel2.add(reviewLabel);
panel2.add(reviewEmail);
appPanel.add(panel2);

//
var reviewPageTwo = app.createClientHandler()
.forTargets(panel1).setVisible(false)
.forTargets(panel2).setVisible(true);

button1.addClickHandler(reviewPageTwo);

return app;
}

UPDATE8.24.12結果のスクリプトを含めています。レビュー機能、ユーザーを編集に戻すためのボタン、投稿するためのsubmitButtonが含まれています。(投稿を機能させるには、スプレッドシートIDを置き換える必要があります。)

すべての助けをありがとう!マーティン

 function doGet(e){
var app = UiApp.createApplication();
var appPanel = app.createVerticalPanel();
var form = app.createFormPanel();
var panel1 = app.createHorizontalPanel().setId('panel1');

var emailLabel = app.createLabel('Your Email');
var email = app.createTextBox().setName('email').setId('email');
var syncChangeHandler = app.createServerHandler('syncText').addCallbackElement(form);


app.add(form);

var button1 = app.createButton('Go to Review');

panel1.add(emailLabel);
panel1.add(email);
panel1.add(button1);
appPanel.add(panel1);
form.add(appPanel);


var panel2 = app.createHorizontalPanel().setId('panel2').setVisible(false);
var reviewGrid = app.createGrid(3,3).setId('reviewGrid');
var reviewEmail = app.createLabel().setId('reviewEmail');
var reviewLabel = app.createLabel('Your Email:');
var submitButton = app.createSubmitButton('Submit');
var button2 = app.createButton('Edit Response');

panel2.add(reviewLabel);
panel2.add(reviewEmail);
panel2.add(button2);
panel2.add(submitButton);
appPanel.add(panel2);

//
var editResponse = app.createClientHandler()
.forTargets(panel1).setVisible(true)
.forTargets(panel2).setVisible(false);

button1.addClickHandler(syncChangeHandler);
button2.addClickHandler(editResponse);

return app;
}

function syncChangeHandler(e){
  var app = UiApp.getActiveApplication(); 


  app.getElementById('reviewEmail').setText(e.parameter.email);
  app.getElementById('panel1').setVisible(false);
  app.getElementById('panel2').setVisible(true);
  return app;
}

function doPost(e){
var ss = SpreadsheetApp.openById('*your spreadsheet id here*').getSheets()[0];
var range = ss.getRange(ss.getLastRow()+1, 1, 1,2);

var values = [[new Date(),e.parameter.email]];
range.setValues(values);

var app = UiApp.getActiveApplication();
var label = app.createLabel('Thank You!');
app.add(label);

return app;
}
4

2 に答える 2

1

doGet()内に関数全体があります。doGet()関数は、UIが最初にロードされたときに実行されます。それで、

var email = app.createTextBox().setName('email').setId('email');

実際にはテキストボックスに解決されます。あなたがするとき

var reviewEmail = app.createLabel(email);

createLabelへの引数としてテキストボックスを渡そうとしていますが、これは許可されていません。したがって、これは機能しません。ハンドラーでテキストボックスへの変更を処理する必要があります。

function doGet(){
var syncChangeHandler = app.createServerHandler('syncText').addCallbackElement(form);
var email = app.createTextBox().setName('email').setId('email');
...
var reviewEmail = app.createLabel().setId('reviewEmail');
...
}

function syncText(e){
  var app = UiApp.getActiveAplication(); 
  app.getElementById('reviewEmail').setText(e.parameter.email);
  return app;
}
于 2012-08-20T17:27:53.057 に答える
0

Srikが言ったことは本当です(もちろん;-))、実際にこのタイプの値をラベルに割り当てることはできません...私がすること(doGet / doPost構造で作業しているため)は、2番目のボタンを作成することですハンドラーを「レビュー」関数にトリガーする送信ボタンは別として、対応するすべてのtextBox、listBox、または既存のレビューパネルのメインフォーム(そのコピーの一種)からの値を入力します。持ってる。これを実現するには、フォームをcallBackElementとしてハンドラーに追加する必要があります(これはdoPostスキームでは必要ありませんでした)。

別のオプションとして、このハンドラーを「キーアップ」トリガーまたは「値変更トリガー」を使用してすべてのウィジェットに個別に追加し、レビューパネルが常にリアルタイムで最新になるようにすることができます。この場合、「送信前のレビューパネル」で可能です。最終的に表示する以外に、ユーザーからの操作なしでいつでも表示できます(ただし、常に表示することもできます)。このオプションでは、ハンドラー関数は「シンクロナイザー」のようになります。ただし、ファイルのアップロードには問題が発生する可能性があります(これは、doGet / doPost構造でのみ機能するため)。

于 2012-08-20T18:41:53.753 に答える