Google 张 "Transpose(sort(transpose" - 作为脚本

Google Sheets "Transpose(sort(transpose" -as Script

是否有 Google 表格脚本可以转置我的数据,然后对其进行排序,然后转置回来。我需要在下面执行此公式 - 但作为脚本。

=转置(排序(转置(J1:N4),1,))

我的意图是能够对我的 header 列进行 A->Z 排序,这样我每次放入时都可以将 header 列的位置保持一致。例如,有时数据来自 A:G 列,但下一次,曾经是 A:G 的 header 现在是 AGBFCDE(加扰)。对整个列进行向下排序非常困难,但我需要对 A1:G1 进行排序,同时保持其下方的数据仍与正确的列 header 相关联。例如,它将“向左或向右移动整列”,直到第 header 列按 A->Z 排序。我希望这种 transposing-sorting-transposing 返回的方法可以解决问题,但欢迎其他建议。

column 1   column4  column5  column 2   column 3
data 1     data 4   data 5   data 2     data 3
data 1     data 4   data 5   data 2     data 3
data 1     data 4   data 5   data 2     data 3

正如您在上面看到的,header 列没有按顺序排列。每次我将它们放入时,它们都不会,但我想知道是否有更好的脚本或某种方法可以按顺序对 Column 1:Column 5 进行排序,即使它们永远不会那样粘贴。如果除了 transposing/sorting 之外还有更好的方法,那么我愿意接受任何方法。

这里我创建了一个具有相同概念的脚本 Transpose -> Sort -> Transpose。

function myFunction() {

  // get all the data in the sheet
  var ss  = SpreadsheetApp.getActiveSheet();
  var range = ss.getDataRange();
  var values = range.getValues();
  
  //convert rows into columns
  var data = transpose(values);

  //sort data
  data.sort(
  function(a,b) {
   return b[0]-a[0] || a[0].localeCompare(b[0]);
  });

  //convert columns into rows
  var data1 = transpose(data);

  //write data back to spreadsheet
  ss.getRange(1,1,values.length,values[0].length)
    .setValues(data1);
}

function transpose(matrix) {
  return matrix[0].map((col, i) => matrix.map(row => row[i]));
}

例子

之前

之后

参考资料

Transposing a 2D-array in JavaScript

JavaScript Sorting Arrays