簡單的說,如果該函式的該參數,原本就被設計成會接收一個陣列(Array; Multiple value),那麼不會發生任何不尋常的事情,它只會如常地進行運算。例如:函式SUM()就是這種類型,它的每個參數原本就預期可能會是個陣列。
但是,如果該函式的該參數,原本被設計成只能接受一個單值(Single value; Scalar value),結果卻收到一個陣列,那麼它會先進行交集(Intersection)運算,試著從該陣列中找出一個單值,以便維持該函式原本的運作。
而尋找交集的方法,則與該陣列的類型(儲存格範圍、函式傳回陣列、直接描述陣列)、陣列的形狀(一維(單列、單欄)、二維)、以及(參考該陣列的)公式所在的儲存格位置,這三個因素相關。
1. 儲存格範圍(Cell Range)
1.1 單列陣列(One Row Array)
如果傳入的陣列的形狀,是只有一列資料的一維陣列,那麼交集的方法,就是使用公式所在儲存格的欄位址,與該陣列範圍進行交集。如果找到交集,就以該交集的元素值傳入函式進行運算。如果找不到交集,則會傳回錯誤(#VALUE!),訊息是「找不到陣列值」 。
下面這個例子中,儲存格A4到D4中的公式都相同,都是「=$A$1:$C$1」,也就是參考到A1:C1這個範圍的最簡單公式。這個範圍只涵蓋一列的範圍,也就是所謂的單列陣列。
於是,儲存格A4中的公式,會去尋找該公式所在儲存格(也就是A4)的欄位址(也就是欄A)與指定陣列(也就是A1:C1)的交集。結果是有交集,交集的位置是A1,所以就得到儲存格A1的值(也就是11)。
同理,欄B與範圍A1:C1的交集,是儲存格B1,得到值12。欄C與範圍A1:C1的交集,是儲存格C1,得值13。而欄D與範圍A1:C1沒有任何交集,所以儲存格D4中的公式,儘管與前面幾個儲存格完全相同,但是只能得到錯誤的結果(#VALUE!)。
換句話說,透過這種「自動尋找交集儲存格」的機制,可以達成「撰寫相同的公式,卻能各自參考到不同儲存格」的效果。
1.2 單欄陣列(One Column Array)
與單列陣列類似,只不過尋找交集時改用列位址。也就是說,如果傳入的陣列的形狀,是只有一欄資料的一維陣列,那麼交集的方法,就會使用公式所在儲存格的列位址,與該陣列範圍進行交集。同樣的,如果找不到交集儲存格,會得到錯誤值(#VALUE!)。
1.3 二維陣列(2D Array)
那如果傳入陣列的形狀,不是只有一列、或只有一欄資料的一維陣列,而是多列多欄的二維陣列呢?那麼,很抱歉,因為找不到唯一的一個交集儲存格(不管是用公式所在儲存個的欄位址或列位址,都會找到多個交集點),所以通通都只會得到錯誤值(#VALUE!)。
1.4 跨工作表陣列(Across Sheet)
關於與儲存格範圍的交集,還有一個補充規則。就是以上這些交集規則,是可以跨越不同工作表(Sheet)來運作的。
也就是說,公式可以與其他工作表中的範圍,進行交集。
2. 函式傳回陣列 (Function Returned Array)
2.1
函式傳回的陣列(Function Returned Array),因為不具有可以與公式所在儲存格可以匹配的欄位址、列位址等資訊,所以交集(Intersect)規則退化成「固定取用陣列最左上角元素」。也就是說,與公式所在儲存格的位置,是沒有關聯的。2.2 直接描述陣列(Literal Array)
直接描述的陣列(Literal Array),其實就是函式(ARRAY_LITERAL())傳回的陣列,當然也不具有可以與公式所在儲存格可以匹配的欄位址、列位址等資訊,所以交集(Intersect)規則也退化成「固定取用陣列最左上角元素」。所以,與公式所在儲存格的位置,也是沒有關聯的。相關文章
1. Google Sheets: Array Lesson 1: 建立陣列 (Creating an array)2. Google Sheets: Array Lesson 3: 陣列-維持-多值 (Array-Keep-Multiple value)
3. Google Sheets: Array Lesson 4: 陣列-擴展 (Array-Expansion)
參考資料
1. Open Formula: Non-Scalar Evaluation (aka 'Array expressions')2. Apache OpenOffice: Documentation/How Tos/Using Arrays
3. LibreOffice: Calc: Array Functions