0

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

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

...
  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
}

注意: 我知道Romain Vialard 有一个图书馆可以完成这项工作(对 2D 数组中的列进行排序),但我对如何“手动”提高个人 JS 技能很感兴趣 ;-) 而且我需要对每个列独立,而无需为每一列更新工作表。

4

1 回答 1

1

怎么样:

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);
};
于 2013-01-12T16:29:15.950 回答