はじめに
Google Apps Scriptで過去のある月から今月までの評価データを取得するタスクを依頼されました。その際、過去のある月から今月までの月初日をループで取得する処理を書いたのですが、少し工夫が必要だったのでメモとして残しておこうと思います。
処理と解説
処理
function myFunction() { // 1行目
const currentDate = new Date(); // 2行目
currentDate.setDate(1); // 3行目
currentDate.setHours(0, 0, 0, 0); // 4行目
const yearDates = []; // 5行目
for (let d = new Date('2020/01/01'); d <= currentDate; d.setMonth(d.getMonth() + 1)) { // 6行目
const loopDate = new Date(d); // 7行目
yearDates.push(loopDate); // 8行目
} // 9行目
Logger.log(yearDates); // 10行目
}
結果
[
Wed Jan 01 00:00:00 GMT+09:00 2020,
Sat Feb 01 00:00:00 GMT+09:00 2020,
Sun Mar 01 00:00:00 GMT+09:00 2020,
Wed Apr 01 00:00:00 GMT+09:00 2020,
Fri May 01 00:00:00 GMT+09:00 2020,
Mon Jun 01 00:00:00 GMT+09:00 2020,
Wed Jul 01 00:00:00 GMT+09:00 2020,
Sat Aug 01 00:00:00 GMT+09:00 2020,
Tue Sep 01 00:00:00 GMT+09:00 2020,
Thu Oct 01 00:00:00 GMT+09:00 2020,
Sun Nov 01 00:00:00 GMT+09:00 2020,
Tue Dec 01 00:00:00 GMT+09:00 2020
]
処理を大まかに説明すると下記のようになります。
・2行目で現在の日付を取得。
・3~4行目で日付と時間を1日の0時に設定。
・5行目で今年の月初日を格納する配列yearDatesを初期化。
・6行目からのfor文で2020/01/01から今月までループし、8行目でyearDatesに今年の月初日を格納。
for文の中の7行目で新しく日付オブジェクトを生成しているのは、初期化式の変数dをyearDatesに追加すると、yearDatesに追加される値が全て、dのループの最終更新の値となるためです。
8行目を yearDates.push(d)
に書き換えると下記のような結果となります。
[
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021,
Fri Jan 01 00:00:00 GMT+09:00 2021
]
yearDatesに追加される値が全て、dの日付オブジェクトになるため、このような結果となります。
これを回避するため、7行目でループの度に毎月異なる日付オブジェクトを生成して追加しています。