对比此前的几个函数:
BYCOL是按列进行遍历的迭代函数。
BYROW是按行进行遍历的迭代函数。
SCAN是按单元格进行遍历的迭代函数,保留运算的中间值。
REDUCE是按单元格进行遍历的迭代函数,只输出最终值的值。
MAP是数组内各个元素进行自上而下,自左而右进行遍历的的函数,可将多个数据重新映射为一个新值,它的特点是输出的数组同遍历的数组具有相同的行数,列数。以下通过4个案例来逐步理解该函数:
案例1:遍历数组,对于>4的,输出它的平方,小于等于4的,等于其本身。
=MAP(A1:C2,LAMBDA(x,IF(x>4,x*x,x)))
MAP函数对要遍历的数组进行自上而下,自左而右逐个运算。
这里要遍历的数组就是单元格区域A1:C2,Lambda中的变量x就对应于该数组中的各个值 。
=GROUPBY(B1:B12,A1:A12,ARRAYTOTEXT,3,0)
当然也可以使用Map()函数,总的思路就是先将单元格区域B2:B12提取唯一值,然后将它作为一个数组进行遍历,每次遍历时,嵌套FILTER函数,筛选出等于某一部门(如“财务部”)的所有姓名,用TEXTJOIN将其连接在一起。每次遍历的结果进行纵向连接,再加上表头。
=VSTACK({"部门","姓名"},HSTACK(UNIQUE(B2:B12), MAP(UNIQUE(B2:B12),LAMBDA(x,TEXTJOIN("、",TRUE,FILTER(A2:A12,B2:B12=x))))
))
案例3:依次提取单元格区域中每个单元格中的数值。
=MAP(A1:D2,LAMBDA(x,-LOOKUP(1,-RIGHT(x,ROW(1:9)))))
这个公式的关键是 -LOOKUP(1,-RIGHT(x,ROW(1:9))),以x=西瓜75为例 ,用RIGHT函数嵌套ROW(1:9)将它分别截取9次,得到一个9行1列的数组,然后用LOOKUP去查找,它会返回这个数组中的最大的数字。
=GROUPBY(A1:A13,C1:C13,VSTACK(
MAP({1,2,3,4},LAMBDA(x,LAMBDA(y,SUM(INDEX(y,x))/SUM(y)))),{1,2,3,4}&"季度"),
3,0)
SUM(INDEX(y,x))/SUM(y) 表示某个人某个季度的销售额占总销售额的占比。

