按下按钮更改UI元素的内容

时间:2014-03-05 20:44:59

标签: google-apps-script

我有一个Google UI应用程序,旨在帮助将数据输入到谷歌电子表格中,其中大多数行都相同。为此,将创建一个UI面板,并为电子表格的每一列使用文本字段。只需按一下按钮,这些值就会附加到电子表格中。

我想按钮然后清除单个文本框的内容并保持其他文本框的值以允许输入下一个几乎相同的项目。我尝试这样做导致“遇到错误:对象不允许添加或更改属性。”

我在下面添加了一个简化版本,实际脚本有很多文本框,但这个简化的例子也分享了这个问题。

function showNewEntryDialog() {
  var app = UiApp.createApplication();
  app.setTitle("Add Multiple Items");
  var panel = app.createVerticalPanel();
  var grid = app.createGrid(9,3);
  var nameTextBox = app.createTextBox();
  var serialTextBox = app.createTextBox();
  nameTextBox.setName('nameTextBox').setId('nameTextBox');
  serialTextBox.setName('serialTextBox').setId('serialTextBox');
  var snButton = app.createButton('Add and New SN')
  grid.setWidget(0,0,app.createLabel('Name'));
  grid.setWidget(0,1,nameTextBox);
  grid.setWidget(4,0,app.createLabel('Serial Number'));
  grid.setWidget(4,1,serialTextBox);
  grid.setWidget(4,2,snButton);
  panel.add(grid);
  var snClickHandler = app.createServerClickHandler("respondToButtonPress");
  snButton.addClickHandler(snClickHandler);
  snClickHandler.addCallbackElement(panel);
  app.add(panel);
  var doc = SpreadsheetApp.getActive();
  doc.show(app);
}
function respondToButtonPress(e) {
  var app = UiApp.getActiveApplication();
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow([e.parameter.nameTextBox,
                   e.parameter.serialTextBox]);
  app.getElementById('serialTextBox').setText('');
  // Does nothing?

  app.getElementById('serialTextBox').setValue='';
  // Error:Object does not allow changes
}

按钮如何更改UI面板中文本框的内容?如果不能,我可以用其他方式实现我想要的行为吗?

2 个答案:

答案 0 :(得分:0)

认为.setText().setValue()基本上做同样的事情,所以真的只需要一个或另一个。您的.setValue=''无效。应该是.setValue('')。最后也需要return app;

答案 1 :(得分:0)

布莱恩的回答是正确的,但你可以在主函数中使用clientHandler更有效地做到这一点:

function showNewEntryDialog() {
  var app = UiApp.createApplication();
  app.setTitle("Add Multiple Items");
  var panel = app.createVerticalPanel();
  var grid = app.createGrid(9,3);
  var nameTextBox = app.createTextBox();
  var serialTextBox = app.createTextBox();
  nameTextBox.setName('nameTextBox').setId('nameTextBox');
  serialTextBox.setName('serialTextBox').setId('serialTextBox');
  var snButton = app.createButton('Add and New SN')
  grid.setWidget(0,0,app.createLabel('Name'));
  grid.setWidget(0,1,nameTextBox);
  grid.setWidget(4,0,app.createLabel('Serial Number'));
  grid.setWidget(4,1,serialTextBox);
  grid.setWidget(4,2,snButton);
  panel.add(grid);
  // a clientHandler : ----------------------------------------------------------
  var cHandler = app.createClientHandler().forTargets(serialTextBox).setText('');
  //-----------------------------------------------------------------------------
  var snClickHandler = app.createServerClickHandler("respondToButtonPress");
  snButton.addClickHandler(snClickHandler).addClickHandler(cHandler);// you can have multiple handlers on the same widget
  snClickHandler.addCallbackElement(panel);
  app.add(panel);
  var doc = SpreadsheetApp.getActive();
  doc.show(app);
}
function respondToButtonPress(e) {
  var app = UiApp.getActiveApplication();
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow([e.parameter.nameTextBox,
                   e.parameter.serialTextBox]);
}