Googleスプレッドシートの配列数式でAND,OR関数がバグる件の対処

# 概要
Googleスプレッドシートの[ARRAYFORMULA](https://support.google.com/docs/answer/3093275?hl=ja#)関数内で[AND](https://support.google.com/docs/answer/3093301),[OR](https://support.google.com/docs/answer/3093306)などの条件判定関数を使うと意図したとおりの結果になりません。
これは、**ORは足し算、ANDは掛け算に変える**ことで解決できます。

`=ARRAYFORMULA(IF(OR(ISBLANK(A2:A),ISBLANK(B2:B)),"",A2A*B2B)) `
 　　:arrow_down: 　:arrow_down:　:arrow_down:
`=ARRAYFORMULA(IF(ISBLANK(A2:A)+ISBLANK(B2:B),"",A2A*B2B)) `

`=ARRAYFORMULA(IF(AND(ISBLANK(A2:A),ISBLANK(B2:B)),"",A2A*B2B)) `
　　:arrow_down:　:arrow_down:　:arrow_down:
`=ARRAYFORMULA(IF(ISBLANK(A2:A)*ISBLANK(B2:B),"",A2A*B2B)) `

# 説明
簡単な実例で説明しましょう。

## ORの例
下記のようなスプレッドシートがあり、D2～D6セルにはそれぞれ合計を計算する数式が入っています。
（D2:`=B2*C2`, D3:`=B3*C3`, D4:`=B4*C4`, D5:`=B5*C5`, D6:`=B6*C6`）
![table0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/eac4202b-42cc-bb9b-c2ce-8607cbcdcf93.jpeg)
ARRAYFORMULAを使えば、下記の様に書き換えた数式を**D2セルにのみ**入れるだけで、D2～D6に結果が入ります。
`=ARRAYFORMULA(B2:B6*C2:C6)`

もちろんB6とかC6の部分を書き換えてもっと広い範囲に適用することも出来ます。
例えば以下の様に書けば、シートの一番下まで範囲を拡張できます。
`=ARRAYFORMULA(B2:B*C2:C)`
![table0b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/f5b96d8f-6851-b7ae-8677-28597be6cb1b.jpeg)
でもテーブルをはみ出して下まで０が続くのはみっともないですね・・・

こういう時（ARRAYFORMULA抜きで考えるなら）
IF関数を使ったこんな式を思いつきますよね。
`=IF(OR(ISBLANK(B2),ISBLANK(C2)),"-",B2*C2)`
![table1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/d4ef3d6e-c120-a425-a118-4d1a315eca2e.jpeg)
なのでこれを同様にARRAYFORMULA関数を使って以下の様に書き換えてみると
`=ARRAYFORMULA(IF(OR(ISBLANK(B2:B6),ISBLANK(C2:C6)),"-",B2:B6*C2:C6))`
![table2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/33f90aa4-46d5-1a25-79bb-0819d625be78.jpeg)
・・・おかしな結果になってしまいました。

そこで冒頭に書いたように**OR関数を足し算に書き替え**てみます。
`=ARRAYFORMULA(IF(ISBLANK(B2:B6)+ISBLANK(C2:C6),"-",B2:B6*C2:C6))`
**ご覧の通り！！**
![table3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/2f3344fa-d4cb-22e7-52c2-16781c5f83e7.jpeg)
意図通りの結果が表示されました。

## ANDの例
同じような表でD2～D6セルにはそれぞれ合計を計算する数式が入っています。
（D2:`=IF(AND(ISBLANK(B2),ISBLANK(C2),"-",B2+C2`,
...,D6:`=IF(AND(ISBLANK(B6),ISBLANK(C6),)"-",B6+C6`）
![table4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/12366c5a-7b0c-71ed-fe86-bce5e2524c5e.jpeg)
これを単純にARRAYFORMULAで以下の様に置き換えてみると
`=ARRAYFORMULA(IF(AND(ISBLANK(B2:B6),ISBLANK(C2:C6)),"-",B2:B6+C2:C6))`
![table4b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/efdc6ca7-a117-fd58-5996-2310be895cb7.jpeg)
'-' 表示になって欲しいD6セルが0になってしまっています。

そこで冒頭に書いたように**AND関数を掛け算に書き替え**てみます。
`=ARRAYFORMULA(IF(ISBLANK(B2:B6)*ISBLANK(C2:C6),"-",B2:B6+C2:C6))`
**ご覧の通り！！**
![table5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/47eed433-d967-113c-9dc8-7725344fbcf6.jpeg)
意図通りの結果が表示されました。

# 解説

## なぜAND,ORが使えない？
なぜARRAYFORMULA関数の中でAND,OR関数を使うとうまく行かないのかは、**正直私にもよくわかりません。**ごめんなさい。
ARRAYFORMULA関数はなかなか気難しいやつで、他にも中で使うと意図通りにならない関数がいっぱいあるようです。推測するに、**もともと配列（＝セル範囲）を引数として受け取れる関数**が中にあると、先に中の関数でセル範囲が解釈されてしまって、ARRAYFORMULAの展開対象にならないってところかなと思いますが。

※AND,ORはセルに真偽値が入っているなら、例えば`OR(A1,B1,A2,B2)`の代わりに`OR(A1:B2)`と書いても同じ結果になる

## なぜ掛け算、足し算で代用できる？
プログラミング齧ったことある人なら、「**内部ではTRUE=1,FALSE=0で表現されてる**」って聞けば（いや聞く前から）ピンとくるでしょう。
ここでは、そうじゃない人のために少しだけかみ砕いて説明してみます。

まず大前提として、繰り返すとスプレッドシートの内部ではTRUE=1,FALSE=0として扱われています。
それに加えて、**0以外の数値はTRUEの一種であると見做される**という法則があります。

さてANDはA,B,C...の条件のどれか一つでも**FALSE**だったら**FALSE**になる関数ですね。
これを1/0で置き換えると「A,B,C...どれか一つでも**0**だったら**0**に」なればいいんです。
だから `A*B*C*...` 掛け算で置き換えることが出来ます。

一方ORはA,B,C...の条件のどれか一つでも**TRUE**だったら**FALSEじゃない**関数ですね
これを1/0で置き換えると「A,B,C...どれか一つでも**1**だったら**0以外**に」なればいいんです。
だから `A+B+C+...` 足し算で置き換えることが出来ます。

こういう性質があるので、ANDは**論理積**、ORは**論理和**とそれぞれ呼ばれています。

# 参考
ARRAYFORMULA (公式)
https://support.google.com/docs/answer/3093275