【问题标题】:Google Sheets SORT comma separated text in cells using array formula谷歌表格使用数组公式在单元格中排序逗号分隔文本
【发布时间】:2016-06-11 11:35:23
【问题描述】:

我有一列带有 a、b、c 等标签。单元格中的标签是唯一的,用“、”(逗号和空格)很好地分隔,但没有排序。我想要一个数组公式来返回每个单元格中带有排序标签的列。 例如 在 A1:A5

c, a

b, a, d

a, c

c

c, b, a

我希望 B1 中的数组公式在 B1:B5 中返回结果

a, c

a, b, d

a, c

c

a, b, c

在单元格中排序后,我可以看出标签“c,a”与标签“a,c”相同。 我的公式只返回一个单元格

=ARRAYFORMULA(JOIN(", ",SORT(TRANSPOSE(SPLIT(A1:A5,", ",FALSE)))))

【问题讨论】:

    标签: sorting join split google-sheets array-formulas


    【解决方案1】:

    数组公式:

    =ArrayFormula(TRIM(TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE(QUERY(SORT({TRANSPOSE(SPLIT(JOIN(", ",ArrayFormula(REGEXREPLACE(A1:A5,"\w+",TEXT(row(A1:A5),"0")))),", ")),TRANSPOSE(SPLIT(JOIN(", ",A1:A5),", "))},1,1,2,1),"select Col2",0)&", "),ROW(A1:A5)=SPLIT(JOIN(", ",ArrayFormula(REGEXREPLACE(A1:A5,"\w+",TEXT(row(A1:A5),"0")))),", "))&REPT(" "&CHAR(9),TRANSPOSE(row(OFFSET(A1,,,COUNTA(SPLIT(JOIN(", ",A1:A5),", "))))-row($A$1)+1)=COUNTA(SPLIT(JOIN(", ",A1:A5),", ")))),",  "&CHAR(9),0))))
    

    我用this tip解决了这个任务。


    更新

    经过一些修改,这个公式还可以处理逗号分隔的短语:

    =ArrayFormula(TRIM(TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE(QUERY(SORT({TRANSPOSE(SPLIT(JOIN(",",ArrayFormula(REGEXREPLACE(A1:A5,"[^,]+",TEXT(row(A1:A5),"0")))),",",0)),TRANSPOSE(SPLIT(JOIN(", ",A1:A5),", ",0))},1,1,2,1),"select Col2",0)&", "),ROW(A1:A5)=SPLIT(JOIN(",",ArrayFormula(REGEXREPLACE(A1:A5,"[^,]+",TEXT(row(A1:A5),"0")))),",",0))&REPT(" "&CHAR(9),TRANSPOSE(row(OFFSET(A1,,,COUNTA(SPLIT(JOIN(", ",A1:A5),", ",0))))-row($A$1)+1)=COUNTA(SPLIT(JOIN(", ",A1:A5),", ",0)))),",  "&CHAR(9),0))))
    

    file sample。关键是REGEXREPLACE部分公式:"[^,]+"

    【讨论】:

    • 谢谢马克斯。它适用于上述简单情况。但是对于逗号分隔的短语,它可能无法正常工作。但是您的回答确实说明了这一点。
    【解决方案2】:

    Arrayformula 和 split 不会对多于一行起作用。我能想到的最好的方法是用脚本填充公式。您可以在 onOpen 或 onEdit 上执行此操作。

    function fillformuladown() {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      var lastRow = ss.getDataRange().getNumRows();  
      var rngVal = ss.getRange("k1").getFormula()
      ss.getRange("b1:b"+lastRow).setFormula(rngVal)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多