【问题标题】:Auto-change or Query function Google sheets自动更改或查询功能谷歌表
【发布时间】:2021-04-19 08:56:17
【问题描述】:

我目前有一个电子表格,其中包含一个名为 Data 的工作表,该工作表自动导入数据并具有手动数据输入,然后在名为 Output 的工作表中正确格式化它。从那里,它通过具有如下公式的 QUERY 函数分布在多张纸上:

=QUERY(Output!$B$2:XY,"SELECT AB",0)

这可行,但是当我添加新列时会带来问题。目前列总数为 70(不包括日期列 A)。如果我添加一个新列,例如在 Z 之后添加一个 AA 列,那么所有具有 AA 行的查询函数都不再起作用,必须手动更新。

有没有办法自动更改这些列,这样我就可以在数据和输出中添加一列,而无需手动更新?

请注意,数据表和输出表具有相同的列,但格式不同(例如,持续时间为数字,输出格式为 =IF(ISBLANK(Data!AG7), ,Data!AG7/24/3600)。所有表的 A 列都是日期。

小而编辑的示例表(完全相同的布局,只是更少的数据:https://docs.google.com/spreadsheets/d/1wLJ1xX9-ZXfmf9NHsBl3GscVS35hHnm6vFawgxRsOMY/edit?usp=sharing

如果在此工作表中添加了一行,例如在 Duration 之后,则 G - Q 列和单个 Activity 列将显示错误的数据。

【问题讨论】:

    标签: google-sheets google-sheets-formula


    【解决方案1】:

    而不是最后一列使用数字,例如:

    =QUERY(Output!$B$2:1000, "select AB", 0)
    

    【讨论】:

    • 这是个好主意,谢谢。你有什么建议可以让列自动更新吗,如果我要在 AA 之后添加一列,所以 AB,它将替换函数提供的数据。
    • 你的意思是喜欢在选择状态?
    • 是的,或者某种过滤器。这是迄今为止我能够创建的唯一有效公式,并且效果很好,但是自动更新非常令人沮丧。
    • 您可以对其应用一些数学运算,例如:=QUERY({Output!$B$2:1000}, "select Col"&COLUMNS(1:1), 0) 以始终获得最后一列
    【解决方案2】:

    TL;DR

    您可以使用ARRAYFORMULAHLOOKUP 来获取您需要的值:

    =ARRAYFORMULA(IFERROR(HLOOKUP(C14:Q14, Output!B1:Q, ROW(A2:A), FALSE)))
    

    完整答案

    您的代码的主要问题是您手动为每一个选择导入列。一个更好的方法是使用标题作为查找它的一种方式。

    此答案旨在成为有关其工作原理的迷你教程。我将使用链接的电子表格来解释它,因此其他电子表格可能需要更改所有范围。

    第一步:使用列标题选择Output中的列

    为此,我们将使用HLOOKUP。此公式查找具有适当标题的列(第一行),然后返回包含其列和指定行的值。

    所以如果你去C15 并添加公式:

    =HLOOKUP(C14, Output!B1:Q, 2, FALSE)
    

    您可以看到此单元格上的值成为Output 工作表上Score 列的第一个值。我们添加的参数:

    • C14:我们搜索的值,本例中的头部。
    • Output!B1:Q:我们想要的值的范围。在这种情况下是标题和值。
    • 2:我们想要在找到的列上的单元格的索引。以 1(标题)开头。
    • FALSE:如果Output 中的标题已排序。在这种情况下,它们不是。

    第 2 步:扩展到C 列中的每一行

    现在我们让它适用于单个单元格,让我们将其扩展到多个单元格。为此,我们将ARRAYFORMULAROW 一起使用:

    =ARRAYFORMULA(HLOOKUP(C14, Output!B1:Q, ROW(A2:A), FALSE))
    

    ARRAYFORMULA 允许我们做的是在单个单元格中设置一个函数但填充多个单元格。在这种情况下,我们将其扩展到整个列。

    但是现在你会意识到我们每次都需要更改索引,也就是我们之前的2需要每个单元格都不同。

    这就是ROW 发挥作用的地方:它返回给定单元格的行号。但我们实际上可以要求任何单元格,所以我们从 A2 开始(所以它返回 2)并继续它可以做的一切。它与ARRAYFORMULA 一起生成一个从 2 到文档行数的数字数组。

    第 3 步:对每一列重复

    ARRAYFORMULA 不仅仅在一个维度上起作用。所以我们可以将它扩展到其他列。更改C14 的列范围就足够了:

    =ARRAYFORMULA(HLOOKUP(C14:Q14, Output!B1:Q, ROW(A2:A), FALSE))
    

    第 4 步:过滤错误

    现在您会看到一些 #REF 错误。它们是由Output 表中实际不存在的标题引起的。我们可以使用IFERROR 删除错误:

    =ARRAYFORMULA(IFERROR(HLOOKUP(C14:Q14, Output!B1:Q, ROW(A2:A), FALSE)))
    

    请注意,这会迫使您在任何地方都使用完全相同的名称,这可能是您不想要的。

    第 5 步:根据您的需要进行修改

    这个公式是我能想到的最简单的公式,但仍需要对其进行维护和定制。您基本上可以修改公式中的两件事:

    • C14:Q14:此范围是要比较以生成列的值。我们正在使用标题,但不是必须的。您甚至可以从另一张纸上使用另一行。这可以使标题具有不同的名称。
    • Output!B1:Q这个范围是所有数据。如果您添加新行,则需要更改它。

    请注意,您无法在第一个区域的列中手动添加值,因此实际上可能需要多个公式。您只需要更改第一个范围。

    您可以改进此公式并为其添加更多功能,但它会很快变得复杂。

    参考文献

    【讨论】:

    • 感谢您提供的非常翔实的回答!这确实运作良好,并且完全符合我的预期。我也将它应用到输出表,因为它有同样的问题。它有效,但我唯一遇到的是持续时间格式,因为它有一个小公式:'=IF(ISBLANK(Data!C2), ,Data!C2/24/3600)',对于一个特殊列还有另一个公式,'=IF(Data!BL2>0, BK2+Data!BL2, (Data!BL2*-1)+BK2)'。我尝试了以下公式,但失败了(无信息):'=ARRAYFORMULA(IFERROR(HLOOKUP(AE1:AF1, Data!AE1:AF/24/3600, ROW(A2:A), 0)))' 任何想法这怎么可能?
    • @Nuxurious 操作应该对返回所选值的HLOOKUP 的结果执行。这意味着您可能想要使用=ARRAYFORMULA(IFERROR(HLOOKUP(AE1:AF1, Data!AE1:AF, ROW(A2:A), 0)/24/3600))。如果您遇到类似的情况,我建议您使用单个单元格,使用和修改步骤 1 中的公式。如果可行,您可以轻松应用以下步骤使其更通用。请注意,如果您只需要它处理单个列,您可以跳过第 3 步。
    • 这行得通,但它增加了另一个问题:它将没有数据的单元格格式化为 0:00:00 或 12:00 AM,这不再使每月平均值变得准确。这是以前的问题,我可以用这个公式来解决它:'=IF(ISBLANK(Data!E2), ,Data!E2/24/3600)' 但我不确定你是否可以添加那个公式最后也是,因为它是关于特定细胞的。我还没有成功尝试testing sheet
    • @Nuxurious 您基本上有 2 个选项:您可以使用 2 列(一列带有 ARRAYFORMULA,另一列带有 IF)或使用 =ARRAYFORMULA(IF(ISBLANK(IFERROR(HLOOKUP(D1, Data!D1:D, ROW(A2:A), 0))),,HLOOKUP(D1, Data!D1:D, ROW(A2:A), 0)/24/3600)),这基本上改变了 Data!E2整个公式并删除任何不必要的部分。
    • 完美!谢谢!
    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多