1

我有一个应用程序,它显示一个面板,其中包含从文档中填充的字段。

用户编辑字段,更新的值更新文档。一切正常,只有一个例外。

该面板有几个TextBox 和一个ListBox。显示面板时,一个函数会填充文本框中的值。它使用 getElementById 来获取小部件。

我想显示已经选择了正确值的 ListBox。不幸的是,这个小部件上的 getElementById 返回一个 Generic,而 ListBox 的标准方法不可用。

这是一段代码:

function fillSingleDocFields(meta, app) {
  var eleTitolo = app.getElementById('idnomeDoc');   // OK!
  eleTitolo.setText(meta.titolo);


  var lbTipologia = app.getElementById('idtipologia');
  Logger.log(lbTipologia);                          // KO
  setListBoxSelected(lbTipologia, meta.tipologia); 
  return app;
}

setListBoxSelected 函数在第一个 ListBox 特定方法上失败:

function setListBoxSelected(lb, value) {
  for (var i=0;i<lb.getItemCount();i++)  // runtime error
  { 
    if ( lb.getValue(i) == value) 
      lb.setSelectedIndex(i);
  }  
}

错误是(从意大利语翻译):通用对象中没有 getItemCount 函数。

这是代码执行记录:

[13-07-08 12:13:01:691 CEST] (class).getElementById([idnomeDoc]) [0 secondi]
[13-07-08 12:13:01:692 CEST] (class).setText([mio titolone 2]) [0 secondi]
[13-07-08 12:13:01:692 CEST] (class).getElementById([idtipologia]) [0 secondi]
[13-07-08 12:13:01:692 CEST] (class).toString() [0 secondi]
[13-07-08 12:13:01:692 CEST] (class).toString() [0 secondi]
[13-07-08 12:13:01:692 CEST] Logger.log([Generic, []]) [0 secondi]
[13-07-08 12:13:01:693 CEST] (class).toString() [0 secondi]
[13-07-08 12:13:01:735 CEST] Esecuzione non riuscita: TypeError: Impossibile trovare la     funzione getItemCount nell'oggetto Generic. (riga 29, file "Controller") [0.404 secondi di esecuzione totale]

一种可能的解决方案是在创建 ListBox 时设置选定的值,但不幸的是,在那一刻,该值是未知的。

我的问题是:

  • 是否可以转换 getElementById 的结果?(我不这么认为,寻找类似的问题);
  • 我的方法有问题吗?还是 getElementById 总是返回通用对象(这与其他答案形成对比)。

谢谢

4

2 回答 2

0

您的问题不在于getElementById. 即使不再自动完成特定方法,它仍然接受您调用它。

问题是该ListBox对象没有方法getItemCount。这是一个快速测试:

function testList() {
  var app = UiApp.createApplication().setTitle('Test');
  var list = app.createListBox().addItem('test');
  Logger.log(list.getItemCount());
  return app.add(list);
}

就此而言,它也没有getValue方法。

通常 Apps Script 小部件没有这样的方法(供您获取东西)。您必须事先知道这一点,或者通过检查传递给回调处理函数的参数从回调元素中获取它。

于 2013-07-08T11:14:13.393 回答
0

不幸的是,这个功能没有实现。(见问题

但是你可以通过处理函数中的回调来传递值。见例子。

function ui(){
  var app = UiApp.createApplication();
  var lb = app.createListBox().setName('lb'); //not id
  lb.addItem('first item').addItem('second item'); 

  var hndlr = app.createServerHandler('send')
                 .addCallbackElement(lb);     //be sure to add callback

  var btn = app.createButton('SEND');
  btn.addClickHandler(hndlr);

  app.add(lb).add(btn);
  SpreadsheetApp.getActiveSpreadsheet().show(app);
}
function send(e){
  var app = UiApp.getActiveApplication();
  var lbValue = e.parameter.lb;    //selected value

  //do somethink with lbValue
  app.add(app.createLabel(lbValue));
  return app;
}
于 2013-07-08T11:16:07.473 回答