Google 表格公式 - 反转数组
本文介绍如何反转数组
官方提供的函数中貌似没有一个专门反转数组的函数,所以这里手动实现了一下,记录一下实现的思路。
样表如下,
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 53 | 1 | 534 | |||
2 | 7 | 2 | 34 | |||
3 | 22 | 3 | 65 | |||
4 | 2 | 76 | 7 | |||
5 | 65 | 5 | 52 | |||
6 | 867 | 6 | 5 |
首先,先在 E1
输入公式 =ROWS(A1:C6)
记录范围的行数,在 E2
输入公式 =COLUMNS(A1:C6)
记录范围的列数。
反转单列
先尝试反转 A1:A6
这一单列。主要思路是让第一个单元格的值变成第六个单元格的值,第二个单元格的值变成第五个单元格的值,以此类推。也就是实现一个
- 1 -> 6
- 2 -> 5
- 3 -> 4
- 4 -> 3
- 5 -> 2
- 6 -> 1
的映射。该映射可以通过 size-i+1
来实现,其中 size
是列的长度,i
是每一个值的索引。此例中 size
是 6,当 i
为 3 时,6-3+1
是 4,其他同理。
有了这个索引的映射,我们就可以通过 INDEX
函数来将索引转成值了。再加上 MAP
函数,就可以反转单列了。
在 F1
输入公式 =MAP(SEQUENCE(E1, 1, 1, 1), LAMBDA(x, INDEX(A1:A6, E1-x+1, 1)))
,
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 53 | 1 | 534 | 6 | 867 | |
2 | 7 | 2 | 34 | 3 | 65 | |
3 | 22 | 3 | 65 | 2 | ||
4 | 2 | 76 | 7 | 22 | ||
5 | 65 | 5 | 52 | 7 | ||
6 | 867 | 6 | 5 | 53 |
按行反转
上例中我们只反转了单列,如果我们想把 A1:C6
这个范围按照行来反转呢,比如,第一行变第六行,第二行变第五行等等。
我们用一个新函数 CHOOSEROWS
。该函数可以在一定范围内按照行索引选择多个行并重组,具体可以查看官方文档。
此处我们把 F1
的公式换为 =MAP(SEQUENCE(E1, 1, 1, 1), LAMBDA(x, CHOOSEROWS(A1:C6, E1-x+1)))
,
A | B | C | D | E | F | G | H | |
---|---|---|---|---|---|---|---|---|
1 | 53 | 1 | 534 | 6 | 867 | 6 | 5 | |
2 | 7 | 2 | 34 | 3 | 65 | 5 | 52 | |
3 | 22 | 3 | 65 | 2 | 76 | 7 | ||
4 | 2 | 76 | 7 | 22 | 3 | 65 | ||
5 | 65 | 5 | 52 | 7 | 2 | 34 | ||
6 | 867 | 6 | 5 | 53 | 1 | 534 |
但是因为 CHOOSEROWS
这个函数也支持传入数组作为参数,因此我们可以传入形如 {6,5,4,3,2,1}
这样的数组来反转行。
因此把 F1
的公式换为 =CHOOSEROWS(A1:C6, SEQUENCE(E1, 1, E1, -1))
可以得到同样的效果。
实际上,单列也可以使用 CHOOSEROWS
,所以 =CHOOSEROWS(A1:A6, SEQUENCE(E1, 1, E1, -1))
可以更简洁地反转单列。
实际上,更加推荐使用 CHOOSEROWS
加 SEQUENCE
来反转,因为更加简洁。
行列全反转
按列反转的思路跟按行反转类似,只不过函数换为 CHOOSECOLS
以及 SEQUENCE
要生成的是一行数据而不是一列数据。
所以,如果要同时把行和列都反转,我们可以把 F1
的公式换为
=CHOOSECOLS(CHOOSEROWS(A1:C6, SEQUENCE(E1, 1, E1, -1)), SEQUENCE(1, E2, E2, -1))
,
A | B | C | D | E | F | G | H | |
---|---|---|---|---|---|---|---|---|
1 | 53 | 1 | 534 | 6 | 5 | 6 | 867 | |
2 | 7 | 2 | 34 | 3 | 52 | 5 | 65 | |
3 | 22 | 3 | 65 | 7 | 76 | 2 | ||
4 | 2 | 76 | 7 | 65 | 3 | 22 | ||
5 | 65 | 5 | 52 | 34 | 2 | 7 | ||
6 | 867 | 6 | 5 | 534 | 1 | 53 |
其实就是先反转每一行,再反转每一列。