【问题标题】:Google Sheets - combine data from multiple rows to single row or cell with arrayformula谷歌表格 - 将多行数据组合到单行或单元格与数组公式
【发布时间】:2021-08-09 05:12:19
【问题描述】:

我有一个学生信息系统的导出文件,其中每个学生都有多行,具体取决于家长输入的联系电子邮件地址的数量。

Sample data from the export

我想将所有联系人地址合并到同一行的多个列中,甚至全部合并到同一个单元格中都可以。通过大量搜索进行多次尝试后,我可以使用 =join(char(10), filter(extract.csv!G:G,extract.csv!A:A=J2)) 并手动填写公式下。 (虽然我宁愿不先有回报,而只是在结果之间,但如果不可能的话,我可以忍受。)

我最想要的是将它放在一个数组公式中,这样我就不必将它复制下来,但我不知道如何调整对 J 行的最后一个引用。如果我保持原样,它会在每个单元格中放置相同的值以匹配 J2 数据。

with arrayformula

或者还有其他方法可以得到我想要的东西吗?感谢您的帮助...我只是一名喜欢编写代码和自动化事情的老师,我一边学习一边学习点点滴滴!

【问题讨论】:

  • 这个可以做到,但是比较复杂。获得帮助的最有效方式是共享指向与您在图像中显示的完全一样的示例电子表格设置的链接。 (您只有虚拟数据,没有敏感数据,所以这没有问题。)共享对示例电子表格的访问将允许访问实际数据以及测试场和留下解决方案的地方。请确保在创建链接时将共享权限设置为“知道链接的任何人...”和“编辑”,以便此处的人可以完全访问工作表。
  • 是的,这很棘手。我在这里在 Excel 中做了类似的事情,如果你想了解它,所以一种方法是将其重新作为 Google 表格公式 stackoverflow.com/questions/67504794/…
  • 顺便说一句,如果您可以对学生可能拥有的电子邮件地址数量设置上限,那会更容易一些。我也应该说欢迎来到 Stack Overflow!
  • 谢谢@ErikTyler 这是一个具有编辑权限的示例电子表格。 docs.google.com/spreadsheets/d/…
  • 我很高兴知道它很复杂,因为它给我带来了很多麻烦!我将尝试使用 Excel 解决方案。谢谢!

标签: google-sheets array-formulas


【解决方案1】:

这可能值得发布,因为在我意识到您已经为我们发布了一张表格之前,我只是创建了一些我自己的代表性数据(谢谢)。

=ArrayFormula(if(mod(sequence(countunique(A2:A),D2,0),D2)<countif(A2:A,unique(filter(A2:A,A2:A<>""))),
vlookup(vlookup(unique(filter(A2:A,A2:A<>"")),{A2:A,row(A2:A)},2,false)+MOD(sequence(COUNTUNIQUE(A2:A),D2,0),D2),{row(A2:A),B2:B},2,false),))

D2 是一个辅助单元格,其中包含每个学生的最大联系人数量 - 来自公式或手动输入。

我会尝试一下您的数据,但我不太清楚是否应该先发送学生自己的电子邮件,然后再发送家长联系人?我有点希望不要填充辅助电子邮件,因为这会使事情变得更加复杂。

您的数据如下所示 - 相同的公式,但列略有不同:

=ArrayFormula(if(mod(sequence(countunique(A2:A),I2,0),I2)<countif(A2:A,unique(filter(A2:A,A2:A<>""))), vlookup(vlookup(unique(filter(A2:A,A2:A<>"")),{A2:A,row(A2:A)},2,false)+MOD(sequence(COUNTUNIQUE(A2:A),I2,0),I2),{row(A2:A),G2:G},2,false),))

I2 当前设置为 5 - 可以从中计算出

=max(countif(A2:A,unique(filter(A2:A,A2:A<>""))))

如果你想让它更有活力。

问题是我目前想不出一个简单的方法来删除第一个学生的空白电子邮件地址(我有点惊讶下载包含空白地址 - 数据质量?)。

