0

FlexTable動的な行数で構築しようとしています。各行にはTextBox. テーブルに新しい行を追加するボタンがあります。TextBoxそして、処理のためにすべてのウィジェットを送信する [送信] ボタン。

最初に a を宣言し、ServerHandlerそれにすべての固定要素を追加しました。

var handler = app.createServerHandler('handler12')
    .addCallbackElement(fixedTextBox1)
    .addCallbackElement(fixedTextBox2);
handler.setId('myHandlerId');
button.addClickHandler(handler); 

ハンドラーにidを設定したことに注意してください。ここで、新しいTextBox(テーブルへの行)の追加を処理するときにaddCallbackElement(newlyCreatedField)、ハンドラーを呼び出す必要があります。そうしないと、フォームが送信されたときにパラメーターとして使用できません。

私はこれをします:

var handler = app.getElementById('myHandlerId');
handler.addCallbackElement(newlyCreatedField);

しかし、次のエラーが表示されます。

Error encountered: Cannot find function addCallbackElement in object Generic.

handlervarのタイプをログに記録するLogger.log(handler.getType())と、 と表示されますGeneric。存在しない idを呼び出しapp.getElementById(id)たところ、再び type のオブジェクトが返されましたGeneric

私は何を間違っていますか?ご検討いただきありがとうございます。お時間をいただきありがとうございます。

4

2 に答える 2

2

各テキスト ボックスをコールバック要素として追加する特定の理由はありますか。そうでない場合は、Flextable をコールバック要素として追加することをお勧めします。これにより、Flextable 内のすべての要素がハンドラー関数で認識されます。

var handler = app.createServerHandler('handler12')
    .addCallbackElement(flexTable);
于 2013-08-27T02:36:04.317 に答える
1

(Srik は私を打ち負かしました...) コンテナを CallbackElement として持っている場合、すべての TextBox を CallbackElement として持つ必要はありません。

含まれている TextBox 要素の名前を一意に保ち、それらの名前を追跡する必要があります。これを行うには、タグを使用して、随時更新します。

function doGet() {
  var app = UiApp.createApplication();

  // FlexTable - use tag to count # rows.
  var fTable = app.createFlexTable()
                  .setId('fTable')
                  .setTag('0');
  app.add(fTable);

  // Button to add new row
  var addRow = app.createButton('Add Row');
  app.add(addRow);
  var addRowHandler = app.createServerHandler('addRowHandler');
  addRowHandler.addCallbackElement(fTable);
  addRow.addClickHandler(addRowHandler);

  // Submit button
  var submit = app.createButton('Submit');
  app.add(submit);
  var submitHandler = app.createServerHandler('submitHandler');
  submitHandler.addCallbackElement(fTable);
  submit.addClickHandler(submitHandler);

  return app;
}

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

  var row = parseInt( e.parameter.fTable_tag );  // Get row counter
  var tBox = 'textBox'+row;

  var textBox = app.createTextBox()
                   .setId(tBox)
                   .setName(tBox);

  // Place new text box in FlexTable
  var fTable = app.getElementById('fTable');
  fTable.setWidget(row, 0, textBox);

  // Update row counter
  fTable.setTag((++row).toString());

  return app;
}

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

  var rows = parseInt( e.parameter.fTable_tag );  // Get row counter

  // Log contents of all textBoxes in FlexTable
  for (var row=0; row<rows; row++) {
    var tBox = 'textBox'+row;
    Logger.log(tBox+'='+e.parameter[tBox]);
  }

  return app;
}

動的フォーム要素のより完全な使用例は、Waqar のApps Script Tutorialにあります。

于 2013-08-27T03:49:53.010 に答える