【问题标题】:How to combine rows into one column based on boolean values in Google Sheets?如何根据 Google 表格中的布尔值将行合并为一列?
【发布时间】:2020-03-23 20:37:12
【问题描述】:

我很难思考如何解决这个问题......

假设我有一个表,其中包含几个具有不同潜在属性的项目,这些项目为每个项目的每个属性分配了一个布尔值。 (在这种情况下,每个“颜色”和“尺寸”都有几个选项)

            |           Color                  |       Size     
-----------------------------------------------------------------------
    Item    | Red | Blue | White | Black | Tan | Large | Medium | Small
-----------------------------------------------------------------------
    Pants   |     | y    |       | y     | y   | y     | y      | y    |
    Shirt   | y   |      | y     | y     |     | y     | y      | y    |
    Skirt   |     | y    | y     |       |     |       | y      | y    |
    Socks   | y   | y    | y     | y     | y   | y     | y      | y    |

然后我想将其输出到单个列中,例如:

Pants, Blue, Large
Pants, Blue, Medium
Pants, Blue, Small
Pants, Black, Large
Pants, Black, Medium
Pants, Black, Small
Pants, Tan, Large
Pants, Tan, Medium
Pants, Tan, Small
Shirt, Red, Large
etc etc

所以,我试图用每一行的真实值的所有可能结果填充一列,并与具有真实值的每一列的标题连接。在此示例中,它将进一步分解每个项目的颜色和大小。

对 Google 表格中解决此问题的最佳方法的想法?

示例表: https://docs.google.com/spreadsheets/d/199msbUtUuZzb0HvBMgjQW98hRt3StFEyUFfTfLzSQzw/edit?usp=sharing

【问题讨论】:

  • 也感谢您分享之前的答案。我能够让它工作,但需要再添加一个步骤来将列连接成一个。您在下面的自定义答案也解决了这个问题。
  • 我最近发现了一个隐藏公式,叫做 =FLATTEN()。它使这类问题变得更加简单。很高兴在您的样品表上进行演示。你能把它变成可编辑的吗?
  • 当然,听起来很棒,谢谢 MattKing!
  • 所以,我没有意识到实际上有两个数据表需要重新制表(颜色和大小)。所以 Flatten() 不起作用。我确实有另一种可能更容易使用的方法,我会发布它。

标签: arrays google-sheets google-sheets-formula transpose array-formulas


【解决方案1】:

在小范围内:

=ARRAYFORMULA(TRANSPOSE(SPLIT(TEXTJOIN("\", 1, 
 IF(B3:F6="y", REPT(A3:A6&", "&B2:F2&"\", MMULT(N(G3:I6="y"), 
 TRANSPOSE(COLUMN(G2:I2)^0))), )), "\"))&", "& 
 TRANSPOSE(SPLIT(JOIN(" ", REPT(TRIM(TRANSPOSE(QUERY(TRANSPOSE(
 IF(G3:I6="y", G2:I2, )),, COLUMNS(IF(G3:I6="y", G2:I2, )))))&" ", 
 MMULT(N(B3:F6="y"), TRANSPOSE(COLUMN(B3:F6)^0)))), " ")))


仅适用于两个组合:

=ARRAYFORMULA(QUERY(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(
 IF(B3:F="y", "♦"&A3:A&", "&B2:F2&"♦", ),,99^99)),,99^99), "♦")), 
 "where not Col1 starts with ' ' order by Col1"))


修改了@MK 公式以模仿 CSV:

=ARRAYFORMULA(TRANSPOSE(QUERY(TRANSPOSE(QUERY(VLOOKUP(SEQUENCE(4*5*3, 1, 0)/(5*3)+3, 
 {ROW(A:A), A:A&",", IF(B:I="y", {B2:F2&",", G2:I2}, )},
 INT(MOD(SEQUENCE(4*5*3, 1, 0), {9^99, 5*3, 3})/{9^99, 4, 1})+{2, 3, 3+4}),
 "where Col2<>'' and Col3<>''")),,9^99)))

【讨论】:

  • 嗯,这太完美了!谢谢!
  • 所以我在解读众多 SPLIT/TEXTJOIN/REPT/MMULT 函数的情况时遇到了一些麻烦。例如,我想试验一组属性。在这种情况下,比如说,只是颜色(完全放弃尺寸选项),但不能让它发挥作用。有什么建议吗?谢谢!
  • 只需 ITEM × COLOR 你可以这样做:i.stack.imgur.com/JmWzJ.png
  • 谢谢玩家0!我可以看到,单个属性与添加更多属性进行迭代时有很大不同。完美运行。
  • @MattG 答案更新为 MattKing 的公式,如果您需要在一列中模拟 CSV
【解决方案2】:

对于此类问题,我喜欢使用带有 [index] 值的 VLOOKUP(),该值由由数据的某些参数构成的数组组成。我创建了一个名为 mK.Help 的新标签,并将这个公式放在那里,它将您的数据重新编入您希望的方式(我认为)。

如果您确实想要逗号分隔,我可以提供帮助,但通常人们只想要列中的数据。每个参数都由一个简单的公式提供,计算数据的各个方面。可以重写大的重组公式以包含这些公式中的每一个,而不是引用辅助单元格,但我发现当我将其拆分成这样时,人们更容易理解发生了什么。

=ARRAYFORMULA(QUERY(VLOOKUP(SEQUENCE(Q3*Q4*Q5,1,0)/(Q4*Q5)+Q2,{ROW(A:A),A:A,IF(B:I="y",B2:I2,)},INT(MOD(SEQUENCE(Q3*Q4*Q5,1,0),{9^99,Q4*Q5,Q5})/{9^99,Q5,1})+{2,3,3+Q4}),"where Col2<>'' and Col3<>''"))

【讨论】:

  • 我已经更新了公式。感谢@player0 指出错误。
猜你喜欢
  • 2022-07-20
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2011-02-05
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多