2012-05-12 43 views
0

我開發了一個從電子表格運行的應用程序。它有一個格式化的屏幕,即。 doc.show(app )。有一個質量改變功能。我想提示用戶'您確定...可以繼續'。用戶從格式化屏幕確認

理想的解決方案是彈出式窗體,帶有「可以繼續」響應。

我無法找到提示用戶並接受不同時取消格式化屏幕的響應的方法。

我知道必須有一個簡單的方法來做到這一點。我搜索了此論壇和其他人,但無法找到適用於Google Spreadsheets的解決方案。

回答

0

這確實不是一件容易的事。您必須使用自己的GUI(格式化屏幕)來顯示消息。這樣你可以重新恢復你的GUI的狀態。這裏是一個例子:

function uiTest() { 
    var app = UiApp.createApplication().setTitle("UI"); 
    app.add(app.createGrid(1,1).setId('main')); 
    createGUI(app,{}); 
    SpreadsheetApp.getActive().show(app); 
} 

function createGUI(app,p) { 
    var panel = app.createVerticalPanel(); 
    var handler = app.createServerHandler('handler').addCallbackElement(panel); 
    panel.add(
    app.createTextBox().setName('text').setId('text').setText(p.text ? p.text : "")).add(
    app.createButton('Do it').addClickHandler(handler)); 
    app.getElementById('main').setWidget(0,0, panel); 
} 

function handler(e) { 
    var app = UiApp.getActiveApplication(); 
    var hidden = app.createHidden('oldValues', JSON.stringify(e.parameter)); 
    app.getElementById('main').setWidget(0,0, app.createVerticalPanel().add(
    hidden).add(
    app.createLabel("Question message")).add(
    app.createButton('Ok').addClickHandler(app.createServerHandler('after').addCallbackElement(hidden)))); 
    return app; 
} 

function after(e) { 
    var app = UiApp.getActiveApplication(); 
    createGUI(app,JSON.parse(e.parameter.oldValues)); 
    return app; 
} 

難度將取決於你需要恢復多少狀態。如果沒有,那麼它很多,很容易。在這個例子中,我恢復了文本框的值。你可以在那裏輸入任何東西,看看彈出後它會在那裏。

+0

我有很多狀態信息需要恢復:應用程序由一個帶有7個選項卡的選項卡組成,每個選項卡都是一個獨立但相互關聯的功能(例如,一個設置了過濾器,另一個發送了一個過濾器給過濾器中的每個人發電子郵件)。我正在尋找一個MsgBox類型的屏幕,我可以在我的應用程序中內聯編碼。問題是這個函數必須使用'return app'來顯示對話框。這樣做會停止執行調用函數。看來你的解決方案會遭受同樣的命運......不是?恩裏克,明智的人,請告訴我我錯過了一些東西! – Dan

+0

我找不到剪切和粘貼代碼示例的方法,所以我會嘗試輸入一個。 (兩個空間似乎不等於回報)。函數massUpdate(){...準備更新,編輯用戶輸入等... var response = myInlineMsgBox(「Mass Update」,「Are You Sure」,OK_CANCEL)if(response ==「cancel」{do nothing} else {...繼續使用massupdate函數...} return app} – Dan

+0

我對你的評論幾乎沒有任何理解,我的代碼示例已經完成,你無法運行它嗎?無論如何,你應該使用Serge的方法,它是方式,方式更加智能和容易做 –

3

當使用GUI生成器時,我發現了一個非常簡單的解決方案,即創建一個實際上掩蓋整個UI(或其一部分)並且通常不可見的面板或標籤。 當我使它可見時,我可以點擊它,它會再次變爲不可見狀態,然後我回到標準用戶界面。它使用GUI構建器中的功能來前後移動元素,因此遮罩非常容易(一種多層設計)。我想同樣的行爲與腳本定義的UI實現的,但我不知道如何... 問候, 塞爾

編輯:供參考:我剛剛成立的接口使用這種技術,我注意到,該板已經被製成隱形的,必須與其所有元素一起恢復,否則它們會重新出現空洞。這裏使用Clienthandlers是兩個面板和兩個按鈕來完成這項工作的例子:

var panhandler0 = app.createClientHandler() 
    .forTargets(panel1).setVisible(false);// hide panel1 when button 'ENTER'on panel1 is pressed 
    enter.addClickHandler(panhandler0); 
    var panhandler1 = app.createClientHandler() 
    .forTargets(panel2,msg,grid2).setVisible(true);// show panel2 when button 'ENTER' on panel1 is pressed 
    enter.addClickHandler(panhandler1); 
    var panhandler2 = app.createClientHandler() 
    .forTargets(panel2,msg,grid2).setVisible(true);// re-show panel2 when button 'retry'on panel2 is pressed 
    retry.addClickHandler(panhandler2); 
    var panhandler3 = app.createClientHandler() 
    .forTargets(panel2).setVisible(false);// hide panel2 when button 'retry'on panel2 is pressed 
    retry.addClickHandler(panhandler3); 
    var panhandler4 = app.createClientHandler() 
    .forTargets(panel1,txt,grid,hpanel).setVisible(true);// re-show panel1 when button 'retry'on panel2 is pressed 

很好地工作!

+0

將面板放置在頂部確實非常聰明得多。 –

+0

Serge,你能否告訴我如何在程序代碼中包含程序代碼,如上所述。謝謝 !! – Dan

+0

@丹:這不是評論,它是一個答案... –