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);
感谢您抽空看看这个。不幸的是,这只能排序连续的行。我需要每排15行的部分;在第54行,我在第11栏有一个员工姓名,下面有14行属于该员工,那么下一部分从第69行开始,等等。我需要下面的14行来跟随每个部分的最上面一行,并发送任何空白部分(不包括员工姓名)到最后。为了在每4个部分之后添加皱纹,我想保持原样保留5行(仍在等待Google电子表格中包含分页符)。 – cocky2012
@ user1637113,可以迭代每个部分,将每个部分作为范围并对其进行排序。我只举了一个例子,而不是一个完整的解决方案。 – megabyte1024
我对此很新,所以请忍受我;我会为每个部分创建一个var,然后通过每个部分的单元格引用对变量进行排序?或者我可以在工作表本身创建范围并对其进行排序? – cocky2012