今回は、Google Apps Scriptで日付を表すDateオブジェクトの様々な操作方法について解説します。
Dateオブジェクトの使い方
現在日付を取得
var day = new Date(); // Tue Jul 25 2023 16:09:45
文字列で日付を設定
var day = new Date('1999/11/03'); // Wed Nov 03 1999 00:00:00
上記の例では年・月・日を指定しており、それ以降の部分は全て0になっています。指定することも可能です。
数値で日付を指定
var day = new Date(1999, 10, 3); // Wed Nov 03 1999 00:00:00
数値を引数にする場合、月は0始まりになります。
Dateオブジェクトから文字列へ変換
そのまま変換
var day = new Date(); // Tue Jul 25 2023 16:09:45
console.log(day.toString()); // "Tue Jul 25 2023 16:09:45 GMT+0900 (Japan Standard Time)"
フォーマットを指定して変換
var day = new Date(); // Tue Jul 25 2023 16:09:45
// 実行結果:1999/11/03
let dayStr = Utilities.formatString("%04d/%02d/%02d", 1999, 11, 3);
フォーマットを指定しての変換は、GASのUtilitiesクラスのformatStringメソッドを使います。C言語のsprintfのように使います。(フォーマットの詳細:https://ja.wikipedia.org/wiki/Printf)
参考:Apps Script>Class Utilities
日付の取得
年を取得:getFullYear
var day = new Date(); // Tue Jul 25 2023 16:09:45
console.log(day.getFullYear()) // 2023
月を取得:getMonth
var day = new Date(); // Tue Jul 25 2023 16:09:45
console.log(day.getMonth()) // 6 ※
※getMonthで取得した月の値は、0を基点とした数値です。
日を取得:getDate
var day = new Date(); // Tue Jul 25 2023 16:09:45
console.log(day.getDate()) // 25
n日後、nヶ月後、n年後の日付を取得
n年後の日付を取得
var day = new Date(); // Tue Jul 25 2023 16:09:45
day.setFullYear(day.getFullYear() + 1); // Thu Jul 25 2024 16:09:45 (1年後)
nヶ月後の日付を取得
var day = new Date(); // Tue Jul 25 2023 16:09:45
day.setMonth(day.getMonth() + 1); // Fri Aug 25 2023 16:09:45 (1ヶ月後)
n日後の日付を取得
var day = new Date(); // Tue Jul 25 2023 16:09:45
day.setDate(day.getDate() + 5); // Sun Jul 30 2023 16:09:45 (5日後)
月初・月末を取得
月初の日付を取得
var day = new Date(); // Tue Jul 25 2023 16:09:45
day.setDate(1); // Sat Jul 01 2023 16:09:45
月末の日付を取得
var day = new Date(); // Tue Jul 25 2023 16:09:45
day.setMonth(day.getMonth() + 1, 0); // Mon Jul 31 2023 16:09:45
setMonthメソッドでは、範囲外の値が渡されたときに自動で調整します。
上記の例では、月に1か月後を指定、日付に0を指定しています。日付は1~31が正常な範囲で、0の場合は1日のひとつ前、つまり先月の最終日に設定されます。この調整機能を利用して月末を取得しています。
Dateオブジェクトのループ
たとえば、以下のような日付のプルダウンを生成する際にループ処理を使います。
1ヶ月分ループ
let array = [];
// 当月の末日を取得
var endMonth = new Date(day.getFullYear(), day.getMonth() + 1, 0);
// 配列に当月日付を順に追加
for (let i = 0; i <= endMonth.getDate(); i++) {
// Dateを文字列に変換
let dayStr = Utilities.formatString("%04d/%02d/%02d", day.getFullYear(), day.getMonth() + 1, i +1);
// 配列に選択肢を追加
choices.push(day);
}
0はじまり、月末までループします。
本日+1ヶ月分ループ(月またぎが発生する場合)
let array = [];
// 当月の末日を取得
var endMonth = new Date(day.getFullYear(), day.getMonth() + 1, 0);
// 現在日付 +1ヶ月を取得
var nextMonth = new Date(day.getFullYear(), day.getMonth() + 1, day.getDate());
// 配列に当月日付を順に追加
for (let i = day.getDate(); i <= endMonth.getDate(); i++) {
// Dateを文字列に変換
let dayStr = Utilities.formatString("%04d/%02d/%02d", day.getFullYear(), day.getMonth() + 1, i);
// 配列に選択肢を追加
choices.push(dayStr);
}
// 配列に来月日付を順に追加
for (let i = 0; i < nextMonth.getDate(); i++) {
// Dateを文字列に変換
let dayStr = Utilities.formatString("%04d/%02d/%02d", nextMonth.getFullYear(), nextMonth.getMonth() + 1, i + 1);
// 配列に選択肢を追加
choices.push(dayStr);
}
本日日付が2023/07/25とすると、1ヶ月分ループさせる場合8/25までになります。この場合、
- 当月の月末日:2023/07/31
- 現在日付+1ヶ月:2023/08/25
をそれぞれ取得しておき、7/1~7/31まで・8/1~8/25までのループに分けます。
まとめ
今回は、Google Apps Script(GAS)でDateオブジェクトを操作する方法について解説しました。日付の操作はややこしい部分もありますが、使えるようになると様々な場面で役立つと思います。
記事を書くにあたり、JavaScriptのドキュメントを参考にしました。GASはJavaScriptをベースに作られたプログラミング言語であり、DateオブジェクトもGASに組み込まれています。以下にドキュメントのリンクを載せておきますので、日付の操作をする際に参考にしてみてください。
Date – JavaScript – MDN Web Docs – Mozilla
コメント