MAP
语法
MAP(array, [arrar2], ……, lambda(value,[value2], ……, calculation))
-
array:需要进行映射的数组,可以有多个
注:多个数组的形状大小尽可能保持一致,否则将出现错误值
-
value:数组中的每个值,每次取一个值,每个 array 按顺序对应一个 value
-
calculation:设定的计算处理逻辑
作用
- 依次将数组中的每个值放入lambda中进行函数运算,最终形成一个和原数组形状大小一样的新的数组
图示
案例
-
计算成绩是否合格
- 根据成绩列的平均分判断是否合格
=MAP(C24:C33,LAMBDA(x,IF(AVERAGE(--TEXTSPLIT(x,","))>=60,"合格","不合格")))
// 公式详解 =MAP( C24:C33, //需要进行映射的数组 LAMBDA( x, //数组中的每个值 // 1.用TEXTSPLIT函数对成绩单元格中的内容进行拆分 // 2.用"--"将拆分后的数据转化为数值 // 3.计算拆分后数组的平均值 // 4.根据平均值结果是否">=60"判断合格于否 IF(AVERAGE(--TEXTSPLIT(x,","))>=60,"合格","不合格") ) )
-
列出合格人员的姓名
- 根据是否合格筛选出对应人员姓名
=MAP(B24:B33,D24#,LAMBDA(x,y,IF(y="合格",x,"")))
// 公式详解 =MAP( B24:B33, // 数组1,姓名 D24#, // 数组2,是否合格 LAMBDA( x, // 姓名中的每个值 y, // 是否合格中的每个值 IF(y="合格",x,"") // 判断是否合格,是则取出对应的姓名,否则置空 ) )
-
生成指定大小的随机计算题
- array指定数组大小,但不直接参与运算
=MAP(SEQUENCE(10,4),LAMBDA(x,CONCAT(RANDBETWEEN(10,50),"+",RANDBETWEEN(10,50),"=")))
// 公式详解 =MAP( SEQUENCE(10,4), // 利用SEQUENCE函数指定最终输出数组的大小为10行4列 LAMBDA( x, // 数组中的每个值,不参与下方逻辑处理 // 1.用RANDBETWEEN函数生成2个10到50间的随机数 // 2.用CONCAT函数进行数据拼接,形成计算题 CONCAT(RANDBETWEEN(10,50),"+",RANDBETWEEN(10,50),"=") ) )
-
模糊筛选(双层MAP嵌套)
- 根据指定英文名进行模糊筛选
=MAP(B4:B9,LAMBDA(z,TEXTJOIN(,TRUE,MAP($M$4:$M$5,LAMBDA(y,IF(ISNUMBER(SEARCH(y,z)),z,""))))))
// 公式详解 =MAP( B4:B9, // 外层循环数组Data LAMBDA( z, // Data中的每个值 // 由于每个Data被内层find_text匹配了2遍,故用TEXTJOIN进行合并,否则公式报错 TEXTJOIN( , TRUE, // 字符串合并忽略空值 MAP( M4:M5, // 内层循环数组find_text LAMBDA( y, // find_text中的每个值 // 1.查找Data值是否包含find_text中的值 // 2.如包含则返回位置的数值,此时用ISNUMBER判断返回值是否为数值 // 3.如为真,则返回Data值,否则返回空 IF(ISNUMBER(SEARCH(y,z)),z,"") ) ) ) ) )
5. 计算移动平均- 利用映射单元格的属性,计算近3天移动平均
=MAP(C56:C68,LAMBDA(x,AVERAGE(OFFSET(x,-2,,3))))
=MAP( C56:C68, // 需要进行映射的数组 LAMBDA( x, // 数组中的每个值 // 1.用OFFSET将当前映射单元格向上偏移2行并获取3行的区域 // 2.计算移动平均值 AVERAGE(OFFSET(x,-2,,3)) ) )