(Gスプレッドシート)日付がいくつあるかカウントする方法

 Googleスプレッドシートで、日付の値が(いつの日付かに関わらず)いくつあるかカウントする方法についてです。
 Googleスプレッドシートでは関数で数値と日付を区別することができるので、関数でカウントすることができます。

日付の文字列を含めてカウントする方法

COUNT/DATEVALUE関数を使う方法

 画像ではB3:B13の範囲に対象となる数値や日付、文字列が入力されています。
 D3セルに数式を入力し、これらのうち日付であるものだけをカウントしています。日付の文字列(B11セル。「'2015/3/18」と入力)もカウントされるので結果は「4」となります。

 D3セル

=COUNT(ARRAYFORMULA(DATEVALUE(B3:B13)))

 DATEVALUE関数は本来、日付の文字列をシリアル値(数値)に変換するという関数で、Excelだと日付の文字列以外を引数にするとエラーになります。
 しかしGoogleスプレッドシートの場合は普通の(文字列でない)日付もエラーにならないので、結果的にエラーにならなかったものをカウントすれば日付をカウントすることができます。複数セルの値を一括変換するためのARRAYFORMULAを忘れないようにしてください。



 なお「ARRAYFORMULA(DATEVALUE(B3:B13))」の部分だけを実行すると次のようになります。
 これで上記の説明の意味が分かると思います。

COUNTIF/MAP/ISDATE関数を使う方法

 まずは失敗例です。
 GoogleスプレッドシートではISDATE関数で日付かどうか判定できるのでこれを使ってカウントできないか、と思うのが自然です。
 しかし次のように「=COUNTIF(ARRAYFORMULA(ISDATE(B3:B13)),TRUE)」とすると結果は「0」となります。

 これはISDATE関数とARRAYFORMULA関数を併用しても1つしか値が得られない(最初のB3セルに対応する「FALSE」しか返ってこない)という謎仕様のためです。結果的には上記のようにDATEVALUE関数を使うのが簡単です。



 ただしISDATE関数にこだわるとすれば次のようになります。日付の文字列(B11セル)もカウントされるので結果は「4」となります。

 D3セル

=COUNTIF(MAP(B3:B13,LAMBDA(x,ISDATE(x))),TRUE)

 MAP/LAMBDA関数を使いB3:B13の範囲にxという名前を付け、その1セルごとにISDATE関数を実行しています。これによりすべてのセルに対する判定結果を一括して得ています。あとはその結果にCOUNTIF関数を適用してTRUEの数を数えることで日付の数をカウントしています。

日付の文字列を含めないでカウントする方法

COUNTIFS/ISDATE/ISTEXT関数を使う方法

 次の画像では日付のうち文字列として記録されているものを除いてカウントしています。
 B11セルの値はカウントされないので結果は「3」となっています。

 D3セル

=ARRAYFORMULA(COUNTIFS(ISNUMBER(DATEVALUE(B3:B13)),TRUE,ISTEXT(B3:B13),FALSE))

 「日付とみなすことができ、かつ文字列ではない値をカウントする」という式です。
 ARRAYFORMULAをCOUNTIFSの内側(第1,第3引数)に配置すると2回必要になりますが、1回で済むように外側に持ってきています。