Google表格使用ARRAYFORMULA将可变宽度/高度表格转换为列表

时间:2016-01-24 16:42:11

标签: google-sheets gs-vlookup

我不能为我的生活找出如何创建一个通用的公式来转换以下内容:

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

我希望能够为任意数量的列和行工作。有没有办法在不需要拖动的情况下实现这一目标?"即与ARRAYFORMULA s。

以下是Google表格的link

2 个答案:

答案 0 :(得分: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"处最大,但可以是任意列(例如,列#34; ZZ")

我把公式付诸实践 - 你可以view the spreadsheet by clicking here

"结果" sheet具有您想要的公式和输出。

答案 1 :(得分: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))))," ",", "))

我的sample in action =)

<强>更新

我想出了如何缩短公式:

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

上面的公式工作是一样的。它使用了技巧proposed here