对数组中的范围进行排序

时间:2012-08-30 21:36:41

标签: javascript google-apps-script google-sheets

我有一个公司的时间表电子表格,我需要按每个时间表块(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 个答案:

答案 0 :(得分:1)

我认为解决您的问题可以使用Range.sort函数而不是自定义代码。 sort函数还重新定位公式但是以一种棘手的方式 - 如果单元格公式包含单元格引用,sort函数会将重定位单元格中的行索引更改为具有新单元格行索引,例如,最初是单元格{{1} }}包含C1公式,在排序操作之后,第1行重新定位到第3行,而单元格“C3”不包含=A1*B1,而是包含=A1*B1

通过此修改,您的代码应该看起来像这样

=A3*B3