0

我正在尝试构建一个FlexTable动态行数。每行包含一个TextBox. 有一个按钮可以将新行添加到表中。还有一个提交按钮,应该发送所有TextBox小部件进行处理。

我最初声明了 aServerHandler并将所有固定元素添加到其中:

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. 我调用app.getElementById(id)了不存在的 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 脚本教程提供了使用动态表单元素的更完整示例。

于 2013-08-27T03:49:53.010 回答