谷歌表格中转置列的笛卡尔积

3

请查看以下网址:https://webapps.stackexchange.com/a/125018/186471 - player0
几年前,我认为我的五行公式很大... - kishkin
2个回答

2

相比使用 FLATTEN,有一种比较简单的方法:

={
  ARRAYFORMULA(A1:C1), "Product";
  ARRAYFORMULA(
    VLOOKUP(
      FILTER(
        FLATTEN(ROW(D2:F) + 0 * ISBLANK(D2:F)),
        FLATTEN(D2:F <> "")
      ),
      FILTER(
        {ROW(A2:A), A2:C},
        A2:A <> ""
      ),
      {2, 3, 4},
      0
    )
  ),
  FILTER(
    FLATTEN(D2:F),
    FLATTEN(D2:F <> "")
  )
}

enter image description here

不确定为什么ARRAYFORMULA(ROW(D2:F))会给出行号而不是带有行号的二维矩阵。否则可以去掉0 * ISBLANK(D2:F)...


这个解决方案更加复杂,但从我的测试来看,它非常快。谢谢。 - yoonghm
@yoonghm 如果你有很多产品列,这也会为你节省很多麻烦。 - kishkin
ROW(D2:F) + 0 * ISBLANK(D2:F)) 的意思是什么? - yoonghm
@yoonghm 强制 ARRAYFORMULA 返回一个二维范围而不仅仅是一列。请参见此问题 - kishkin

2
请使用以下查询公式:

=QUERY(QUERY({A:D;A2:C,E2:E;A2:C,F2:F},"where Col1 is not null order by Col1"), "where Col4 is not null")

这里输入图片描述

使用的函数:


3
=QUERY({A:D; A2:C, E2:E; A2:C, F2:F}, "where Col1 is not null and Col4 is not null order by Col1") - kishkin
@kishkin 在这种情况下,当然也可以。 :) - marikamitsos
这些是许多地方优雅且可重复使用的解决方案。谢谢。 - yoonghm
1
谢谢。出于好奇,你为什么最终接受了一个更复杂的公式?这个公式有什么问题吗? - marikamitsos
如果可能的话,我会将两个都标记为解决方案。我刚试了两种解决方案,@kishkin的解决方案非常快。我的原始数据有13个这样的列,你的解决方案很优雅。让我在更大的数据上检查一下。 - yoonghm
1
@marikamitsos 如果产品列的数量大于24,则由于手动构建“QUERY”的第一个参数,您的公式将变得比我的更长。使用“FLATTEN”解决方案,只有“D2:F”将更改为更宽的范围,例如“D2:Z”。 - kishkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接