跳到主要內容跳到頁尾

TRANSPOSE、FLATTEN、ARRAY_CONSTRAIN:轉置、攤平與截取前幾列

5 分鐘閱讀Lv.3 中級摘要與日期

整理三個處理陣列形狀的老函式:TRANSPOSE 列欄互換、FLATTEN 把多個範圍攤平成單欄、ARRAY_CONSTRAIN 只留左上角幾列幾欄。附語法、結果順序、被擋住的 #REF!,以及和 TOROW、TOCOL、SORTN 怎麼分工。

發布 更新

文章目錄

資料的方向放反了,想把橫的轉成直的;或是一張二維表格,想攤成一欄再拿去 JOIN、UNIQUE;又或是排序完只想留前三名。這三個老牌函式 TRANSPOSE、FLATTEN、ARRAY_CONSTRAIN 各管一件事,我自己用得最多的是 TRANSPOSE,其次是 FLATTEN,ARRAY_CONSTRAIN 算是冷門的。

怎麼選

我想要用這個結果的形狀
列變欄、欄變列TRANSPOSE列數與欄數對調
把一個或多個範圍排成單欄FLATTEN一欄
只留左上角 N 列 M 欄ARRAY_CONSTRAINN 列 M 欄

要攤成單列、要略過空白格、或要指定依欄還是依列掃描,改用 TOROW、TOCOL;要挑特定幾列幾欄,是 CHOOSEROWS、CHOOSECOLS。

下面的例子用這張銷量表,放在 A1:C4:

ABC
1品項台北店台中店
2蘋果紅茶378
3烏龍奶茶11264
4青茶2153

公式都放在 E1,結果往右、往下展開。

轉置

TRANSPOSE

把範圍的列與欄互換,原本的第一列變成第一欄。

語法:

  • 陣列或範圍:要轉置的資料,可以是儲存格範圍,也可以是別的函式算出來的陣列。
Google 試算表公式
fx

A1:C4 是 4 列 3 欄,轉置後變成 3 列 4 欄

=TRANSPOSE(A1:C4)

先想像一下:第一列「品項、台北店、台中店」會直立起來,變成 E 欄。來看看結果,E、F、G、H 是欄名:

EFGH
1品項蘋果紅茶烏龍奶茶青茶
2台北店3711221
3台中店86453

注意事項:

  • 轉出來的是公式結果,不是複製過去的值,原資料改了,這邊跟著變。
  • 展開的範圍有東西擋住(例如 G2 已經有字),會得到 #REF!,提示是「系統未展開陣列結果,以免覆蓋 G2 中的資料。」,清掉那格就好。
  • 最常搭配的是 SPLIT:SPLIT 一定是橫著拆,想要直的就在外面包 TRANSPOSE,範例在 SPLIT、TEXTJOIN 與 JOIN。

攤平

FLATTEN

把一個或多個範圍的所有值排成單一欄。

語法:

  • 範圍1:要攤平的範圍,可以是二維。
  • 範圍2:選填,後面可以接更多範圍,會接在前一個後面。

先攤平整張表:

Google 試算表公式
fx

把 A1:C4 的 12 格攤成一欄

=FLATTEN(A1:C4)

結果是一列一列由左到右讀,讀完一列再讀下一列:

E
1品項
2台北店
3台中店
4蘋果紅茶
537
68
7烏龍奶茶
8112
964
10青茶
1121
1253

如果要依欄由上到下讀,TOCOL 有參數可以選。Excel 也有對應的函式:Microsoft 365/Excel 2024 的 TOCOL、TOROW 可以攤平,TRANSPOSE 則是 Excel 本來就有的函式。

多個範圍會依序接起來。把兩家店的銷量接成一欄:

Google 試算表公式
fx

先接台北店 B2:B4,再接台中店 C2:C4

=FLATTEN(B2:B4, C2:C4)

結果是 37、112、21、8、64、53。

我最常拿它來治 JOIN:JOIN 只吃一維,二維範圍先攤平再接:

Google 試算表公式
fx

把 B2:C4 攤平後用頓號接起來

=JOIN("、", FLATTEN(B2:C4))

結果是 37、8、112、64、21、53,同樣是逐列的順序。

空白格不會被丟掉,會留成空白的一格。想去掉空白,外面再包一層 FILTER:。這邊用 TOCOL 的忽略參數比較短,要多寫幾次範圍的時候我會換過去。

截取

ARRAY_CONSTRAIN

只保留陣列左上角的前幾列、前幾欄。

語法:

  • 輸入範圍:要截取的範圍或陣列。
  • 列數:從上面數起要留幾列。
  • 欄數:從左邊數起要留幾欄。

先拿剛剛那張表試試,留前 2 列 2 欄:

Google 試算表公式
fx

A1:C4 只留左上角 2 列 2 欄

=ARRAY_CONSTRAIN(A1:C4, 2, 2)

結果:

EF
1品項台北店
2蘋果紅茶37

它真正好用的地方,是接在排序後面取前幾名。這是另一張單店的杯數表,放在 A1:B8:

AB
1品項杯數
2蘋果紅茶38
3烏龍奶茶112
4蘋果綠茶8
5青茶64
6桂花烏龍21
7鮮奶茶41
8冬瓜檸檬19

我想看杯數前三名,先照杯數由大到小排,再留 3 列 2 欄:

Google 試算表公式
fx

SORT 依第 2 欄遞減排序,ARRAY_CONSTRAIN 留前 3 列 2 欄

=ARRAY_CONSTRAIN(SORT(A2:B8, 2, FALSE), 3, 2)

放在 D1,結果:

DE
1烏龍奶茶112
2青茶64
3鮮奶茶41

SORT 的參數看 SORT 與 UNIQUE。

如果列數、欄數比範圍還大,會直接回傳整個範圍,不會補空白也不會報錯。

取前幾名我現在多半直接用 SORTN,一個函式完成排序加截取:,結果同樣是那三列。ARRAY_CONSTRAIN 的好處是它不管前面是什麼函式,任何陣列都可以截,所以還是有機會用到。

試著把這三個函式串在一起:先 SORT、再 ARRAY_CONSTRAIN、最後 TRANSPOSE,看前三名橫過來是什麼樣子吧!

我是喜特先生,Mr. Sheet,我們下個教學見!

分享:
#TRANSPOSE#FLATTEN#ARRAY_CONSTRAIN#陣列
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。