2012-10-31 65 views
0

我正試圖通過回調發送數組,並且沒有運氣。讓我解釋一下我的意圖,也許那裏的專家可以給我一些關於如何解決這種困境的想法。需要在Google Script中回撥數組

我已經創建了一個收集數據的電子表格。然後我有一個用戶界面腳本,它將行數據拖入彈性表格中,供用戶通過單擊複選框進行處理。我創建了一個單獨的彈性表,其中包含用戶檢查或留空的複選框。在我的腳本中,我需要發送一個包含複選框條件的數組。爲什麼?因爲我還需要可以推送到電子表格的行號或數組位置,以便爲數據發送正確的更新狀態。

該腳本僅將需要操作的數據提取到UI中。因此,我可能會在電子表格的行1,3,4,5和8上進行操作,但在UI上彈性顯示與數據對應的行是行1,2,3,4,5,因此行分配不會比賽。但如果我使用一個數組,我可以捕獲所拉的行是1,3,4,5和8,然後相應地更新電子表格。

但是,這是當我嘗試回調我的數組標記爲偏移量[inc]的問題我無法讓它工作我得到運行錯誤找不到方法addcallback並無法讓它工作。

有關如何通過addcallback方法發送數組的建議或備用建議將不勝感激。

感謝,

肖恩Nutzman

function doGet(e){ 
    var app = UiApp.createApplication(); 

    //Create Caption Panel 
    var captionPanel = app.createCaptionPanel('Detention Attendance').setWidth('350px').setHeight('75px').setStyleAttribute('fontWeight', 'bold').setStyleAttribute('fontSize', '24px'); 

    //Add a widget to caption panel 
    captionPanel.add(app.createLabel("Please enter attendance for Detention by clicking the  checkbox next to the student's name if they were present. Then click Sumbit.")); 

    //add the caption panel to the application 
    app.add(captionPanel); 

    var panel = app.createHorizontalPanel(); 
    var flexTable = app.createFlexTable().setStyleAttribute('border', '2px solid black') 
     .setStyleAttribute('borderCollapse','collapse') 
     .setBorderWidth(2) 
     .setCellSpacing(50) 
     .setCellPadding(6); 

    //Get Data from spreadsheet 
    var spreadsheetId = '0Aup0nXQ4K-pydFREb1FFcTFYX3lOenNQenR1Q01jQ1E'; //Change this to  the Spreadsheet ID 
    var dataArray = getData(spreadsheetId); 
    var inc = 1; 
//Load data into table cells 
    for (var row = 0; row<dataArray.length; row++) { 
     var booleanCheck = dataArray[row] [17]; 
     var offset = new Array(); 


     if (booleanCheck == "" || booleanCheck == "Date Served") { 
     if (row > 0) { 
     Logger.log("Row value = " + row);  
     var ticketDate = dataArray[row] [0]; 
     var dateStamp = Utilities.formatDate(new Date(ticketDate), "America/Chicago", "MM/dd/yyyy"); 

     dataArray[row] [0] = dateStamp; 
     var ticketDate2 = dataArray[row] [16]; 
     var dateStamp2 = Utilities.formatDate(new Date(ticketDate2), "America/Chicago", "MM/dd/yyyy"); 
     dataArray[row] [16] = dateStamp2; 
     flexTable.setText(row, 1, dataArray[row][2].toString()); 
     flexTable.setText(row, 0, dataArray[row][0].toString()); 
     flexTable.setText(row, 2, dataArray[row][16].toString()); 
     offset[inc] = row; inc++; 
     Logger.log('Inc variable = ' + inc); 
     Logger.log('Offset = ' + offset[inc-1]); 
    } else { 
     Logger.log("Inside ELSE row is not > 0"); 
     Logger.log("Row value here = " + row); 
     flexTable.setText(0, 1, "Student's Name").setStyleAttribute(0, 1, 'fontWeight', 'bold'); 
     flexTable.setText(0, 0, "Date Assigned").setStyleAttribute(0, 0, 'fontWeight', 'bold'); 
     flexTable.setText(0, 2, "Date Delinquent").setStyleAttribute(0, 2, 'fontWeight', 'bold');  
     } 
    } 
    } 
    Logger.log(offset); 
    panel.add(flexTable); 

    var check1 = app.createCheckBox().setName('ch1'); 
    var check2 = app.createCheckBox().setName('ch2'); 
    var check3 = app.createCheckBox().setName('ch3'); 
    var check4 = app.createCheckBox().setName('ch4'); 
    var check5 = app.createCheckBox().setName('ch5'); 
    var check6 = app.createCheckBox().setName('ch6'); 
    var check7 = app.createCheckBox().setName('ch7'); 
    var check8 = app.createCheckBox().setName('ch8'); 
    var check9 = app.createCheckBox().setName('ch9'); 
    var submitButton = app.createButton("Submit"); 
    var handler = app.createServerClickHandler('updateStatus'); 
    handler.addCallbackElement(check1) 
    .addCallbackElement(check2) 
    .addCallbackElement(check3) 
    .addCallbackElement(check4) 
    .addCallbackElement(check5) 
    .addCallbackElement(check6) 
    .addCallbackElement(check7) 
    .addCallbackElement(check8) 
    .addCallbackElement(check9) 
    .addCallbackElement(offset); 
    submitButton.addClickHandler(handler); 
    handler.addCallbackElement(check1) 
    .addCallbackElement(check2) 
    .addCallbackElement(check3) 
    .addCallbackElement(check4) 
    .addCallbackElement(check5) 
    .addCallbackElement(check6) 
    .addCallbackElement(check7) 
    .addCallbackElement(check8) 
    .addCallbackElement(check9) 
    .addCallbackElement(offset); 

    var table = app.createGrid(11,1).setStyleAttribute('border', '2px solid black') 
     .setStyleAttribute('borderCollapse','collapse') 
     .setBorderWidth(2) 
     .setWidth('75px') 
     .setCellSpacing(5) 
     .setCellPadding(6); 
    table.setStyleAttributes({textAlign: "center"}); 
    table.setStyleAttribute('fontWeight', 'bold').setText(0, 0, 'Attendance'); 
    table.setWidget(1,0, (check1)); 
    table.setWidget(2,0, (check2)); 
    table.setWidget(3,0, (check3)); 
    table.setWidget(4,0, (check4)); 
    table.setWidget(5,0, (check5)); 
    table.setWidget(6,0, (check6)); 
    table.setWidget(7,0, (check7)); 
    table.setWidget(8,0, (check8)); 
    table.setWidget(9,0, (check9)); 
    table.setWidget(10,0,(submitButton)); 

    panel.add(table); 
    app.add(panel); 
    app.close(); 
    return app; 
} 

