0

個別に並べ替える必要がある複数の列を含むスプレッドシートがあります。getValues()以下のスクリプトは機能しますが、各列をとで順番に処理するため、少し遅くなり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
}

注:仕事(2D配列で列をソートする)を行う Romain Vialardによるライブラリがあることは知っていますが、個人的な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 に答える