0

我一生都无法弄清楚如何创建一个通用公式来转换以下内容:

Name  | cool | smart | funny | ... |
Bill  |      | x     | x     |     |
Sally | x    | x     |       |     |
Bob   | x    |       | x     |     |
Cindy |      |       |       |     |
Steve | x    |       | x     |     |
Carol |      |       | x     |     |
Bob   |      | x     |       |     |
...   |      |       |       |     |

变成这样:

Bill:smart,funny
Sally:cool,smart
Bob:cool,funny
Cindy:
Steve:cool,funny
Carol:funny
Bob:smart

我希望它能够适用于任意数量的列和行。有没有什么方法可以在不需要“拖动”的情况下实现这一目标?即与ARRAYFORMULAs。

这是指向示例 Google 表格的链接。

4

2 回答 2

3

好吧,这是一个黑客的熊,但它的工作原理。它适用于任意行和任意列,无需拖动任何公式。

=ARRAYFORMULA(REGEXREPLACE(REGEXREPLACE(TRANSPOSE(SPLIT(CONCATENATE({Data!A2:A&":", REGEXREPLACE(Data!B2:O, "x", REGEXREPLACE(Data!B1:O1, "$", ",")), IF(LEN(Data!A2:A)=LEN(Data!A2:A), "|")}), "|")), ",$", ""), "^:$", ""))

一些警告:

  • 数据表开始的下方或右侧不能有任何不相关的数据(即除了额外的标题行或列外,数据必须单独在工作表中。
  • 名称和标签不得包含“|”,因为它在内部用作拆分字符(可以更改为另一个字符)
  • 数据不能超出给定列。在上面的公式中,它在“O”列达到最大值,但可以是任意列(例如,“ZZ”列)

我使用了公式 - 您可以单击此处查看电子表格

“结果”表具有您想要的公式和输出。

于 2016-01-24T18:23:56.923 回答
0

希望,这有效:

=ArrayFormula(TRANSPOSE(SPLIT(ArrayFormula(CONCATENATE(A2:A8&": /")),"/"))&SUBSTITUTE(trim(transpose(query(transpose(IFERROR(ArrayFormula(HLOOKUP(REGEXREPLACE(B2:D8,"x","1")*1*COLUMN(B2:D8)*row(B2:D8)^0,{COLUMN(B2:D8);B1:D1},2,0)),"")),,counta(B1:D1))))," ",", "))

我的样品在行动=)


更新

我想出了如何使公式更短:

=ARRAYFORMULA(TRANSPOSE(SPLIT(ArrayFormula(CONCATENATE(A2:A8&": /")),"/"))&SUBSTITUTE(trim(transpose(query(transpose(REPT(B1:D1,B2:D8="x")),,counta(B1:D1))))," ",", "))

上面的公式是一样的。它使用了这里提出的技巧。

于 2016-03-02T15:34:54.683 回答