2013-01-12 58 views
0

我有一個包含多個列的電子表格,需要單獨進行排序。 我寫了下面的腳本,但有點慢,因爲它依次處理每列,並且依次使用getValues()setValues()。 我想找到一種方法來完成數組級別的整個排序以提高效率,但我不知道如何...有什麼建議?在數組級別獨立排序列

這是我現在使用的代碼的相關部分:

... 
    sh3.getRange(1,1,1,newData[0].length).setFontWeight('bold');// newData is an array corresponding to the whole sheet 
    for(col=1;col<newData[0].length;++col){ 
    var val = sh3.getRange(2,col,getLastRowInCol(col),1).getValues().sort();// each column have a different height 
    sh3.getRange(2,col,getLastRowInCol(col),1).setValues(val) 
    } 
} 

function getLastRowInCol(col){ 
    var values = sh3.getRange(2,col,sh3.getLastRow(),1).getValues();// skip header and find last non empty row in column 
    for(n=0;n<values.length;++n){ 
    if(values[n]==''){break} 
    } 
    return n 
} 

注:我知道有一個Library by Romain Vialard,沒有工作(分揀二維數組列),但我interrested關於如何爲個人JS技能提高'手動';-)並且我需要獨立地對每個列進行排序,而不需要爲每個列更新工作表。

+0

回覆:功能getLastRowInCol(COL) - 將返回之前一個空白單元格的第一個單元格。如果列表中有空白,它將不會繼續。最好從底部開始,按照自己的方式尋找具有數據的第一個單元。 – ScampMichael

+0

*將返回空白單元格之前的第一個單元格*我知道,但是自從我開始第2行以來,這很好;-)以及您從最後開始的權利,但是我有更多'短列'長一個'。 –

回答

1

如何:

function sortColumns() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 2; 
    var startCol = 1; 
    var dataRange = sheet.getRange(startRow, startCol, sheet.getLastRow() - startRow + 1, sheet.getLastColumn() - startCol + 1); 
    var data = dataRange.getValues(); 

    // transpose data so each column item will be listed in an single array 
    // for each column so that it can be sorted with array.sort() 
    var rowToCol = []; 
    for (var i = 0; i < data[0].length; i++) { 
    rowToCol.push([]); 
    for (var j = 0; j < data.length; j++) { 
     // replace empty string with undefined as undefined sorts last 
     rowToCol[i].push(data[j][i]==""?undefined:data[j][i]); 
    } 
    rowToCol[i].sort(); 
    // default sort, as above, is alphabetic ascending. For other methods 
    // search for Javascript array sort functions 
    } 

    // transpose sorted items back to their original shape 
    var result = []; 
    for (var i = 0; i < rowToCol[0].length; i++) { 
    result.push([]); 
    for (var j = 0; j < rowToCol.length; j++) { 
     result[i].push(rowToCol[j][i]==undefined?"":rowToCol[j][i]); 
    } 
    } 
    dataRange.setValues(result); 
}; 


function onOpen() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var entries = [{ 
    name : "Sort Columns", 
    functionName : "sortColumns" 
    }]; 
    sheet.addMenu("Script Center Menu", entries); 
}; 
+1

你可能也想要這個值來處理0值。 –

+0

+ BryanP你是對的。這隻能用於簡單的字母排序,無需使用函數修改排序。要進行數字排序或不區分大小寫,可以在線查找數組排序函數,以增強上述功能。 – ScampMichael

+0

Thx Michael,雖然嘗試我沒有考慮添加排序,你把它放在哪裏......你的代碼是水晶般清晰;-)謝謝 –