2012-08-30 70 views
1

我有我們公司的時間表電子表格,我需要按每個時間表塊(15行20列)對員工進行排序。我有我有幫助的下面的代碼,但是當數組到達一個沒有員工名字的塊時,數組就會退出排序(我希望這些代碼被拖到底部)。我遇到的另一個複雜情況是這些單元格中有許多公式,當我按原樣運行它時,它會將其刪除。我想盡可能保持這些完好無損。下面的代碼:排序數組中的範圍

function sortSections() 
{ 
    var activeSheet = SpreadsheetApp.getActiveSheet(); 
    //SETTINGS 
    var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted 
    var headerRows = 53; //number of header rows 
    var pageHeaderRows = 5; //page totals to top of next emp section 
    var sortColumn = 11; //index of column to be sorted by; 1 = column A 
    var pageSize = 65; 
    var sectionSize = 15; //number of rows in each section 

    var col = sortColumn-1; 
    var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName); 
    var data = sheet.getRange(headerRows+1, 1, sheet.getMaxRows()-headerRows, sheet.getLastColumn()).getValues(); 
    var data3d = []; 
    var dataLength = data.length/sectionSize; 
    for (var i = 0; i < dataLength; i++) { 
    data3d[i] = data.splice(0, sectionSize); 
    } 
    data3d.sort(function(a,b){return(((a[0][col]<b[0][col])&&a[0][col])?-1:((a[0][col]>b[0][col])?1:0))}); 
    var sortedData = []; 
    for (var k in data3d) { 
    for (var l in data3d[k]) { 
     sortedData.push(data3d[k][l]); 
    } 
    } 
    sheet.getRange(headerRows+1, 1, sortedData.length, sortedData[0].length).setValues(sortedData); 

回答

1

我認爲要解決你的問題是可以使用Range.sort功能,而不是自定義代碼。排序功能還重新定位了公式,但方式很棘手 - 如果單元格公式包含單元格引用,則排序功能會將重新定位的單元格中的行索引更改爲具有新的單元格行索引,例如,最初單元格C1包含=A1*B1公式,在排序操作後,第1行重定位到第3行,並且單元格「C3」將不包含=A1*B1,但是包含=A3*B3

經過這樣的修改您的代碼應該看起來像這樣

function sortSections() 
{ 
    var activeSheet = SpreadsheetApp.getActiveSheet(); 
    //SETTINGS 
    var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted 
    var headerRows = 53; //number of header rows 
    var pageHeaderRows = 5; //page totals to top of next emp section 
    var sortColumn = 11; //index of column to be sorted by; 1 = column A 
    var pageSize = 65; 
    var sectionSize = 15; //number of rows in each section 

    var col = sortColumn-1; 
    var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName); 
    var range = sheet.getRange(headerRows+1, 1, sheet.getMaxRows()-headerRows, sheet.getLastColumn()); 
    range.sort({column: sortColumn, ascending: true}); 
    ... 
} 
+0

感謝您抽空看看這個。不幸的是,這隻能排序連續的行。我需要每排15行的部分;在第54行,我在第11欄有一個員工姓名,下面有14行屬於該員工,那麼下一部分從第69行開始,等等。我需要下面的14行來跟隨每個部分的最上面一行,併發送任何空白部分(不包括員工姓名)到最後。爲了在每4個部分之後添加皺紋,我想保持原樣保留5行(仍在等待Google電子表格中包含分頁符)。 – cocky2012

+0

@ user1637113,可以迭代每個部分,將每個部分作爲範圍並對其進行排序。我只舉了一個例子,而不是一個完整的解決方案。 – megabyte1024

+0

我對此很新,所以請忍受我;我會爲每個部分創建一個var,然後通過每個部分的單元格引用對變量進行排序?或者我可以在工作表本身創建範圍並對其進行排序? – cocky2012