【问题标题】:Is there a way to specify an input is a single cell in Google Sheets?有没有办法指定输入是谷歌表格中的单个单元格?
【发布时间】:2021-01-26 19:44:59
【问题描述】:

我想遍历一个单元格数组,在本例中为 B5:B32,并将与某些参考文本相等的值保留在一个新数组中。

但是,现在 SPLIT 接受数组作为输入。这意味着如果我在 ARRAYFORMULA 或 FILTER 中使用“B5:B32”的数组表示法,它会将其视为一个范围,而不是我们一次迭代一个单元格的数组。

有没有办法确保特定范围是我们迭代的范围,而不是一次性作为输入给出的范围?

我考虑的是使用单元格的替代公式,使用 INDEX(ROW(B5), COLUMN(B5)) 但 ROW 和 COLUMN 也接受数组值,所以我不知道如何继续。

示例代码:

ARRAYFORMULA(
    INDEX(
        SPLIT(B5:B32, " ", 1), 1
    ) = "Some text here"
)

示例表: https://docs.google.com/spreadsheets/d/1H8vQqD5DFxIS-d_nBxpuwoRH34WfKIYGP9xKKLvCFkA/edit?usp=sharing

注意:在示例表中,如果我创建包含 SPLIT 公式结果的单独列,我可以得到我想要的答案。这样,我首先进行所需的 SPLITS,然后通过指定正确的范围从该输出中获取我需要的值。

有没有一种方法可以做到这一点,而无需先创建输出,然后将单元格范围作为 FILTER 或其他类似函数的输入?

例如,在单元格 C35 中,我已经一次性完成了所需的 SPLIT 和 FILTER,但我仍然需要找到一种方法来总结第二列第一个字符的值。这样做需要我获取第二列的 LEFT 值,但为此我需要输出结果并在新单元格中继续。有没有办法避免这种情况?

【问题讨论】:

  • 分享您的工作表副本以及所需结果的示例
  • 我想在很多文档中使用它,基本思想始终相同:我想知道如何迭代数组而不是将整个数组作为单个输入提供到一个函数。我应用此方法的许多文档都包含隐私敏感信息,但如果与任何一个特定示例存在隐藏相关性,我可以创建并上传一个带有混淆名称的示例。
  • RalphD,感谢这里的志愿者贡献他们的时间来回答这些问题,如果您准备一份样本表,他们可以在其中测试和演示建议的解决方案,这会有所帮助。通常您的样本表将包含样本数据和您希望看到的结果的复制,以及您在开发解决方案时可能所做的任何尝试。这使每个人都不必在相关时创建适当的测试数据。请参阅本指南。谢谢! support.google.com/docs/thread/3808684?hl=en
  • 请公开分享样本表,以便我们准确了解问题。另外,您是否考虑过使用apps script
  • 抱歉,马上就有例子了!

标签: google-sheets split array-formulas


【解决方案1】:

Ralph,我不确定您的样本表是否真的反映了您最终想要得到的结果,因为例如,我假设您可能想要每个区域的总小时数。

无论如何,这个公式提取了所有区域和工作时间,然后很容易进行进一步的计算。

=ArrayFormula({REGEXEXTRACT({C5:C9;D5:D9;E5:E9;F5:F9;G5:G9;H5:H9},"(.*) \d"),
         VALUE(REGEXEXTRACT({C5:C9;D5:D9;E5:E9;F5:F9;G5:G9;H5:H9}," (\d+)hrs"))})

在单元格 E13 中尝试,以查看输出。

第一个REGEXEXTRACT拉出第一个空格和数字前面的所有文本,第二个拉出每个单元格中“#hr”字符串中的所有数字。如有必要,可以根据您的实际要求修改这些标准。请注意,它需要使用 VALUE 将小时数从文本转换为数值,因为 REGEXEXTRACT 会生成文本(字符串)结果。

它涉及将多个数据列连接成一长列数据,以便更简单地以相同方式处理所有单元格。

下一个公式将为您提供一个总和,例如,对于您在 B6 中键入的任何匹配的房间/任务。

=ArrayFormula(QUERY({REGEXEXTRACT({C5:C9;D5:D9;E5:E9;F5:F9;G5:G9;H5:H9},"(.*) \d"),
               VALUE(REGEXEXTRACT({C5:C9;D5:D9;E5:E9;F5:F9;G5:G9;H5:H9}," (\d+)hrs"))},
     "select Col1, sum(Col2) where Col1='"&B6&"' group by Col1 label sum(Col2) '' ",0))

【讨论】:

  • 您的回答演示了如何使用 QUERY 获取列并因此在单个单元格中创建单个公式,以及如何将结果连接到单个列中,这通常很有用。谢谢!有没有一种方法可以在没有 QUERY 的情况下执行此操作,它不涉及编写可以接受数组作为输入的自定义 INDEX 函数的脚本?话虽如此,无论哪种方式,现在我只能使用 QUERY 并没有意识到这是一种如此明显的选择列的方式!
【解决方案2】:

根据我从 kirkg13 的回答和其他来源了解到的信息,我也会回答我自己的问题。

简短回答:不,没有。如果您想对特定单元格值进行非常复杂的计算,有一些选项和提示:

  1. 编写您自己的函数。您可以扩展 INDEX 以接受数组输入,从而您可以从数组中选择任何一组值,而无需先输出它。不使用 REGEXMATCH 和 QUERY 来获取问题示例数据集中小时总和的示例:https://docs.google.com/spreadsheets/d/1NljC-pK_Y4iYwNCWgum8B4NJioyNJKYZ86BsUX6R27Y/edit?usp=sharing

  2. 使用查询。这使您的公式很快变得更加复杂,但仍然是选择数据(例如特定列)的可读且普遍适用的方法。在问题的初始示例中,QUERY 只能检索第二列,就像改编后的 INDEX 函数一样。

  3. 更有效地格式化您的输入数据。您越容易从输入中获取数字,就越不需要使用 REGEXMATCHES 和 QUERY 来混淆代码来进行计算。在 RANGE 上进行 SUM 比对 FILTER 的 SPLIT 的 ARRAYFORMULA 的 QUERY 的 LEFT 的 VALUE 更紧凑。当然,这将取决于您从哪里获得输入以及您是否对此有任何发言权。

  4. 此外,根据您将在给定数据集上运行的查询数量,实际上可能需要将公式拆分为单独的部分并输出部分结果,以防止代码成为 12 个不同查询和公式的合并.如果结果不需要人们查看,您可以随时选择隐藏特定的列和行。

【讨论】:

  • 很好地回答了你自己的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多