1

ドキュメントから入力されたフィールドを含むパネルを表示するアプリがあります。

ユーザーがフィールドを編集すると、更新された値によってドキュメントが更新されます。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);
  }  
}

エラーは (イタリア語からの翻訳) です: Generic オブジェクトに 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 は常に Generic オブジェクトを返します(これは他の回答とは対照的です)。

ありがとう

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 に答える