0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google Apps Scriptで過去のある月から今月までの月初日をループで取得する

Posted at

はじめに

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行目でループの度に毎月異なる日付オブジェクトを生成して追加しています。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?