Google sheets Google Sheets-使用arrayformula将多行数据合并为单行或单元格

Google sheets Google Sheets-使用arrayformula将多行数据合并为单行或单元格,google-sheets,array-formulas,Google Sheets,Array Formulas,我从我们的学生信息系统中导出了一个,每个学生都有多行,具体取决于家长输入的联系电子邮件地址数量 我想将所有联系人地址合并到同一行的多个列中,或者全部合并到同一单元格中都可以。经过多次搜索尝试后,我可以使用=join(char(10),filter(extract.csv!G:G,extract.csv!a:a=J2))并手动填充公式。(虽然我不希望先得到回报,而只是在结果之间,但如果不可能的话,我可以接受。) 我想要的是把它放在一个数组中,这样我就不必把它抄下来,但我不知道如何调整最后一个对J

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

我想将所有联系人地址合并到同一行的多个列中,或者全部合并到同一单元格中都可以。经过多次搜索尝试后,我可以使用=join(char(10),filter(extract.csv!G:G,extract.csv!a:a=J2))并手动填充公式。(虽然我不希望先得到回报,而只是在结果之间,但如果不可能的话,我可以接受。)

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


还是有别的方法可以得到我想要的?谢谢你的帮助。。。我只是一个老师,喜欢编写代码,让事情自动处理,边走边学

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

=ArrayFormula(if(mod(sequence)(countunique(A2:A),D2,0),D2)我添加了一个新的工作表(“Erik帮助”),它是“AutoFillData”工作表的副本。在我的工作表中,我清除了列AD,然后在AD1中放置了以下公式:

`=数组格式({“联系电子邮件”;IF(J2:J=”“)、IFERROR(VLOOKUP)(J2:J,{UNIQUE(FILTER)(extract.csv!A2:A,extract.csv!A2:A)”)、替换(TRIM(TRANSPOSE)(TRANSPOSE)(QUERY)(TRANSPOSE)(IF(ISERROR)(VLOOKUP)(UNIQUE)(FILTER)(extract.csv!A2:A,extract.csv!A2:A))&&(UNIQUE)(FILTER)(FILTER)(“|“&{.csv!E2:E;extract.csv!F2:F;extract.csv!G2)}),{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)),转置(唯一(过滤器({extract.csv!E2:E;extract.csv!F2:F;extract.csv!G2:G},{extract.csv!E2:E;extract.csv!E&“),”和extract.csv:G},“,”,COUNTA(唯一过滤器“,”),”({extract.csv!E2:E;extract.csv!F2:F;extract.csv!G2:G},{extract.csv!E2:E;extract.csv!G2:csv!F2:F;extract.csv!G2:G}“”,“”,CHAR(10))},2,FALSE)))

充分解释这个公式需要相当长的时间

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

这样就形成了一个网格,所有可能的电子邮件都在每个唯一ID的某个位置水平填写,而不是在单独的行上

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

然后,只需将剩余的空格替换为一个换行字符,即CHAR(10)。

以下是一些解决方案(分别在kishkin 1kishkin 2中)

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

=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,
          ),
          "♦"
        )
      )
  )
)
=数组公式(
如果(
J2:J=“”,,
修剪(
分裂(
瓦卢库普(
J2:J,
分裂(
转置(查询)(
质疑(
过滤器({extract.csv!A:A&“♥", extract.csv!G:G&“♦“},extract.csv!A:A”“),
“选择最大值(Col2)
Col2分组
支点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+$",
        )
    )
  )
}
={
“联系电子邮件”;
阵列公式(
如果(
J2:J=“”,,
REGEXREPLACE(
瓦卢库普(
J2:J,
分裂(
转置(查询)(
质疑(
过滤器({extract.csv!A:A&“♥“,extract.csv!G:G&CHAR(10)},extract.csv!A:A”“),
“选择最大值(Col2)
Col2分组
支点Col1“,
1.
),COUNTA(extract.csv!A:A)
)),
"♥"
),
2.
),
“(?m)^\s+|\s+$”,
)
)
)
}

这是可以做到的,但它很复杂。获得帮助的最有效方式是共享一个链接,链接到一个与图像中显示的完全相同的示例电子表格。(您只有虚拟数据,没有敏感数据,所以这没有问题。)共享对示例电子表格的访问权限将允许访问实际数据以及测试场地和留下解决方案的地方。只需确保在创建链接时将共享权限设置为“任何具有链接的人…”和“编辑器,"因此,这里的人可以完全访问该表。是的,这是相当棘手的。我在Excel中做了类似的事情,如果你想了解它,那么一种方法是将其作为Google Sheets公式重新进行。顺便说一句,如果你能对学生可能拥有的电子邮件地址数量设置上限,这将使它变得更容易。另外我应该说欢迎使用Stack Overflow!谢谢@ErikTyler这是一个具有编辑权限的电子表格示例。我很高兴知道它很复杂,因为它给了我很多麻烦!我将尝试使用Excel solu
=max(countif(A2:A,unique(filter(A2:A,A2:A<>""))))
=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+$",
        )
    )
  )
}