【问题标题】:Split Google Sheets Columns into rows - ignoring any blanks将 Google 表格列拆分为行 - 忽略任何空白
【发布时间】:2021-02-17 05:20:06
【问题描述】:

我有一系列包含尺寸的列,这些尺寸因产品而异,因此每一行都有很多空白。到目前为止,我已经使用这个公式来选择 5 列并将它们转换为行(下面文件中的列 DK/DL)。我需要扩展它以包含更多行,但是当包含所有空白时它太大了,所以有没有办法忽略任何空白单元格并只包含具有值的单元格?

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IF(LEN(A3:A), "♠"&A3:A&"♦"&AP3:AT, )), , 999^ 99)), , 999^99), "♠")), "♦")))

我还需要在一列中显示第二行。例如,我使用了 AP - AT 列,其中包括 XS、S、M、L、XL 作为列标题,然后在每一行的这些列中都有一个值。上面的公式将从这 5 列中获取值并将它们放在自己的行中。有没有办法让下一列只显示列标题?当我再次使用上面的公式时,它会下降到下面的行并再次使用库存编号而不是标题。

实际上我想从:

SKU | XS |小号 |中号 |大号 |加大码

val1| 12 | 3 | 32| 1 | 123

到这里:

Val1 | 12 | XS

Val1 | 3 | S

Val1 | 32 | M

Val1 | 1 |升

Val1 | 123|加大码

链接到谷歌表格测试:https://docs.google.com/spreadsheets/d/1o7zFmPbIkKz5JiZ-7Blc-63pARfvhhaV9lWnL4kUIfY/edit?usp=sharing

更新 - 已回答 最好的答案在下面的 cmets 中。

=query( {ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IF(LEN(A3:A), "♠"&A3:A&"♦"&AN3:AU, )), , 999^99)), , 999^99), "♠")), "♦"))), 查询(ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IF(LEN( A3:A), "♠"&A3:A&"♦"&AN2:AU2, )), , 999^99)), , 999^99), "♠")), "♦"))),"选择 Col2 ",0)}, "select * where Col2 ''",0)

【问题讨论】:

  • 您是否反对使用 Apps 脚本?公式中的♠ ♦ 是什么意思?另外,尝试在未来将代码放入代码块中 - stackoverflow.com/help/formatting
  • 我询问了 Apps 脚本,因为公式似乎变得相当复杂,而且您拥有大量数据。或许可以使用公式,但使用 Apps 脚本绝对可行且更易于管理。
  • @iansedano 我没有使用应用程序脚本,但我可以做到。我曾经开始使用的公式脚本中包含的那些字符。我现在需要做的唯一部分是从“I”列到“CU”列,但忽略任何空白单元格。当我尝试添加过滤器时,它会破坏公式。我需要使用 Apps 脚本做什么?

标签: google-sheets google-sheets-formula


【解决方案1】:

我不确定我是否完全理解您想要什么。但它是不是类似于这个公式的结果?将其放在样品表的单元格 DP3 中。

=query(ArrayFormula(if(len(DL3:DL),DK3:DK&" ~ "&DK3:DL&" ~ "&DN3:DN,"")),"select Col2 where Col2 <>''",0)

第一行的结果如下:645550-010 ~ 0 ~ M

分隔符只是为了清楚起见,当然可以删除。

这是使用 DK-DN 列中的数据构建的,并有效地删除了 DL 列中没有值的行。您可能/很可能希望将解决方案公式与当前构建 DK-DN 列的公式合并,以便不再需要它们?

如果我走错了路,我道歉。那么您能否更详细地解释一下您希望在哪些单元格中显示什么内容,以及如何根据哪些列中的值构建结果。

更新: 以下版本的公式将结果分成三列,而不是全部在一列中。

=query(ArrayFormula(if(len(DL3:DL),{DK3:DK,DK3:DL,DN3:DN},{"","",""})),"select Col2, Col3, Col4 where Col2 <>''",0)

请注意,如果没有 {"","",""} 作为 IF 语句的第二部分,这似乎也可以工作,但我不确定那里发生的事情的细节,所以把它留在.

更新 #2:

最终满足题型要求的公式如下:

=QUERY({
         ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IF(LEN(A3:A), "♠"&A3:A&"♦"&AN3:AU,  )), , 999^99)), , 999^99), "♠")), "♦"))),
   query(ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IF(LEN(A3:A), "♠"&A3:A&"♦"&AN2:AU2, )), , 999^99)), , 999^99), "♠")), "♦"))),
     "select Col2",0)
   },
   "select * where Col2 <>''",0)

这基本上使用了产生一些临时工作列的两个原始查询,并根据请求过滤掉空白值。无需保存包含空白单元格的数据的临时列,可以从电子表格中删除数千行,从而提高性能。

【讨论】:

  • 嗨@kirkg13 这几乎正是我所需要的!如果有意义的话,我只希望将 DP 单元分成 3 个单独的单元。因此,不要使用“~”来拆分它们,而是将它们分别放在单独的单元格中,因此第一行“645550-010”将位于 DP 中,0 位于 DQ 中,“S”位于 DR 中。
  • 查看更新。更简洁的版本如下: =query(ArrayFormula(if(len(DL3:DL),{DK3:DK,DK3:DL,DN3:DN},)),"select Col2, Col3, Col4 where Col2 ' '",0)
  • 我尝试将创建 DK 到 DN 的公式与我的公式合并,以获得最终结果,而不需要 DK-DN 列,这些列有很多不必要的行,而且速度很慢下你的床单。在第 3 行的空单元格中尝试以下操作,例如 DT3。然后在 DK3 和 DM3 中注释掉你的公式。如果它有效,您可以删除那些不必要的列。如果它符合您的要求,该公式可能会被整理。目前感觉这是一种快速而肮脏的解决方案。
  • =query( {ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IF(LEN(A3:A), "♠"&A3:A&"♦"&AN3: AU, )), , 999^99)), , 999^99), "♠")), "♦"))), 查询(ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE)) (IF(LEN(A3:A), "♠"&A3:A&"♦"&AN2:AU2, )), , 999^99)), , 999^99), "♠")), "♦")) ),"select Col2",0)}, "select * where Col2 ''",0)
  • 嗨,柯克,效果很好!你是个明星!这几天我的脑袋已经很疲惫了,我真的很感激它
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多