2012-08-06 28 views
0

我已經編寫了一個Google應用程序腳本,它首先在UI應用程序中創建並顯示折線圖,然後根據選定列表框值重新繪製圖形點擊按鈕事件處理程序在圖形「刷新」時觸發。GAS單擊事件處理程序在用戶界面Web應用程序中導致「意外錯誤」

我試圖解決的問題是,當作爲Web應用程序發佈時,我在觸發點擊事件時收到Error Encountered: An unexpected error occurred

該代碼可以從電子表格中完美運行(除了一些討厭的權限問題,其他用戶被要求下載面板對象;我將在後面討論),而且我爲什麼贏了' t翻譯。

下面的代碼爲它的價值:

function doGet(){ 
    var app = UiApp.createApplication().setWidth(800).setHeight(650).setTitle('FLEET Chart'); 
    var e = 'undefined'; 
    lb(app); 
    return click(e, app); 
} 

function lb(app){ 
    var lb = app.createListBox(true).setId('myId').setName('myLbName');// add items to ListBox  
    var lb2 = app.createListBox(true).setId('myId2').setName('myLbName2'); 
    var lb3 = app.createListBox(true).setId('myId3').setName('myLbName3'); 
    var bttn = app.createButton('Refresh').setId('myBttn'); 
    lb3.addItem('2011').addItem('2012'); 
    lb2.addItem('January') 
    .addItem('February') 
    .addItem('March') 
    .addItem('April') 
    .addItem('May') 
    .addItem('June') 
    .addItem('July') 
    .addItem('August') 
    .addItem('September') 
    .addItem('October') 
    .addItem('November') 
    .addItem('December'); 
    lb.addItem('Drug1')  
    .addItem('Drug2')  
    .addItem('Drug3')  
    .addItem('Drug4'); 
    var mypanel = app.createHorizontalPanel().setVisible(true); 
    mypanel.add(lb).add(lb2).add(lb3).add(bttn); 
    app.add(mypanel); 
    var handler = app.createServerChangeHandler('click').addCallbackElement(mypanel); 
    handler.addCallbackElement(bttn); 
    bttn.addClickHandler(handler); 
} 

function click(e, app) { 
    var valuelb = new Array('Drug1','Drug2','Drug3','Drug4'); 
    var valuelb2 = new Array ('January','February','March','April','May','June','July','August','September','October','November','December'); 
    var valuelb3 = new Array('2011','2012'); 
    var SS = SpreadsheetApp.openById('0Am8DRqAEaxH7dF9NWFJLSTdWZGRxeEFfMkFjNlFCT2c'); 
    var sheeteff = SS.getSheetByName('Efficiency'); 
    var data = sheeteff.getDataRange().getValues(); 
    if (String(e) != 'undefined') { 
    app.setWidth(800).setHeight(650).setTitle('FLEET Chart'); 
    var valuelb = String(e.parameter.myLbName); 
    if (valuelb.indexOf(',') != -1) { 
     var valuelb = e.parameter.myLbName.split(','); 
    } 
    var valuelb2 = String(e.parameter.myLbName2); 
    if (valuelb2.indexOf(',') != -1) { 
     var valuelb2 = e.parameter.myLbName2.split(','); 
    } 
    var valuelb3 = String(e.parameter.myLbName3); 
    if (valuelb3.indexOf(',') != -1) { 
     var valuelb3 = e.parameter.myLbName3.split(','); 
    } 
    SS.getSheetByName('Sheet2').getRange(1,1).setValue(String(valuelb2) + ' ' + valuelb.indexOf(','));//for unformation purposes 
    lb(app); 
    }else{ 
    SS.getSheetByName('Sheet2').getRange(1,1).setValue(String(e));//for information purposes 
    } 
    var usedata = ArrayLib.filterByText(ArrayLib.filterByText(ArrayLib.filterByText(data, 3, valuelb), 1, valuelb2), 0, valuelb3); 

    //Build data table 
    var dataTable = Charts.newDataTable(); 

    //Add Column types 
    dataTable.addColumn(Charts.ColumnType.DATE, data[0][2]); 
    dataTable.addColumn(Charts.ColumnType.NUMBER, data[0][9]); 
    dataTable.addColumn(Charts.ColumnType.NUMBER, data[0][8]); 
    //Add rows 
    for(var j=0; j<usedata.length; j++){ 
    dataTable.setValue(j, 0, usedata[j][2]); 
    dataTable.setValue(j, 1, usedata[j][9]); 
    dataTable.setValue(j, 2, usedata[j][8]); 
    } 

    //Create and build chart 
    var chart = Charts.newLineChart() 
     .setDataTable(dataTable) 
     .setTitle('Efficiency over Time \nConfiguration: [' + valuelb + ']\n' + 'Month: [' + valuelb2 + ']\n' + 'Year: [' + valuelb3 + ']') 
     .setXAxisTitle('Time') 
     .setYAxisTitle('Percentage') 
     .setDimensions(750, 600) 
     .setPointStyle(Charts.PointStyle.MEDIUM) 
     .build(); 
    app.add(chart); 
    return app; 
} 

回答

0

我沒有通過你的整個代碼走了,但確實看到這個錯誤 - 你已經設置的doGet爲要叫上一個處理的功能。沒有問題,除非您嘗試第二次調用UiApp.createApplication(),這是不允許的。

我建議你改變處理程序來調用另一個函數(lb,也許)而不是doGet。

+0

感謝斯里蘭卡, 我已經刪除除了最初的一個createApplication方法,並設置處理程序來調用click(e)函數;這實際上是如何設定的,但我一直在弄清楚什麼是錯。 唉...仍然沒有刷新。 Regards, Ryan – user1579717 2012-08-06 18:43:19

+0

好的,在這種情況下,您應該在點擊(e)代碼中執行var app = UiApp.getActiveApplication()。 – Srik 2012-08-07 04:19:58

0

我的代碼中也有「Unexpected Errors」。爲了解決這些問題,我編寫了一個簡單的庫,幫助查找服務器處理程序中的問題。 Here是演示如何使用庫的示例。示例源代碼是here。將庫添加到腳本對於在Resources->Manage Libraries對話框中使用Mr6TKHuVEJGjYr-NnLUNbEkFO7CoOZA03項目密鑰是必需的。該庫使用ScriptProperties服務來存儲自己的內部變量。

+0

@ megabyte1024 ..可以在UI Builder應用程序中使用你的功能嗎?我有一個基於代碼的初始登錄屏幕,並且在UI頁面覆蓋之前調試窗口閃爍。 – 2012-08-07 12:42:08

+0

@JoeFoley,你能給我一個使用UI Builder的應用程序的詳細情況嗎?我不使用UI Builder,也沒有使用Builder來測試我的庫。我會檢查可以做什麼。 – megabyte1024 2012-08-07 13:02:07

+0

@JoeFoley。我使用UI Builder創建了一個[示例](https://script.google.com/macros/s/AKfycbyVZhAz69i6aiTwTt9eSWs-8HO5xtIxQNtf4t9XGb8qmopj6Lg/exec)。 [Here](https://script.google.com/a/bastra.com/d/1HFBOZN6mQlCxbuUB8XioUwnFCf2MFKzo50QOBZfq1ufEwbX24OT_khEa/edit)是示例源代碼。它包含一些與前一個演示相似的處理程序按鈕。 – megabyte1024 2012-08-07 16:44:31

相關問題