0

ユーザーがオプションを選択すると、選択した情報とともに別の uiapp が表示されるリストボックス形式でメニューを作成しようとしています。ここで、Google を開いたときにエラーが発生したというエラーが表示されるという問題が発生しています。予期されたエラーが発生しました。setId の 1 つを削除しても、エラーは発生しません。これは可能ですか?

 function doGet(e) {
 var app = UiApp.createApplication().setTitle("Services"); 
 var dropDownList = app.createListBox().setName('list').setId('list');
 var infoLabel = app.createLabel('Scroll around to select the service   desired').setId('infoLabel');
 var panel = app.createVerticalPanel();
 //addItem fills the list  
 dropDownList.addItem("Option 1").setId("add");
 dropDownList.addItem("Option 2");
 panel.add(dropDownList);
 panel.add(infoLabel);
 app.add(panel);
 var info = app.getElementById("add");
 var handler2 = app.createServerHandler('display2');
 info.addClickHandler(handler2);

 app.add(dropDownList);
 app.add(infoLabel);
 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 spreadsheet.show(app);
}


 function display2(e) {
 var app = UiApp.createApplication();
  var html = app.add(app.createHTML("<p><p><b>You have selected this option</b>  </p>")).setHeight(220).setWidth(220);

 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 spreadsheet.show(app);
 return app;
 }
4

1 に答える 1

1

これを Web アプリまたはスプレッドシート内のスクリプトとして展開していますか?

これを Web アプリとして展開している場合は機能しません。id は、ブラウザでファイルを開いたときに URL に表示されるスプレッドシート ID にSpreadsheetApp.getActiveSpreadsheet()置き換えてください。SpreadsheetApp.openById(id)

メニュー項目または単純なボタンを使用してスプレッドシートでこれを展開する場合は、そのまま機能します。

コードをコピーして貼り付けるだけで、リストボックス部分が正常に機能するようになりました-

https://docs.google.com/spreadsheet/ccc?key=0AkJNj_IM2wiPdHRYQThlaGVVSk04R052ZGNqclhEZWc#gid=0


アップデート -

私は今、あなたが何をしようとしているのか理解しています。いくつかのこと - そうしないと、コールバック要素を追加していることを確認したいhandler.addCallbackElement(myWidget)場合、要素の値を読み取ることができません。2 つ目は、ドロップダウン リストの各オプションにサーバー ハンドラーが必要ないことです。ハンドラーが 1 つあるだけで、変更ごとにそれが起動され、選択したオプションを取得できます。

以下のコードをクリーンアップし、このコードを使用するようにスプレッドシートも更新しました。

function showUI() {
  var app = UiApp.createApplication().setTitle("GeekSquad Services"); 

  var infoLabel = app.createLabel('Scroll around to select the service desired');

  var dropDownList = app.createListBox().setName('list').setId('list');
  dropDownList.addItem("Option 1");
  dropDownList.addItem("Option 2");
  //you can add as many options here manually or dynamically

  var handler = app.createServerHandler('dropDownCallback')
  handler.addCallbackElement(dropDownList);
  dropDownList.addClickHandler(handler);

  var panel = app.createVerticalPanel();  
  panel.add(dropDownList);
  panel.add(infoLabel);
  app.add(panel);

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  spreadsheet.show(app);
}


function dropDownCallback(e) {
  var app = UiApp.createApplication();
  var html = app.add(app.createHTML("<b>You have selected this option</b> " + e.parameter.list));

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  spreadsheet.show(app);
}

アップデート #2 -

分岐して別のアプリ インスタンスを作成するのは簡単です (ただし、パネルを変更しない理由は不明です)。

    function dropDownCallback(e) {
      if(e.parameter.list === 'Option 1'){
        var app = UiApp.createApplication();
        var html = app.add(app.createHTML("Here for option!"));

        var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
        spreadsheet.show(app);
      }
      else if (e.parameter.list ==== 'Option 2'){
        //create and show other App here or whatever else
      }
      //refactor this better to not repeat code. 
    }
于 2012-11-26T23:23:19.483 に答える