Javascript 按每个单元格的字数从最大到最小对列进行排序

Javascript 按每个单元格的字数从最大到最小对列进行排序,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我需要根据每个单元格的字数对列范围进行排序,从每个单元格的最多字数到每个单元格的最少字数 范例 ahtn bmm cnst Abb Baa HHH cc a b c 我可以对一列进行排序 function sortColumn() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = ss.getSheetByName("Sheet1"); var lastCol = s.getLastColumn(); var l

我需要根据每个单元格的字数对列范围进行排序,从每个单元格的最多字数到每个单元格的最少字数

范例

ahtn bmm cnst
Abb Baa
HHH
cc
a
b
c
我可以对一列进行排序

function sortColumn() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Sheet1");
  var lastCol = s.getLastColumn();
  var lastRow = s.getLastRow();

  // assumes headers in row 1
  var r = s.getRange(2, 1, lastRow - 1, lastCol);

  // Sort on column G = 7
  r.sort([{ column: 7, ascending: true }]);

}
我可以根据需要对数组进行排序

function highLow(a,b){
     return b.length - a.length || // sort by length, if equal then
     a.localeCompare(b);    // sort by dictionary order
} 

[HHH,Abb Baa,cc,ahtn bmm cnst,b,c,a].sort(highLow) =  [ahtn bmm cnst,Abb Baa,HHH,cc,a,b,c]
但我不知道如何以这种方式将列范围排序为Google脚本,而不是公式


提前感谢您的帮助

您希望使用与类范围内的
排序(sortSpecObj)
方法相同的规范实现特殊排序。例如,当“3”(列C)和“A2:D”作为列和范围给出时,输入和输出如下

输入:

输出:

如果我的理解是正确的,那么这个答案呢?脚本的流程如下所示

  • 检索输入范围的值
  • 从检索到的值中检索输入列的值
  • 使用脚本对列进行排序
  • 检索已排序列的索引
  • 使用索引重新排列排序范围的值
  • 将结果值放到工作表中
  • 示例脚本:
    var sortColumn=“3”//C列
    var sortRange=“A2:D”;
    var ss=SpreadsheetApp.getActiveSheet();
    var values=ss.getRange(sortRange.getValues();
    var sorted=values.map(函数(e){returne e[sortColumn-1]}).filter(字符串);
    var sortCol=sorted.slice().map(函数(e){return[e]});
    sorted.sort(函数(a,b){返回b.length-a.length | | a.localeCompare(b)});//这是你的剧本。
    var index=sorted.map(函数(e){
    对于(var j=0;j
    注:
    • 使用此示例脚本时,首先请设置
      sortColumn
      sortRange
    • 请为您的环境修改此脚本
    • 如果要排序的列有一些空单元格,请修改
      var sorted=values.map(函数(e){return e[sortColumn-1]}).filter(字符串)
      to
      var sorted=values.map(函数(e){returne e[sortColumn-1]})
    参考资料:

    我担心我会误解你的意思。如果这不是你想要的,请告诉我。我想对此进行修改。

    您希望使用与类范围内的
    排序(sortSpecObj)
    方法相同的规范实现特殊排序。例如,当“3”(列C)和“A2:D”作为列和范围给出时,输入和输出如下

    输入:

    输出:

    如果我的理解是正确的,那么这个答案呢?脚本的流程如下所示

  • 检索输入范围的值
  • 从检索到的值中检索输入列的值
  • 使用脚本对列进行排序
  • 检索已排序列的索引
  • 使用索引重新排列排序范围的值
  • 将结果值放到工作表中
  • 示例脚本:
    var sortColumn=“3”//C列
    var sortRange=“A2:D”;
    var ss=SpreadsheetApp.getActiveSheet();
    var values=ss.getRange(sortRange.getValues();
    var sorted=values.map(函数(e){returne e[sortColumn-1]}).filter(字符串);
    var sortCol=sorted.slice().map(函数(e){return[e]});
    sorted.sort(函数(a,b){返回b.length-a.length | | a.localeCompare(b)});//这是你的剧本。
    var index=sorted.map(函数(e){
    对于(var j=0;j
    注:
    • 使用此示例脚本时,首先请设置
      sortColumn
      sortRange
    • 请为您的环境修改此脚本
    • 如果要排序的列有一些空单元格,请修改
      var sorted=values.map(函数(e){return e[sortColumn-1]}).filter(字符串)
      to
      var sorted=values.map(函数(e){returne e[sortColumn-1]})
    参考资料:

    我担心我会误解你的意思。如果这不是你想要的,请告诉我。我想对此进行修改。

    除了列之外,您似乎无法对工作表进行任何排序。一个简单的解决方案是添加另一列,其中包含单词计数和排序

    描述了一种简单的字数计数:

    如果需要脚本,则可以使用range.getValues()从电子表格中读取值,对javascript中获得的二维数组进行排序,然后将排序后的值写回相同的范围:

    function sortColumn() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var s = ss.getSheetByName("Sheet1");
      var lastCol = s.getLastColumn();
      var lastRow = s.getLastRow();
    
      // assumes headers in row 1
      var r = s.getRange(2, 1, lastRow - 1, lastCol);
    
      // read the Sheet values into a javascript array
      var values = r.getValues();
    
      var sortedValues = values.sort(wordCountCompare); 
    
      // write the sorted values back into the Sheet range
      r.setValues(sortedValues);
    
    }
    
    javascript排序函数非常乐意对二维数组进行排序,您只需传递一个适当的比较函数,它就可以计算出顺序:

    function wordCountCompare(a, b) {
    
      // Sort on column G - in javascript this is array element 6
      // make sure the value is a string (toString)
      // split the string using a space
      // get the length of the split array which is the wordCount
      var wordCountA = a[6].toString().split(" ").length;
      var wordCountB = b[6].toString().split(" ").length;
    
      return wordCountB - wordCountA;
    }
    
    注:
    此字数仅为近似值,并使用空格标识单词。如果你知道标点符号,你可以做得更好。

    除了列之外,你似乎无法对工作表进行任何排序。一个简单的解决方案是添加另一列,其中包含单词计数和排序

    描述了一种简单的字数计数:

    如果需要脚本,则可以使用range.getValues()从电子表格中读取值,对javascript中获得的二维数组进行排序,然后将排序后的值写回相同的范围:

    function sortColumn() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var s = ss.getSheetByName("Sheet1");
      var lastCol = s.getLastColumn();
      var lastRow = s.getLastRow();
    
      // assumes headers in row 1
      var r = s.getRange(2, 1, lastRow - 1, lastCol);
    
      // read the Sheet values into a javascript array
      var values = r.getValues();
    
      var sortedValues = values.sort(wordCountCompare); 
    
      // write the sorted values back into the Sheet range
      r.setValues(sortedValues);
    
    }
    
    javascript排序函数非常乐意对二维数组进行排序,您只需传递一个适当的比较函数,它就可以进行排序
    function wordCountCompare(a, b) {
    
      // Sort on column G - in javascript this is array element 6
      // make sure the value is a string (toString)
      // split the string using a space
      // get the length of the split array which is the wordCount
      var wordCountA = a[6].toString().split(" ").length;
      var wordCountB = b[6].toString().split(" ").length;
    
      return wordCountB - wordCountA;
    }