0

我正在尝试以列表框格式创建一个菜单,用户可以在其中选择一个选项,然后显示另一个 uiapp 以及他们选择的信息。我在这里遇到一个问题,当我打开谷歌时给我一个错误,说遇到错误。发生预期错误。我认为这与 setId 部分有关,如果我删除其中一个 setId,则不会发生错误。这甚至可能吗?

 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 应用程序,SpreadsheetApp.getActiveSpreadsheet()则将无法使用 - 将其替换为SpreadsheetApp.openById(id)id 是您的电子表格 ID,当您在浏览器中打开文件时,您将在 URL 中找到该 ID。

如果您想通过菜单项或简单按钮将其部署在电子表格中,则可以按原样工作。

我能够复制粘贴您的代码并让列表框部分正常工作 -

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


更新 -

我现在明白你要做什么了。有几件事 - 您要确保通过handler.addCallbackElement(myWidget)否则添加回调元素,您将无法读取元素的值。第二件事是您不需要在下拉列表中的每个选项上都有服务器处理程序。只要有一个处理程序,每次更改都会触发它,您将能够获得您选择的选项。

我已经清理了下面的代码,并更新了电子表格以使用此代码。

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 回答