Javascript 对数组中的范围进行排序
我有我们公司的时间表电子表格,我需要按每个时间表块(15行20列)对员工进行排序。我有下面的代码,我有帮助,但数组一旦到达一个没有员工姓名的块,就会停止排序(我希望这些被洗牌到底部)。我遇到的另一个复杂问题是,这些单元格中有许多公式,当我按原样运行时,它会删除它们。如果可能的话,我想保持这些完整。代码如下:Javascript 对数组中的范围进行排序,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有我们公司的时间表电子表格,我需要按每个时间表块(15行20列)对员工进行排序。我有下面的代码,我有帮助,但数组一旦到达一个没有员工姓名的块,就会停止排序(我希望这些被洗牌到底部)。我遇到的另一个复杂问题是,这些单元格中有许多公式,当我按原样运行时,它会删除它们。如果可能的话,我想保持这些完整。代码如下: function sortSections() { var activeSheet = SpreadsheetApp.getActiveSheet(); //SETTINGS
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);
function sortSections()
{
var activeSheet=SpreadsheetApp.getActiveSheet();
//背景
var sheetName=activeSheet.getSheetName();//要排序的工作表的名称
var headerRows=53;//标题行数
var pageHeaderRows=5;//页面总计到下一个emp节的顶部
var sortColumn=11;//要排序的列的索引;1=列A
var pageSize=65;
var sectionSize=15;//每个节中的行数
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;
对于(变量i=0;i
我认为可以使用该函数而不是自定义代码来解决您的问题。排序函数也会重新定位公式,但方式很复杂-如果单元格公式包含单元格引用,则排序函数会更改重新定位单元格中的行索引以具有新的单元格行索引,例如,最初是单元格C1
包含=A1*B1
公式,排序操作完成后,重新定位到第3行的第1行和单元格“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});
...
}
我认为,为了解决您的问题,可以使用该函数而不是自定义代码。排序函数也会重新定位公式,但方式很复杂-如果单元格公式包含单元格引用,则排序函数会更改重新定位单元格中的行索引,以拥有新的单元格行索引,例如,最初是单元格
C1
con在=A1*B1
公式中,排序操作后,重新定位到第3行的行1和单元格“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});
...
}
感谢您查看。不幸的是,这仅对连续行进行排序。我需要15行的部分进行排序;在第54行,我在第11列中有一个员工姓名,下面有14行属于该员工,然后下一部分从第69行开始,依此类推。我需要下面的14行跟随每个部分的顶行并发送任何空白部分(没有员工姓名)结尾。要添加皱纹,在每4个部分后,会有5行的中断(仍在等待谷歌电子表格合并分页符)我希望保持原样。@user1637113,可以迭代每个部分,将每个部分作为一个范围进行排序。我只给出了一个示例,没有给出完整的解决方案。我对这一点很陌生,所以请耐心听我说;我会为每个部分创建一个变量,然后在每个部分中按单元格引用对变量进行排序吗?还是在我的工作表中创建范围t自己排序?谢谢你看这个。不幸的是,这只对连续的行进行排序。我需要15行的部分进行排序;在第54行,我在第11列有一个员工姓名,下面有14行属于该员工,然后下一部分从第69行开始,依此类推。我需要下面的14行跟随ea的顶行ch部分并将所有空白部分(不带员工姓名)发送到末尾。要添加皱纹,在每4个部分后,会有5行中断(仍在等待谷歌电子表格合并分页符)我希望保持原样。@user1637113,可以迭代每个部分,将每个部分作为一个范围进行排序。我只给出了一个示例,没有给出完整的解决方案。我对这一点很陌生,所以请耐心听我说;我会为每个部分创建一个变量,然后在每个部分中按单元格引用对变量进行排序吗?还是在我的工作表中创建范围你自己把它们分类?