2012-08-30 120 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