无法通过调用app.getElementById(id)函数来检索ServerHandler

时间:2013-08-26 21:16:57

标签: google-apps-script

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

我最初宣布了一个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.

我使用handler记录了Logger.log(handler.getType()) var的类型,并显示Generic。我在不存在的id上调用app.getElementById(id),它再次返回Generic类型的对象。

我做错了什么?感谢您对此进行调查。谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

是否有特定原因要将每个文本框添加为回调元素。如果不是,我建议您将Flextable添加为回调元素,并且Flextable中的所有元素都将在您的处理函数中被识别。

var handler = app.createServerHandler('handler12')
    .addCallbackElement(flexTable);

答案 1 :(得分: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上提供了使用动态表单元素的更完整示例。