【问题标题】:Stacking multiple columns on to one?将多列堆叠在一列?
【发布时间】:2012-02-25 07:11:23
【问题描述】:

我正在使用 Google 电子表格,并且试图让多张表格包含一个单词列表。在最后一张纸上,我想创建一个汇总列表,它是列中所有值的组合。我使用 =CONCATENATE() 对其进行了排序,但它把它变成了一个字符串。有什么方法可以将其保留为列列表?

以下是列的示例:

Sheet1

  • 苹果
  • 橙色
  • 香蕉

Sheet2

  • 菠萝
  • 草莓
  • 桃子

FinalSheet

  • 苹果
  • 橙色
  • 香蕉
  • 菠萝
  • 草莓
  • 桃子

【问题讨论】:

  • 听起来像是 Web 应用程序而不是 stackoverflow 的问题
  • 如果我不正确,请原谅我,但我需要编写一个电子表格函数才能让它工作。我想这将是这类问题的地方。
  • 此时可以使用嵌入式数组。见stackoverflow.com/questions/15985637/…
  • 我有些困惑。问题中没有说这是在寻找 unique 值,但最重要的答案假设它确实如此。它的措辞方式意味着应该保留重复的值。问题是以类似于CONCATENATE 的方式询问 'stacking' 列。如果问题要求一个独特的结果,那么应该在问题的标题和文本中明确说明,这样人们在尝试回答不同的问题时就不会访问该页面。
  • 我想将此作为评论添加到愚人的回答中,但我没有足够的声誉。现在记录了“FLATTEN”。 support.google.com/docs/answer/10307761 干杯!

标签: google-sheets


【解决方案1】:

更新答案

我就在那儿一个更好的解决方案。它已在下面发布,但我在这里复制它,所以它在最佳答案中:

=unique({A:A;B:B})

警告:在某些情况下,这将包括一个空白单元格(例如,如果第一个列表末尾有一个)。

如果您不关心订单和拖尾空白单元格,一个简单的sort() 将清理一切:

=sort(unique({A:A;B:B}))

否则filter() 可以像这样删除空白:

=filter(unique({A:A;B:B}),NOT(ISBLANK(unique({A:A;B:B}))))

以下是旧的已弃用答案

我相信这是“错误的做法”,因为这似乎是一项极其简单和常见的任务,我觉得我一定遗漏了一些东西,因为它不应该需要如此过度的解决方案。

但这有效:

=UNIQUE(TRANSPOSE(SPLIT(JOIN(";",A:A,B:B),";")))

如果您的数据包含任何“;”您自然需要更改分隔符的字符。

【讨论】:

  • 谢谢!我花了很多时间才找到这个!
  • 它有效,但有很多简单的方法可以达到预期的效果。见stackoverflow.com/a/30039238/1595451
  • 当我尝试唯一时,它会将数据放入单独的列中,而不是以任何方式合并它们,这完全违背了这一点。 “不推荐使用”的答案虽然有效:/
  • 谢谢!这个对我有用。合并 Google 表格中的两列。感恩节快乐。
  • 已弃用的解决方案有效。 “更好”的解决方案会产生独特的组合值。也就是说,它同时在 A 列和 B 列中找到唯一的对。相反,不推荐使用的方法是将列连接在一起,然后在不考虑配对的情况下找到唯一元素。当列不相邻时(例如在不同的工作表上等),“更好”的答案可能对某些人有用。
【解决方案2】:

基本的方法,就是像这样的数组来做

={A1:A10;B1:B10...etc}

我发现这种方法的问题在于,如果您有很多列,它会非常耗时。 我做了一些搜索,发现了这篇文章:

Joining Multiple Columns Into One Sorted Column in Google Spreadsheets

核心公式是

=transpose(split(arrayformula(concatenate(if(len(A:Z)>0,A:Z&";",""))),";"))

显然,您会将 A:Z 替换为您想要使用的任何范围。 如果您想进行一些排序或删除重复项,您只需将上述公式包装在 SORT() 和/或 UNIQUE() 方法中,就像这样......

=sort(unique(transpose(split(arrayformula(concatenate(if(len(A:Z)>0,A:Z&";",""))),";"))))

希望这会有所帮助。 祝大家编码愉快:)

【讨论】:

  • 需要注意的是,这会将所有值与 ; 连接起来。成一个大字符串,然后将它们拆分为 ;再次创建最终数组(=列)。如果任何单元格包含 ; 这将(巧妙地)破坏他们自己。如果是这种情况,请更改两次出现的 ;在这个 sn-p 到不同的字符,例如§ 或 * 或您的数据中不存在的任何内容。如果你不这样做,那么像“a;b”这样的单元格会在最后的大列中变成两个单独的单元格; “a”和“b”。这可能会导致微妙的错误:)
  • 这不处理两张纸上的数组。如果你有一个范围,你可以把整个函数保存在那里并调用 flatten。使用 sn-p,您甚至必须输入所有范围甚至两次。 infoinspired.com/google-docs/spreadsheet/…
【解决方案3】:

你可以用这个:

=unique({A1:A;B1:B})

在这里完美运行!

【讨论】:

  • 如果给定的列范围不是相同的形状,这似乎会出错。
  • 是否有对应的excel?它不接受;
【解决方案4】:

unique() 函数消除了空格,但对我没有帮助,因为我的某些行重复了。相反,我首先按len() 过滤列以删除空白单元格。然后我以相同的方式将这些列组合在一起。

={filter(A:A, len(A:A)); filter(B:B, len(B:B))}

【讨论】:

    【解决方案5】:

    更简单:

    ={sheetone!A2:A;sheettwo!A2:A}
    

    【讨论】:

    • 此公式还包括列中的所有空白单元格。
    • 如果工作表的行数不同,则会出现错误
    【解决方案6】:

    使用flatten,例如flatten(A1:B2)。更多详情this article

    如果 2d 范围不在一个片段中,则可以先使用 & 符号或类似技术创建一个。之后可以在生成的 2d 范围上调用 flatten。下面的例子有点矫枉过正,但在处理动态 2d 范围时很好,因为基本解决方案不容易使用。

    flatten(ARRAYFORMULA(SPLIT(ARRAYFORMULA(A1:A2&";"&C3:C4), ";")))
    

    本文还展示了如何在查询中使用未记录的skipping 子句轻松展开范围。

    【讨论】:

    • 被低估的答案。我希望让行以交替的拉链式方式合并,这非常容易做到。谢谢!
    • deadneck 发布了一个Answer 说“我想将此作为评论添加到愚人的回答中,但我没有足够的声誉。”FLATTEN“现在已记录在案。support.google.com/docs/answer/10307761 "
    【解决方案7】:

    =TRANSPOSE(SPLIT(TEXTJOIN("@",TRUE,TRANSPOSE(A:C),TRANSPOSE(D1:D5)),"@",FALSE,FALSE))

    • 如果需要,请使用数据中缺少的首选分隔符(而不是 @
    • 第一个1 (TRUE) 参数表示IGNORE EMPTY,这在这种情况下非常重要..
    • A:CD1:D5 是要组合的范围
    • 所有值都保留在那里 - 不使用 UNIQUE

    【讨论】:

      【解决方案8】:

      尝试使用您的 CONCATENATE 参数与

      =ArrayFormula(EXPAND(...))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 2020-01-02
        • 2020-11-09
        • 1970-01-01
        • 2020-02-06
        • 2022-10-25
        • 1970-01-01
        相关资源
        最近更新 更多