2012-10-08 89 views
2

我有一個界面,使用從其他電子表格中獲取的數據調用電子表格創建的腳本。我希望界面在運行時更新其標籤,以便爲用戶提供視覺反饋,並讓他知道腳本正在運行並且沒有卡住。當我嘗試更新我放入界面的標籤時,它不會首次更新,但在myFunction()達到其結尾後正確更新。這意味着我可以看到消息「創建完成」,但消息「創建文件...」從不顯示。此外,buttoncompile按鈕從不禁用,因此看起來myFunction()之前的指令完全沒有執行。如何在myFunction()開始執行前更新標籤並禁用按鈕? (我已經對可變引用進行了重複檢查)無法在運行時在Google Apps腳本GUI Builder界面上更新標籤

function doGet() { 
    var app = UiApp.createApplication(); 
    app.add(app.loadComponent("File creation")); 
    var buttonCreate = app.getElementById('createBtn'); 
    var handlerCrea = app.createServerHandler('createClickHandler'); 
    buttonCreate.addClickHandler(handlerCreate); 
    return app; 
} 

function createClickHandler(e) { 
    var app = UiApp.getActiveApplication(); 
    var label = app.getElementById('createLbl'); 
    label.setText("Creating file..."); 
    var buttonCompile = app.getElementById('compileBtn'); 
    buttonCompile.setEnabled(false); 
    myFunction(); 
    label.setText("Creation completed."); 
    buttonCompile.setEnabled(true); 
    app.close(); 
    return app; 
} 

回答

1

此行爲的原因是隻有在離開處理程序後才更新GUI。解決方法是使用兩個處理程序。第一個將標籤文本設置爲Creating file...並禁用該按鈕,第二個執行myFunction函數,將文本更改爲Creation completed,併爲按鈕添加引號。這是一個例子。它禁用/啓用按鈕,工作者處理程序只需等待5秒鐘。

function doGet(e) { 
    var app = UiApp.createApplication(); 
    var container = app.createHorizontalPanel().setId('container'); 
    var btnPerformance = app.createButton("Performance Demo").setId('btnPerformance'); 
    var handlerPerformance = app.createServerHandler('onBtnPerformanceClick'); 
    var handlerWait = app.createServerHandler('onWait'); 
    btnPerformance.addClickHandler(handlerPerformance); 
    btnPerformance.addClickHandler(handlerWait); 
    container.add(btnPerformance); 
    app.add(container); 
    return app; 
} 

function enableControls(enable) { 
    var lstControls = [ 'btnPerformance' ]; 
    var app = UiApp.getActiveApplication(); 
    for (var i = 0; i < lstControls.length; i++) { 
    var ctl = app.getElementById(lstControls[i]); 
    ctl.setEnabled(enable); 
    } 
} 

function onWait(e) { 
    enableControls(false); 
    return UiApp.getActiveApplication(); 
} 

function onBtnPerformanceClick(e) { 
    Utilities.sleep(5000); 
    enableControls(true); 
    return UiApp.getActiveApplication(); 
} 
+0

這樣做的伎倆:) 謝謝! –

+0

出於好奇,這種行爲記錄在Apps Script文檔的某個地方嗎?我無法找到任何關於它的信息,但我可能錯過了某些東西 –

+1

@ m.piras,我不知道它是否記錄在某處。據我記得,我在[this](https://sites.google.com/site/scriptsexamples/progress-indicators)網站上找到了此解決方案。 – megabyte1024