2012-11-26 138 views
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; 
} 

回答

1

您是否將此部署爲電子表格中的Web應用程序或腳本?

如果要部署這是一個web應用程序,然後SpreadsheetApp.getActiveSpreadsheet()將無法​​正常工作 - 與SpreadsheetApp.openById(id)其中id是電子表格ID,您將在URL中發現,當你打開瀏覽器中的文件替換它。

如果您想要通過菜單項或簡單按鈕在電子表格中部署此功能,則按原樣工作。

我能夠把剛纔複製粘貼代碼,並獲得列表框部分做工精細 -

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