MAP函数对数组中的每个元素独立执行自定义 LAMBDA 函数,将处理后的结果按原数组结构完整返回。最终结果的行列数与原数组的行列数相同。它像一条自动化流水线,对每一个输入项执行标准化的加工操作,适用于批量转换、清洗或格式化数据。MAP(array1, [array2], ..., LAMBDA(params, calculation))1、通过多参数支持,可同时处理多个数组,实现复杂的多源数据并计算;2、第一个参数为需要运算的数组,也可以增加更多需要运算的数组。当对多个数组同时运算时,每个数组行列维度必须一致,不一致时不对应的半部分将返回值错误#N/A。3、LAMBDA函数运算体是必需参数,并且必须是最后一个参数。如下图所示:计算两个数组(黄色和绿色区域所示)对应数值的乘积。在F1单元格输入公式“=MAP(A1:D5,A8:D12,LAMBDA(x,y,PRODUCT(x,y)))”。公式将2个区域的数据作为数组参数,使用LAMBDA函数求得两个数组对应元素的乘积,如下图所示: MAP函数参数引用单元格区域时,遍历的数组中每个元素x仍带有单元格属性,函数支持OFFSET函数生成的多维引用。如下图所示,需要计算每个人1-2季度、2-3季度和3-4季度的总和。 在G15单元格输入公式“=MAP(OFFSET(A14,SEQUENCE(6),SEQUENCE(,3),,2),LAMBDA(x,SUM(x)))”。公式中offset以A14单元格为基点,向下偏移1-6行(SEQUENCE(6)),向右偏移1-3列(SEQUENCE(,3),注意3是列数,是第二个参数不要写在第一个参数行上),生成18个单元格区域的引用。MAP函数对这18个引用分别使用sum函数求和。结果如下图所示: 如下图所示计算每种货品的总数量,要得到所求结果很容易,也有多种方法,这里介绍MAP函数的应用。 如果已经得到了不重复的货品号,只需要求总数量,那么可以使用公式“=LET(品号,UNIQUE(A2:A38),MAP(品号,LAMBDA(x,SUMIF(A:A,x,B:B))))”,公式首先得到不重复的货品信息,并将其定义为变量"品号",然后使用MAP函数遍历这些品号,使用SUMIF函数将A列中与品号相同的货品进行数量求和。结果如下图所示: 如果要像透视表一样直接创建汇总表格,则可输入公式“=LET(品号,UNIQUE(A2:A38),VSTACK(HSTACK("货品","总数量"),HSTACK(品号,MAP(品号,LAMBDA(x,SUMIF(A:A,x,B:B))))))”。公示通过VSTACK和HSTACK将表头,品号和总数量链接起来。四、随机生成100以内加减法算式:
利用MAP函数遍历各个元素的特性,可以利用它生成随机的加减法算式。在任意单元格输入“=MAP(RANDARRAY(10,10,1,100,TRUE),RANDARRAY(10,10,1,100,TRUE),LAMBDA(x,y,IF(x>=y,x&"-"&y&"=",x&"+"&y&"=")))”。即可生成100道100以内的加减法算式,如下图所示:
五、聚合信息:
在实际中可能会遇到这种情形:比如,同一个物料放在不同的库位,为了检查物料设置的库位信息是否准确,以及进行对比,需要将库位及对应的数量聚合在一个单元格以便进行分析。这种情景要实现也有许多途径,这里还是看看MAP函数如何操作,主要是通过这些示例体会函数的运算逻辑。如下图所示,需要将库位及数量信息汇聚到F列,G列计算总数量
F2单元格输入公式“=TEXTJOIN(CHAR(10),,MAP(A2:A6,C2:C6,B2:B6,LAMBDA(x,y,z,FILTER(y&":"&z,x=E2,""))))”,将料号、数量、库位分别作为数组参数,通过filter函数将库位和数量通过“:”进行连接,最后将返回的值用换行符进行连接。G2单元格输入“=SUM(MAP(A2:A6,B2:B6,LAMBDA(x,y,FILTER(y,x=E2,"")))),总数量相对简单,只需要获取数量最后求和就可以了,”结果如下图所示: 如下图表格所示,表格中记录了各客户的购买日期和购买数量,现在想要得到每个客户最近N次(比如3次)购买的总数量。思路:可以将原表格根据“客户”升序排序,根据“购买日期”降序排序,这样只要获取每个客户的购买数量,然后取前N个数(比如3)然后求和就可以了。在实际中我们一般不想整理原表,这样的话,排序这些就可以使用自定义函数来定义为变量了。实现:在F2单元格输入“=LET(排序,SORTBY(A2:C25,A2:A25,1,B2:B25,-1),购买客户,CHOOSECOLS(排序,1),数量,CHOOSECOLS(排序,3),客户,SORT(UNIQUE(A2:A25)),MAP(客户,LAMBDA(x,SUM(TAKE(FILTER(数量,购买客户=x),3)))))”。let函数中参数“排序,SORTBY(A2:C25,A2:A25,1,B2:B25,-1)”将排序后的表定义为“排序”,参数“购买客户,CHOOSECOLS(排序,1)”将排序后表的第一列定义为购买客户,其它参数类推。MAP函数将不重复的客户名称作为数组参数,通过filter函数获取排序表中对应客户的购买数量,然后用take函数获取前3个数,最后用sum进行求和。结果如下图所示:小结:函数比较抽象,有兴趣的朋友可以多联系,体会函数中各参数的含义及实际用法。熟能生巧,很多情况下使用这个函数也不一定是简单的,但可以扩展思维广度和深度,实际应用时越简单越好,学习时可以加深一点难度,主要是为了加强对函数的理解,而不是快速达成需求。最后,给各位朋友留个小小的思考题:使用MAP函数能不能生成九九乘法表呢?