javascript - 对数组中的范围进行排序

标签 javascript google-apps-script google-sheets

我有一个公司的时间表电子表格,我需要按每个时间表 block (15 行 x 20 列)对员工进行排序。我有以下代码,我得到了帮助,但是一旦数组到达没有员工姓名的 block (我希望将它们洗牌到底部),数组就会停止排序。我遇到的另一个并发症是这些单元格中有许多公式,当我按原样运行它时,它会删除它们。如果可能的话,我想保持这些完整。代码如下:

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);

最佳答案

我认为可以使用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});
  ...
}

关于javascript - 对数组中的范围进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205908/

相关文章:

javascript - 启动 Angular 应用程序

javascript - 使文本自动更改和随机化

google-apps-script - Google 脚本 - 设置 VAxis 最小值和最大值的问题

node.js - 如何使用 Google Drive API 创建电子表格文件,并将默认选项卡标题设置为 "Sheet1"以外的其他内容

javascript - dojo 相当于 document.X

javascript - jQuery .eq(index) 与 [index] 如果两者都返回一个对象?

google-apps-script - YouTube API 和品牌帐户

google-apps-script - 将 .XLSX 转换为 Google 表格并移动转换后文件的脚本

google-chrome - Chrome 开发工具快捷方式会覆盖 Google 文档快捷方式

google-apps-script - Google Sheets 脚本编辑器和 "You do not have permission to call ScriptApp.newTrigger"中出现 "callById()"错误