首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数组级别上独立地排序列

在数组级别上独立地排序列
EN

Stack Overflow用户
提问于 2013-01-12 11:29:43
回答 1查看 1K关注 0票数 0

我有一个包含几个列的电子表格,我需要对这些列进行单独排序。我编写了下面的脚本,但速度有点慢,因为它使用getValues()setValues()依次处理每一列。我想找到一种在数组级别上进行整个排序的方法,以提高效率,但我不知道如何.有什么建议吗?

下面是我现在使用的代码的相关部分:

代码语言:javascript
运行
复制
...
  sh3.getRange(1,1,1,newData[0].length).setFontWeight('bold');// newData is an array corresponding to the whole sheet
  for(col=1;col<newData[0].length;++col){
    var val = sh3.getRange(2,col,getLastRowInCol(col),1).getValues().sort();// each column have a different height
    sh3.getRange(2,col,getLastRowInCol(col),1).setValues(val)
    }
}

function getLastRowInCol(col){
  var values = sh3.getRange(2,col,sh3.getLastRow(),1).getValues();// skip header and find last non empty row in column
  for(n=0;n<values.length;++n){
    if(values[n]==''){break}
  }
  return n
}

注意:我知道有一个https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library来完成这项工作(在2D数组中对列进行排序),但是为了提高个人JS的技能,我需要“手动”进行排序;-)而且我还需要独立地对每一列进行排序,而不需要为每一列更新工作表。

EN

Stack Overflow用户

回答已采纳

发布于 2013-01-12 16:29:15

不如:

代码语言:javascript
运行
复制
function sortColumns() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;
  var startCol = 1;
  var dataRange = sheet.getRange(startRow, startCol, sheet.getLastRow() - startRow + 1, sheet.getLastColumn() - startCol + 1);
  var data = dataRange.getValues();

  // transpose data so each column item will be listed in an single array
  // for each column so that it can be sorted with array.sort()
  var rowToCol = [];
  for (var i = 0; i < data[0].length; i++) {
    rowToCol.push([]);
    for (var j = 0; j < data.length; j++) {
      // replace empty string with undefined as undefined sorts last
      rowToCol[i].push(data[j][i]==""?undefined:data[j][i]);
    }
    rowToCol[i].sort();
    // default sort, as above, is alphabetic ascending. For other methods
    // search for Javascript array sort functions
  }

  // transpose sorted items back to their original shape
  var result = [];
  for (var i = 0; i < rowToCol[0].length; i++) {
    result.push([]);
    for (var j = 0; j < rowToCol.length; j++) {
      result[i].push(rowToCol[j][i]==undefined?"":rowToCol[j][i]);
    }
  }
  dataRange.setValues(result);
};


function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Sort Columns",
    functionName : "sortColumns"
  }];
  sheet.addMenu("Script Center Menu", entries);
};
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14292917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档