Google 工作表使用数组公式对单元格中的逗号分隔文本进行排序

Google Sheets SORT comma separated text in cells using array formula

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

c, a

b, a, d

a, c

c

c, b, a

我想要 B1 中的数组公式 return 结果为 B1:B5

a, c

a, b, d

a, c

c

a, b, c

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

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

Arrayformula 和 split 不适用于多行。我能想到的最好的办法是用脚本填写公式。您可以在打开或编辑时执行此操作。

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

数组公式:

=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)=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)=COUNTA(SPLIT(JOIN(", ",A1:A5),", ",0)))),",  "&CHAR(9),0))))

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