回答

0

我最常做的是將數組轉換爲字符串,並把它寫在widget's tag。 然後我可以在處理函數中使用e.parameter.widgetName_tag來檢索它。在這一點上,我可以把它分解到找回陣列:e.parameter.widgetName_tag.split(',');

你必須選擇joinsplit字符,因爲您的數據可能包含逗號(這是在陣列中的默認分隔符)時要小心..我經常使用| |或任何其他「不常見」字符(Ë,Í;Δ)與join('∆')split('∆')組合使用,所以我確定我應該恢復數組。

當然,這個小部件必須包含在callBackElement中,但這很容易通過使用最高級別的父UiApp元素作爲callBackElement來實現。

最後評論:嘗試使用小部件ID將簡化您的生活...例如,使用包含與數組索引(chk0,chk1,chk2 ...)對應的數字的Ids,以便您可以輕鬆地檢索數值在你的處理函數使用使用這樣的事情:

Number(e.parameter.source.replace(/[a-z]/ig,''))

,這將給你一個數字,用於標識其checkBox是處理呼叫的來源,所以你可以這樣寫:

var arrayElement = e.parameter.widgetName_tag.split(',')[Number(e.parameter.source.replace(/[a-z]/ig,''))]; 
+0

難道你不可能在寫入標記之前轉換爲json嗎?通過加入和分割可以節省問題! – steeveeet

+0

這確實也是一個很好的方式來做到這一點。更多'學術'也許:-)感謝您的建議 –

0
var array = ['foo','poo']; 
var arrayString = JSON.stringify(array); 

在這一點上,只需將arrayString附加到回調元素,瞧!然後在handlerFunction中,使用e.parameter訪問它。arrayString,然後解析它返回到像這樣的數組:

var array = JSON.parse(e.parameter.arrayName); 
//array = ['foo','poo']