我開發了一個從電子表格運行的應用程序。它有一個格式化的屏幕,即。 doc.show(app )。有一個質量改變功能。我想提示用戶'您確定...可以繼續'。用戶從格式化屏幕確認
理想的解決方案是彈出式窗體,帶有「可以繼續」響應。
我無法找到提示用戶並接受不同時取消格式化屏幕的響應的方法。
我知道必須有一個簡單的方法來做到這一點。我搜索了此論壇和其他人,但無法找到適用於Google Spreadsheets的解決方案。
我開發了一個從電子表格運行的應用程序。它有一個格式化的屏幕,即。 doc.show(app )。有一個質量改變功能。我想提示用戶'您確定...可以繼續'。用戶從格式化屏幕確認
理想的解決方案是彈出式窗體,帶有「可以繼續」響應。
我無法找到提示用戶並接受不同時取消格式化屏幕的響應的方法。
我知道必須有一個簡單的方法來做到這一點。我搜索了此論壇和其他人,但無法找到適用於Google Spreadsheets的解決方案。
您可以使用Browser.MsgBox()並向其中添加按鈕以供用戶確認。 Refrence URL https://developers.google.com/apps-script/class_browser
這確實不是一件容易的事。您必須使用自己的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;
}
難度將取決於你需要恢復多少狀態。如果沒有,那麼它很多,很容易。在這個例子中,我恢復了文本框的值。你可以在那裏輸入任何東西,看看彈出後它會在那裏。
我有很多狀態信息需要恢復:應用程序由一個帶有7個選項卡的選項卡組成,每個選項卡都是一個獨立但相互關聯的功能(例如,一個設置了過濾器,另一個發送了一個過濾器給過濾器中的每個人發電子郵件)。我正在尋找一個MsgBox類型的屏幕,我可以在我的應用程序中內聯編碼。問題是這個函數必須使用'return app'來顯示對話框。這樣做會停止執行調用函數。看來你的解決方案會遭受同樣的命運......不是?恩裏克,明智的人,請告訴我我錯過了一些東西! – Dan
我找不到剪切和粘貼代碼示例的方法,所以我會嘗試輸入一個。 (兩個空間似乎不等於回報)。函數massUpdate(){...準備更新,編輯用戶輸入等... var response = myInlineMsgBox(「Mass Update」,「Are You Sure」,OK_CANCEL)if(response ==「cancel」{do nothing} else {...繼續使用massupdate函數...} return app} – Dan
我對你的評論幾乎沒有任何理解,我的代碼示例已經完成,你無法運行它嗎?無論如何,你應該使用Serge的方法,它是方式,方式更加智能和容易做 –
當使用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
很好地工作!
這不起作用。在Browser.msgBox之後,UiApp實例沒有恢復 –