数组公式

当您想在 Google 表格中一次处理多个数据时,这很方便。数组公式.数组公式通过使用,即使是无法处理数组的函数也可以像在循环中应用一样处理。

数组公式不能做什么

但是,ARRAYFORMULA 有很多限制,你们中的许多人可能都经历过,如果你尝试做一些复杂的事情,你将不会得到你期望的结果。

主要原因有以下两点。

  1. 如果公式中即使有一个函数可以接收数组,它也不会很好地展开。
  2. 无法限制要扩展的部分。无法精细控制只在行中的循环或只在列中的循环,比如这里不展开。

    此外,已经发明了各种技巧来弥补这些弱点。
    https://monoblog.jp/archives/4416
    https://stackoverflow.com/a/72983822
    我之前也写过一篇这样的题目,请参考。
    处理 Google 表格中数组公式中的 AND 和 OR 函数中的错误

    救世主,LAMBDA功能的到来

    为了解决这种情况,它潇洒地出现了拉姆达函数是。
    您可能听说过 lambda 函数,这是一个可以在表达式中定义的匿名自定义函数,这是在许多编程语言中都可以找到的概念。

    电子表格中的 lambda 函数是首先在 Excel 中实现您似乎导入了已完成的操作。

    如何编写 LAMBDA 函数

    就是这样,它作为 LAMBDA 函数的一个样本正式上架了。

    使用例
    =LAMBDA(Salary, Salary*0.3)(1000)
    =LAMBDA(Temp, (5/9)*(Temp-32))(85)
    

    LAMBDA(...)(...) 有一个不熟悉的括号块串联。
    第一个括号的里面定义自己的功能所以,SalaryTemp是函数参数声明,接下来是函数的实际处理。
    第二个括号在里面,我实际上希望函数处理参数数据是。这是对已定义函数的调用。

    尽管它在使用示例中是一个,但您也可以定义多个参数。
    即使您添加更多参数,第一个括号中的最后一个参数也将始终是函数的定义部分。

    =LAMBDA(a,b,MAX(a,b))(A3,A10)
    

    到目前为止,自制函数都是用 GAS 编写的,但在这里它们被描述为数学公式。 (当然也可以调用GAS编写的自制函数)
    同时提供了LAMBDA功能的自制功能,而不是GAS的自制功能。命名函数把它想象成一个匿名版本

    数组不能作为 LAMBDA 函数的结果返回.
    然而有出路!

    用作数组公式的替代方法

    结合辅助函数

    如果你看到目前为止,“是什么让你这么高兴?”
    “别写=LAMBDA(a,b,MAX(a,b))(A3,A10),写=MAX(A3,A10)吧?”
    是我的想法。

    实际上 LAMBDA 函数是LAMBDA 辅助函数 (LHF)只有将 LAMBDA 函数与一组接收它作为参数的函数一起调用才有意义。或者更确切地说,第一次使用辅助函数而不是数组公式有可能。

    顺便说一句,当与辅助函数一起使用时,在 LAMBDA 函数部分你不需要第二个括号.因为函数调用由辅助函数处理。

    反向辅助函数

    在撰写本文时,似乎有六种类型的辅助函数。

    我想按行或列处理单元格范围

    如果要循环遍历一系列感兴趣的单元格,分别逐行或逐列BYCOL 函数或者BYROW 函数利用

    D1 单元格:=BYROW(A1:C3,LAMBDA(row,MAX(row)-MIN(row)))
    A4 单元格:=BYCOL(A1:C3,LAMBDA(col,(MAX(col)+MIN(col))/2))

    一个 B. C。 D.
    1 3 5 7 4
    2 4 3 5 2
    3 1 2 4 3
    4 2.5 3.5 5.5

    作为论据一个单元格范围给请注意,您只能指定

    我想处理具有不同角色的多个单元格范围作为参数

    BYROW 函数,BYCOL 函数,当参数数量不足时,地图功能可能用过了。
    到 LAMBDA 函数可以给定任意数量的参数就这样。

    D1 单元格:=MAP(A1:A3,B1:B3,C1:C3,LAMBDA(prod,price,count,prod&" "&(price*count)))

    一个 B. C。 D.
    1 产品A 5000 2 产品 A 10000
    2 产品B 3500 1 产品 B 3500
    3 产品A 5000 4 产品 A 20000

    但作为一个论点每个给定的单元格区域必须具有相同数量的元素有一个约束。
    这也是 ARRAYFORMULA 中的一个限制。

    我想根据多个单元格范围获得一个处理结果

    循环遍历整个数据范围,例如统计操作我想要一个单一的综合结果如果减少功能可以使用。
    第一个论点是累积值变量(lambda 函数的第一个参数保存循环之前的结果)初始值,第二个参数是循环范围。

    一个 B. C。
    1 红色的 蓝色, 黄色
    2 绿色, 红色 黄色 紫色的
    3 蓝色的 紫色, 蓝色 绿色,黄色,红色

    公式:=REDUCE("",A1:C3,LAMBDA(result,current,IF(current="",result,result&","&current)))
    结果:
    ,赤,青,黄,緑,赤,黄,紫,青,紫,青,緑,黄,赤

    我想在参考上一个结果时遍历多个单元格范围

    像 REDUCE 函数累积值变量,但与 REDUCE 函数不同,我想返回与我提供的数据数量一样多的结果在某些情况下,扫描功能可以使用。
    第一个参数是前一个值变量的初始值(lambda 函数的第一个参数),第二个参数是循环范围。

    B1 单元格:=SCAN(0,F9:F13,LAMBDA(prev,x,prev+x))

    一个 B.
    1 1 1
    2 2 3
    3 3 6
    4 4 10
    5 5 15

    我想在没有原始单元格范围的情况下使用指定的行数 x 列数进行循环

    尤其是在没有原始单元格范围的状态下,我想创建一个具有指定行数 x 列数的数组时间是制作阵列你能行的!

    单元格 A1:=MAKEARRAY(5,5,LAMBDA(r,c,4-ABS(r-3)-ABS(c-3)))

    一个 B. C。 D. 图片
    1 0 1 2 1 0
    2 1 2 3 2 1
    3 2 3 4 3 2
    4 1 2 3 2 1
    5 0 1 2 1 0

    应用

    我想用 BYROW、BYCOL 接收多个单元格并以不同方式处理它们

    LAMBDA 函数不能返回数组,参数可以接收数组.
    这就是为什么,BYCOL 函数或者BYROW 函数您可以使用 LAMBDA 函数将二维数组或单元格区域传递给并处理多个单元格。

    上面的示例也是使用 MAX 和 MIN 函数处理多个单元格的情况。
    D1 单元格:=BYROW(A1:C3,LAMBDA(row,MAX(row)-MIN(row)))
    A4 单元格:=BYCOL(A1:C3,LAMBDA(col,(MAX(col)+MIN(col))/2))

    但是,这很容易,因为它只对多个单元格应用相同的处理,但是如果您希望每个单元格具有不同的含义怎么办?

    您可以使用 INDEX 函数提取数组的任何元素

    索引函数可用于检索数组的单个元素。

    让我们用 INDEX 函数重写 MAP 函数中给出的示例。

    D1 单元格:=MAP(A1:A3,B1:B3,C1:C3,LAMBDA(prod,price,count,prod&" "&(price*count)))

    一个 B. C。 D.
    1 产品A 5000 2 产品 A 10000
    2 产品B 3500 1 产品 B 3500
    3 产品A 5000 4 产品 A 20000


    D1 单元格:=BYROW(A1:C3,LAMBDA(row,INDEX(row,1,1)&" "&(INDEX(row,1,2)*INDEX(row,1,3))))

    好吧,在这个例子中,使用 MAP 似乎更容易理解,但你也可以这样写,供大家参考。

    如果要部分提取多个集合,则使用 OFFSET 函数

    由于 INDEX 函数一次只能提取一个元素,偏移功能让我们使用

    E1 单元格:=BYROW(A1:D3,LAMBDA(row,INDEX(row,1,1)&" "&SUM(OFFSET(row,0,1,1,COUNT(row)))))

    一个 B. C。 D. 图片
    1 A店 120 130 130 店铺 A 380
    2 B店 350 370 380 B店1100
    3 C店 180 220 200 C店600

    这种事情不能用 MAP 完成,因为它会生气“数组参数的大小不同”。
    =MAP(A1:A3, B1:D3,LAMBDA(name,values,name&" "&SUM(values)))
    Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう

    我想在数组中返回 LAMBDA 函数的结果

    作为 LAMBDA 函数共有的约束,无法在数组中返回结果有一种东西叫。
    但是,视情况而定,可以巧妙地解决。

    对于REDUCE函数,用JOIN分解,加入SPLIT

    在 LAMBDA 函数内加入函数作为字符串加入和外部分割功能有一种方法可以拆卸它

    以下示例使用逗号作为分隔符,因此字符串中的任何逗号都将拆分为单独的元素。在这里,我们有意使用它来消除重复元素,但为了防止这种情况发生,使用目标数据中从未包含的字符串作为分隔符,或者如果不可能,则将其转义(转换为正常在 JOIN 之前具有特定模式的字符串,然后在 SPLIT 之后进行反向转换)。

    一个 B. C。
    1 红色的 蓝色, 黄色
    2 绿色, 红色 黄色 紫色的
    3 蓝色的 紫色, 蓝色 绿色,黄色,红色

    公式
    =UNIQUE(FLATTEN(SPLIT(REDUCE("",A1:C3,LAMBDA(result,current,JOIN(",",result,current))),",",FALSE,TRUE)))

    结果
    红色的
    蓝色的
    黄色
    绿色
    紫色的

    独特的功能只能处理面向行的数组。由于 LAMBDA 函数似乎是一个面向列的数组,展平功能或者移调功能必须通过

    再次使用 ARRAYFORMULA! ?

    最初返回数组的函数,而不是 REDUCE 函数,加入&分裂还不够。你可以在那里使用ARRAYFORMULA 函数.
    不灵活的 ARRAYFORMULA 仍有用处。

    D1 单元格:=ARRAYFORMULA(SPLIT(BYROW(A1:C3,LAMBDA(row,MAX(row)&","&MIN(row))),","))
    A4 单元格:=ARRAYFORMULA(TRANSPOSE(SPLIT(BYROW(TRANSPOSE(A1:C3),LAMBDA(col,(MAX(col)&","&MIN(col)))),",")))

    一个 B. C。 D. 图片
    1 3 5 7 7 3
    2 4 3 5 5 3
    3 1 2 4 4 1
    4 4 5 7
    5 1 2 4

    由于这次只有两个连接元素,字符串直接用逗号连接,不使用JOIN函数。
    BYCOL似乎与 ARRAYFORMULA 不兼容,无法按预期扩展,因此原始数据范围为移调功能转换为BYROW 函数,然后使用TRANSPOSE函数将其返回到行方向。

    其他写作方式

    虽然它不是很通用,但在上面的示例中,它也可以写成两个函数的数组,如下所示。

    D1 单元格:={BYROW(A1:C3,LAMBDA(r,MAX(r))),BYROW(A1:C3,LAMBDA(r,MIN(r)))}
    A4 单元格:={BYCOL(A1:C3,LAMBDA(c,MAX(c)));BYCOL(A1:C3,LAMBDA(c,MIN(c)))}

    实际上,这与将公式分别放在 2 行/2 列中没有太大区别。
    但是您也可以将它作为参数传递给另一个辅助函数。无需在单元格中输入值在公式中创建任意数组作为一种方法,记住它可能会很好。

    {} 方法也可用作 LAMBDA 辅助函数的参数。
    如果你想用一个辅助函数来处理不连续的单元格范围,你可以写像BYCOL({A1:C5,E1:F5,H1:J5},LAMBDA(...)),BYROW({A1:C8;A11:C15;A18:C25},LAMBDA(...))这样的东西。
    BYCOL 和 BYROW{} 中的分隔符不同注意逗号“,”是一行(纵向)连接,分号“;”是一列(水平方向)连接并正确使用。

    我想使用具有不同数量元素的多个单元格范围

    地图功能如何处理无法完成的不同单元格范围的组合
    让我们充分利用 ARRAYFORMULA 中未按预期工作的各种功能。

    通过在 LAMBDA 函数中搜索来查找

    首先,在这种情况下,您要循环的主要数据可能会缩小到一个,并且可以从中派生其他单元格范围。
    在这种情况下查询功能可能用过了。

    在以下示例中,根据销售历史表,将每个型号的销售数量和总销售额输出到销售汇总表(也用作价格表)。

    销售履历表 销售汇总表
    Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう

    C2细胞:
    =BYROW(A2:A6,LAMBDA(name,QUERY('販売履歴'!A2:B11,"SELECT SUM(B) WHERE A='"&name&"' GROUP BY A LABEL SUM(B) ''")))
    D2 单元格:
    =MAP(A2:A6,B2:B6,LAMBDA(name,price,SUM(QUERY('販売履歴'!A2:B11,"SELECT B WHERE A='"&name&"'"))*price))

    如果单元格排列不简单但可以计算,使用INDEX函数

    索引函数您可以使用 . 从单元格区域中提取指定行/列位置的数据。

    以下示例从列出地图上检查点坐标的工作表上的地图数据中获取每个坐标的切片。

    C2单元:=MAP(A2:A8,B2:B8,LAMBDA(x,y,INDEX('地図'!A1:E7,y,x)))

    地图表 检查点表
    Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう

    如果您选择一系列一对多关系,请使用 OFFSET 函数将其移动

    尽管循环源和顺序匹配,但如果要为每个循环使用一组多个单元格范围,偏移功能可能更好。

    下面的例子是根据历史数据,从为每个主键(A、B、C、D)创建的2x3表中检索副键(x、y、z)对应的值的例子。
    不知怎的,样本变得越来越没有意义......(在现实的例子中,公式变得复杂,作为样本变得难以理解)

    C3 单元格:=MAP(A1:A5,B1:B5,LAMBDA(a,b,VLOOKUP(b,OFFSET('マスタ表'!A2:H4,0,MATCH(a,'マスタ表'!1:1,0)-1,3,2),2)))

    主表表 历史表
    Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう

    “这种主桌做的不好。”但在现实中,很多情况下数据格式无法根据自己的方便决定Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう

    如果它更复杂,例如不同的工作表,请使用 INDIRECT 函数指定它

    如果您想指定比 OFFSET 函数更复杂的范围,例如,如果您想从不同的工作表中引用它单元格范围可以指定为字符串间接函数会很好。

    例如,在上一节的示例中,如果主表是在单独的工作表上为每个主键准备的......

    C3 单元格:=MAP(A1:A5,B1:B5,LAMBDA(sheet,xyz,VLOOKUP(xyz,INDIRECT("'"&sheet&"'!A1:B3"),2)))

    座位 B座 C座 D座 历史表
    Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう Googleスプレッドシート ARRAYFORMULAより便利なLAMBDA関数を使おう

    其他不定时更新(计划中)

    如果您有任何问题,请在评论部分告诉我

    概括

    LAMBDA 和 LAMBDA 辅助函数比 ARRAYFORMULA 函数更灵活,可用于迭代多个单元格范围。
    LAMBDA函数也有一些限制,但是用ARRAYFORMULA函数不能很好用的“接收数组的函数本身”可以正常使用,所以看你的聪明才智,可以扩展你能做的。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308632806.html

相关文章:

  • 2021-08-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-18
  • 2022-12-23
  • 2021-12-06
  • 2021-11-28
猜你喜欢
  • 2022-02-22
  • 2022-12-23
  • 2021-04-24
  • 2022-12-23
  • 2022-12-23
  • 2021-12-28
相关资源
相似解决方案