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 |
其实就是先反转每一行,再反转每一列。