【讨论】:

    【解决方案2】:

    我添加了一个新工作表(“Erik 帮助”),它是您的“AutoFillData”工作表的副本。在我的工作表中,我清除了 AD 列,然后将以下公式放入 AD1:

    `=ArrayFormula({"联系电子邮件";IF(J2:J="",,IFERROR(VLOOKUP(J2:J,{UNIQUE(FILTER(extract.csv!A2:A,extract.csv!A2: A"")),SUBSTITUTE(TRIM(TRANSPOSE(QUERY(TRANSPOSE(IF(ISERROR(VLOOKUP(UNIQUE(FILTER(extract.csv!A2:A,extract.csv!A2:A"")))》 ""&TRANSPOSE(UNIQUE(FILTER("|"&{extract.csv!E2:E;extract.csv!F2:F;extract.csv!G2:G},{extract.csv!E2:E; extract.csv!F2:F;extract.csv!G2:G}"")))&"",extract.csv!A2:A&"|"&extract.csv!E2:E&"| "&extract.csv!F2:F&"|"&extract.csv!G2:G,1,FALSE)),,TRANSPOSE(UNIQUE(FILTER({extract.csv!E2:E;extract.csv!F2:F;extract .csv!G2:G},{extract.csv!E2:E;extract.csv!F2:F;extract.csv!G2:G}""))))),"",COUNTA(UNIQUE(过滤器({extract.csv!E2:E;extract.csv!F2:F;extract.csv!G2:G},{extract.csv!E2:E;extract.csv!F2:F;extract.csv!G2 :G}"")))))),"",CHAR(10))},2,FALSE)))})'

    完全解释这个公式需要相当长的时间。

    一般来说,它的作用是形成一个虚拟 2D 网格(用户从未见过),其中唯一的学生 ID 列表在左侧垂直排列,所有电子邮件地址的唯一列表(带有附加的轮廓线)水平排列顶端。如果在由 studentID|email1|email2|email3 混合形成的任何字符串中找到学生 ID 和该电子邮件地址的组合,则该电子邮件地址填充虚拟网格;如果不是,则网格的横截面为空。

    这会留下一个网格,其中所有可能的电子邮件都在每个唯一 ID 对面的某处水平填充,而不是在单独的行上。

    最后,QUERY 函数中的一个怪癖用于组合每行的所有非空条目。也就是说,QUERY 函数可以有任意数量的标头,而不仅仅是 0 或 1。通过让 QUERY 请求网格的每个电子邮件部分作为标头,然后 TRIM 删除空格,我们最终得到所有每个学生 ID 的电子邮件一起发送。

    那么只需将剩余的空格替换为换行符,即CHAR(10)即可。

    【讨论】:

      【解决方案3】:

      这里有一些解决方案(分别在 kishkin 2 中的 kishkin 1 表中)。

      单独列中的一行电子邮件:

      =ARRAYFORMULA(
        IF(
          J2:J = "",,
            TRIM(
              SPLIT(
                VLOOKUP(
                  J2:J,
                  SPLIT(
                    TRANSPOSE(QUERY(
                      QUERY(
                        FILTER({extract.csv!A:A & "♥", extract.csv!G:G & "♦"}, extract.csv!A:A <> ""),
                        "SELECT MAX(Col2)
                         GROUP BY Col2
                         PIVOT Col1",
                        1
                      ),, COUNTA(extract.csv!A:A)
                    )),
                    "♥"
                  ),
                  2,
                ),
                "♦"
              )
            )
        )
      )
      

      单个单元格中的电子邮件:

      ={
        "CONTACT EMAILS";
        ARRAYFORMULA(
          IF(
            J2:J = "",,
              REGEXREPLACE(
                VLOOKUP(
                  J2:J,
                  SPLIT(
                    TRANSPOSE(QUERY(
                      QUERY(
                        FILTER({extract.csv!A:A & "♥", extract.csv!G:G & CHAR(10)}, extract.csv!A:A <> ""),
                        "SELECT MAX(Col2)
                         GROUP BY Col2
                         PIVOT Col1",
                        1
                      ),, COUNTA(extract.csv!A:A)
                    )),
                    "♥"
                  ),
                  2,
                ),
                "(?m)^\s+|\s+$",
              )
          )
        )
      }
      

      【讨论】:

        猜你喜欢
        • 2020-09-16
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多