【问题标题】:How to create array dynamically from a string without copy pasting?如何在不复制粘贴的情况下从字符串动态创建数组?
【发布时间】:2022-11-08 02:47:11
【问题描述】:

我有这些字符串{ column01 \ column02 \ column01 }(对于其他国家/地区{ column01 , column02 , column01 })。我希望它们被评估为一个数组,就像复制粘贴一样。

数组字符串范围是根据用户的选择自动创建的。我基于名为studeertijden 的工作表创建了一个动态个性化数据集。用户可以通过复选框轻松选择想要的表格,因此可以通过 Google 表格数组范围(公式)。我尝试将这些内容复制到另一张工作表……以使所需的数据可用于 Google Data Studio。

studeertijden 页面的内容并不重要。假设'legende-readme'!B39 中的一个单元格返回一个细绳所需的列/数据格式如下:

{ studeertijden!A:A \ studeertijden!B:B}

如果我把它放在一张空纸上,通过复制和粘贴,它工作正常

={ studeertijden!A:A \ studeertijden!B:B}

怎么能自动完成???
我的第一个想法是indirect ...

我试过的(不起作用):

单元格'legende - readme'!B39 包含:

{ studeertijden!A:A \ studeertijden!B:B}
  • =indirect('legende - readme'!B39)
    返回:

#REF! - 它不是有效的单元格/范围引用。

  • ={ indirect('legende - readme'!B39) } 返回:

#REF! - It is not a valid cell/range reference.

  • ={'legende - readme'!B39}
    返回:{ studeertijden!A:A \ studeertijden!B:B}

笔记: 对于欧洲用户,使用 '\' [反斜杠] 作为列分隔符。而不是 ',' [逗号]。

【问题讨论】:

  • 不要共享电子表格/图像作为唯一的数据来源。确保将输入和预期输出添加为纯文本表格(不是图像/电子表格链接)问题。 Click here 轻松创建表格。添加这样的表会使复制/粘贴更容易.如果不是self contained,您的问题可能已结束。您的表格应该是一个最小的示例。Your email address can also be accessed by the public,如果您共享 Google 文件。
  • @player0 我不确定你明白。您的回答没有说​​明如何获得=INDIRECT("{ studeertijden!A:A \ studeertijden!B:B}")。我将编辑这个问题以澄清。
  • 与所需输出的示例共享工作表的副本/样本

标签: arrays google-sheets dynamic google-sheets-formula


【解决方案1】:

假设我已经理解了这个问题,如果细绳不需要以大括号开头和结尾,那么这是您正在寻找的行为吗?

=arrayformula(transpose(split(byrow(transpose(split(string,",")),lambda(row,join(",",indirect(row)))),",")))

注:就我而言,我假设细绳格式为“studeertijden!A:A,studeertijden!B:B”(即逗号分隔)。因此,通过逗号分割以生成引用的列向量,转置为行向量,对每一行进行间接处理(使用 JOIN 以每行返回一个单元格),ARRAYFORMULA/SPLIT 以返回每行多个单元格,转置回列如原始数据。

如果 BYROW/BYCOL 可以返回一个矩阵而不是仅限于一个行/列向量,这将容易得多 - 不需要 BYROW 中的外部 SPLIT 和 JOIN。在 Excel 世界中,他们还可以使用 thunk 数组而不是字符串操作来处理这个限制(Excel 也有),但是当我尝试过时,Google Sheets 似乎不允许它们 - 有关更多详细信息,请参阅 https://www.flexyourdata.com/blog/what-is-a-thunk-in-an-excel-lambda-function/ .

【讨论】:

  • 这个想法是使用'数组公式',也称为'数组字面量' 在谷歌表中, 复制数据不是正确的词,参考原始数据在单独的工作表中(以便它得到自动更新如果原始表格上有更改)。它将用作某种“列”过滤器。然后该表可以用于谷歌 数据 工作室...
  • 在原始帖子中,我引用了关于 ' 的 02 教程数组' : - How To Create Arrays In Google Sheets (a.k.a. Array Literals) - youtube: Google Sheets ARRAYFORMULA, Introductions to Arrays, ARRAY_CONSTRAIN, SORT Functions Tutorial 希望这能更多地解释我的需求。
  • 我给出的公式确实根据标题专门回答了这个问题,因为它动态地创建了一个数组而无需复制/粘贴。它也确实引用了原始数据并会自动更新,所以我对你的评论有点困惑。您在这里遇到的基本问题是您无法以您想要的方式将字符串强制评估为数组文字,因此您不得不使用 INDIRECT,但 INDIRECT 不接受数组参数,因此需要使用 LAMBDA+帮助器通过字符串中每个引用的 INDIRECT 分段构建数组。
  • 只需将{}, 添加到拆分中
  • 是的,这会起作用...但是 OP 似乎是通过基于某些复选框的公式生成字符串,并且可能正在添加 {} 作为公式的一部分以使字符串看起来像数组文字 - 但它永远不能这样评估,因此 {} 将始终是多余的,并且首先不生成包含它们的字符串会更有意义。
【解决方案2】:

感谢AbleBits 的 Natalia Sharashova,她提供了这个可行的解决方案(完整的工作表)。

referenceString 是对所有想要列的字符串的引用;数组矩阵; { studeertijden!A:A studeertijden!B:B}

笔记 :

  • 对于欧洲用户,使用 ' ' - [反斜杠] 作为列分隔符
  • 而不是默认的',' - [逗号]

=REDUCE(
    FALSE; 
    ArrayFormula(TRIM(SPLIT(REGEXREPLACE( referenceString ; "^=?{(.*?)}$"; "$1"); ""; TRUE; TRUE))); 
    LAMBDA(accumulator; current_value; 
        IF(
            accumulator = FALSE;
            INDIRECT(current_value); 
            { accumulator  INDIRECT(current_value)}
        )     
    )
)

【讨论】:

    【解决方案3】:
    ={"1" , "2"}
    
    ={"1"  "2"}
    

    两者都是有效的。这一切都取决于您的语言环境设置

    见:https://stackoverflow.com/a/73767720/5632629

    间接的将是:

    =INDIRECT("sheet1!A:B")
    

    您可以在其中动态构建它,例如:

    =INDIRECT("sheet1!"& A1 &":"& B1)
    

    其中 A1 包含类似 AA1 的字符串(B1 也一样)

    另一种构造范围的方法是使用ADDRESS,例如:

    =INDIRECT(ADDRESS(1; 2)
    

    从另一张纸上可能是:

    =INDIRECT(ADDRESS(1; 2;;; "sheet2")
    

    或喜欢:

    =INDIRECT("sheet2!"&ADDRESS(1; 2))
    

    对于我们可以做的范围:

    =INDIRECT("sheet2!"&ADDRESS(1; 2)&":"&ADDRESS(10; 3))
    

    【讨论】:

    • 我在下一篇文章中发表了评论……希望它能更多地解释我的需求。关于您共享文件的请求,由于 TheMaster 的评论,我已从原始帖子中删除了指向共享 google 表格的链接(请参阅原始帖子的评论)
    猜你喜欢
    • 2019-05-02
    • 2016-02-24
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多