列表框没有打开处理程序

时间:2012-11-26 21:43:02

标签: google-apps-script

我正在尝试以列表框格式创建菜单,用户选择一个选项,然后显示另一个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;
 }

1 个答案:

答案 0 :(得分:1)

您是将其部署为电子表格中的Web应用程序还是脚本?

如果您要将其部署为网络应用,那么SpreadsheetApp.getActiveSpreadsheet()将无效 - 请将其替换为SpreadsheetApp.openById(id),其中id是您在电子表格中找到的电子表格ID,当您在浏览器。

如果您想通过菜单项或简单按钮在电子表格中部署此w /,那么它将按原样运行。

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

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. 
    }