【问题标题】:Google Sheet: How to use arrayformula to copy data from one sheet to another?Google Sheet:如何使用 arrayformula 将数据从一张表复制到另一张表?
【发布时间】:2021-10-15 02:59:37
【问题描述】:

在谷歌电子表格中,我想将sheet1中的A2:G500同步到sheet2,我知道有以下两种方法:

  1. 使用IMPORTRANGE:将以下公式放入sheet2的A1中:

    =IMPORTRANGE("spreadsheet_url",sheet1!A2:G500)

它有效,但感觉好像我做得过火了,而且似乎存在性能问题

  1. 在sheet2的A2中,输入公式=sheet1!A2,然后将公式拖到sheet2中的G500处。这是一个直观且简单的操作。但是,如果 sheet1 是表单响应表,则它不起作用 - 添加新响应时,sheet2 不会自动获取它。

出于学习目的,我想知道是否有办法使用Arrayformula 来做到这一点。此外,我想找到一种方法让这种同步更加轻松,这意味着如果有不确定的数据行,我不必时不时地回到这张表并更改公式或手动拖动公式。这可能吗? Arrayformula 是实现此目的的正确方法吗?

【问题讨论】:

    标签: google-sheets google-sheets-formula


    【解决方案1】:

    我会推荐一个{ array expression },像这样:

    ={ Sheet1!A2:G }

    这差不多

    =arrayformula(Sheet1!A2:G)

    ...但我更喜欢{} 语法,因为它允许您指定不相邻的列。例如,您可以像这样跳过列 DF

    ={ Sheet1!A2:C, Sheet1!E2:E, Sheet1!G2:G }

    在区域设置使用逗号作为小数点而不是句点的电子表格中,使用反斜杠 \ 而不是逗号作为水平分隔符。

    要跳过,请使用分号; 作为垂直分隔符。例如,您可以像这样跳过行2:9

    ={ Sheet1!A1:G1; Sheet1!A10:G }

    开放式范围引用A10:G 表示“从第 2 行开始的列 A 到 G,一直延伸到工作表的底部。”

    您还可以省略行号以获得开放式范围引用,例如 A:G,这意味着 “从工作表的最顶部到底部的 A 到 G 列。”在几乎所有情况下,reference 的行为都与A1:G 相同。我已经养成了在参考中始终包含起始行的习惯,因为这样,如果在第 1 行上方插入一行,公式将自动调整。

    当源表是表单响应表时,需要另一种策略。表单响应始终插入到无法提前直接引用的新创建的行中。

    为避免在您将表单响应动态复制到另一张工作表时调整范围参考,请从第 1 行开始复制,如下所示:

    ={ 'Form Responses 1'!A1:A }

    或者,使用数组公式,如下所示:

    =arrayformula( 
      if( 
        row('Form Responses 1'!A1:A) = 1, 
        "Enter column header here", 
        'Form Responses 1'!A1:A 
      ) 
    )
    

    处理表单响应的更好方法是使用query() 函数将数据直接聚合到您需要的任何报告中。

    【讨论】:

    • 其实我今天试了一下,发现={sheet1!A2:A)并不能解决“表单回复”的问题,提交新的回复后,同一个单元格的公式会变成={sheet1!A3:A)。即使我把公式改成={sheet1!A$2:A)},还是会变成={sheet1!A$3:A)}
    • 表单响应表的行为有点不同。编辑了答案以涵盖这一点。
    【解决方案2】:

    要么:

    1. ArrayFormula(Sheet1!A2:G500) 用于 499 行,或
    2. ArrayFormula(Sheet!A2:G) 如果你想从第 2 行开始同步所有内容

    【讨论】:

      【解决方案3】:
      =ARRAYFORMULA(Sheet1!A:G)
      

      这不行吗?

      【讨论】:

      • 谢谢。这样可行。但是,就我而言,我不想同步第一行,所以我尝试=ARRAYFORMULA(Sheet1!A2:G2),但它不起作用。它只同步第二行。问题已更新。
      【解决方案4】:

      在第 1 行尝试:

      ={""; INDEX(sheet1!A2:A)}
      

      当您在第一行使用它时,这将解决您的表单问题。如果您的第 1 行中已有内容,则可以将其添加到双引号中,如下所示:

      ={"header"; INDEX(sheet1!A2:A)}
      

      如果有多个列,如下所示:

      ={"","","","","","",""; INDEX(sheet1!A2:G)}
      

      【讨论】:

      • 当然可以,但是当使用{ array expression } 以这种方式复制数据时,不需要index() 函数。你可以忽略它。
      • @doubleunary 是的,我把它留在那里以防 OP 的示例不如实际先进。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2018-06-24
      相关资源
      最近更新 更多