【Google Apps Script】シートから一致する日付をしぼり込む方法①

記事
コラム
スプレッドシートを扱っていると、高い頻度で日付を扱う場面がありますよね(´∀`*)
ですが、日付の操作って正直、かなりややこしくないですか……?
そもそもJavaScriptって、もともと日付の操作をするのがとてもややこしいんです。
そこでよく使われるのが、ライブラリの「Moment.js」……なのですが、GASでは使えないんですね(ほんとはあるけど随分前に更新が止まっているので使わないほうがよい)。

今回は、シートの中から特定の日付だけを絞り込むという、単純だけれど奥が深い方法を連載で紹介していきます♪

例えば、以下のようなシートがあったとします。

スクリーンショット 2021-02-01 003337.png


なにやら勤怠管理のシートのようですね。余談ですが簡単に勤怠管理ができるスプレッドシートなどを出品しておりますのでご興味があればご覧ください(笑)


ではこのシートから、1月3日~15日までの日付を絞り込むにはどのようにしたらいいでしょうか?

さて、まずは最も基本的な部分ですが、JavaScriptで日付を扱うにはDateオブジェクトを使います。
使い方は new Date() です。

const today = new Date();

とすれば、変数todayには今日の日付が入ることになります。
(実はその表現は誤りで、現在の日時が入っていると言わなければなりません。後述します)
さて、この記事を書いている現在は1月31日です。だとすれば、画像の26行目の日付と同じですね!
==で結ぶことができるのではないでしょうか?やってみましょう!

function testDateFunction(){
  const ss = SpreadsheetApp.getActiveSheet(); //現在のシートを取得
  const today = new Date(); //本日の日時を変数todayに入れる
  const cell = ss.getRange('A26').getValue(); //A26セルの値を変数cellに入れる

  console.log(today==cell);
}

もしtodayとcellが一致すれば、ログにはtrueが表示されているはずです。どれどれ……?

スクリーンショット 2021-02-01 000030.png


あれーー!! 一致していない!? なんで???

先ほど変数todayには「本日の日付」ではなく、「現在の日時」が格納されていると書きました。
それぞれの変数の中身を確認してみましょう。

function testDateFunction(){
  const ss = SpreadsheetApp.getActiveSheet(); //現在のシートを取得
  const today = new Date(); //本日の日時を変数todayに入れる
  const cell = ss.getRange('A26').getValue(); //A26セルの値を変数cellに入れる

  console.log(today);
  console.log(cell);
}

スクリーンショット 2021-02-01 000916.png

どうでしょうか? 一致していますか? ……違いますよね。
変数todayの方では、2021の後ろの時刻が00:08:21になっています。
日付は一致していても、その後ろの時、分、秒、さらに言えばミリ秒単位で差があれば、==で結んでも、これでは一致するはずがないですよね~。

では、時刻を0時にして比較してみたら一致するんじゃないでしょうか?
todayの日付のまま、時刻だけ0時にするにはsetHours()というメソッドを使います!

today.setHours(0,0,0,0);

こうすることで、todayの日付はそのまま、時刻は0時0分0秒0ミリ秒となりました。
あらためて==で比較して、ログを見てみましょう!

function testDateFunction(){
 const ss = SpreadsheetApp.getActiveSheet();
 const today = new Date();
 today.setHours(0,0,0,0);
 const cell = ss.getRange('A26').getValue();

 console.log(today);
 console.log(cell);
 console.log(today == cell);
}

あれ、やっぱり一致しない(゚Д゚;)
スクリーンショット 2021-02-01 220956.png

実は、Dateオブジェクト同士を比較した場合は「同じインスタンスがどうか」を比較していることになるんです。
決して「同じ日付の比較」ではなくインスタンスの比較なので、たとえ00:00:00の部分が一致していたとしても、この場合は==で結んだ時にTrueにはならないんです(;´Д`)
最初は難しく覚える必要はないですが、ざっくりと「オブジェクト型での日付の比較はできないんだな~」くらいに頭の片隅に入れていただければ問題ないかと思います!

では、2つの日付を==で一致させるにはどうしたらいいのでしょうか?

日付の比較をする際、一般的にはgetTime()メソッドを使用します。getTime()メソッドはとある起点からの経過ミリ秒数を取得するメソッドです。
(とある起点ってなんぞやと気になるかもしれませんが、あまり突っ込むとややこしくなりますので次回に回します)

では、次回はそのgetTime()メソッドについて書いていきます~!
お読みいただきありがとうございました<(_ _)>

次回の記事はコチラ↓

出品サービス↓

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す