Google Apps Script スプレッドシート

Google Apps ScriptでDay.jsライブラリを使ってみた

Google Apps ScriptでDay.jsライブラリを使ってみた

新しく作ったスプレッドシートの「Google Apps Script」で日付処理が必要になりました。
「Google Apps Script」の日付処理は「JavaScript」の構文を使うのですが、これが意外とめんどくさいのです。
そこで、登場するのがライブラリ。日付処理を簡素化してくれるものとして「Moment.js」を愛用しています。

ところが、ライブラリに「Moment.js」を追加しようとしたら、できなくなっていました。
Google Apps ScriptでDay.jsライブラリを使ってみた
公式サイトを確認すると、メンテナンスモードになったとのこと。2020年9月15日にTwitterで発表されていました。

代替手段のひとつとして「Day.js」ライブラリが挙げられています。
調べてみると「Moment.js」と似たような使い方ができるとのこと。
早速試してみました。

 

どのように準備するの?

スクリプトエディタのライブラリに「Day.js」を追加するだけです。

step
1
「ライブラリ」の横にある「+」マークを押す

Google Apps ScriptでDay.jsライブラリを使ってみた

step
2
スクリプトIDを入力して、検索ボタンを押す

Day.jsのスクリプトID

1ShsRhHc8tgPy5wGOzUvgEhOedJUQD53m-gd8lG2MOgs-dXC_aCZn9lFB

Google Apps ScriptでDay.jsライブラリを使ってみた

step
3
追加ボタンをクリックする

Google Apps ScriptでDay.jsライブラリを使ってみた

執筆時のバージョンは「v1.9.3」のようです。

 

コードの書き方は?

現時点の日時を取得する

dayjs.dayjs()

日付情報を取得する

年を取得
dayjs.dayjs().year()

月を取得(戻り値は0 ~ 11、0が1月)
dayjs.dayjs().month()

日を取得
dayjs.dayjs().date()

曜日を取得(戻り値は0 ~ 6、0は日曜日)
dayjs.dayjs().day()

日付情報をフォーマット指定して取得
dayjs.dayjs().format('YYYY/MM/DD')

日付情報を指定する

年を指定する
dayjs.dayjs().year(2021)

月を指定する
dayjs.dayjs().month(0) ※0は1月

日を指定する
dayjs.dayjs().date(1)

文字列をパースして指定する
dayjs.dayjs('2021-01-01')

日付の加減

1年後
dayjs.dayjs().add(1,'year')

1カ月後
dayjs.dayjs().add(1,'month')

1週間(7日)後
dayjs.dayjs().add(1,'week')

1日後
dayjs.dayjs().add(1,'day')

1年前
dayjs.dayjs().subtract(1,'year')

1カ月前
dayjs.dayjs().subtract(1,'month')

1週間(7日)前
dayjs.dayjs().subtract(1,'week')

1日前
dayjs.dayjs().subtract(1,'day')

曜日を日本語化する

コード実行後に作成されるDayjsオブジェクト全てに適用
dayjs.dayjs.locale('ja')

1つのDaysオブジェクトだけに適用
dayjs.dayjs().locale('ja')

毎月20日の日付を取得する

function myFunction() {
  let MyDate = dayjs.dayjs('2021-1-20');
  for (let i = 0; i < 12; i++){
    console.log(MyDate.month(i));
  }
}

日本語化のテスト

function myFunction2() {
  const Date1 = dayjs.dayjs('2021-3-31').format('ddd');
  dayjs.dayjs.locale('ja');
  const Date2 = dayjs.dayjs('2021-3-31').format('ddd');
  const Date3 = dayjs.dayjs('2021-3-31').locale('en').format('ddd');
  const Date4 = dayjs.dayjs('2021-3-31').format('ddd');
  console.log(Date1); // ⇒「Wed」※dayjs.locale('ja')前のため
  console.log(Date2); // ⇒「水」※dayjs.locale('ja')後のため
  console.log(Date3); // ⇒「Wed」※個別に.locale('en')と指定しているため
  console.log(Date4); // ⇒「水」※dayjs.locale('ja')後のため
}

その他のメソッドや詳しい解説は、APIリファレンスをご覧ください。

 

Moment.jsを使う裏技!?

新しく作ったスプレッドシートでも、「Moment.js」を使うことができます。
やり方は、スクリプトエディタで「以前のエディタ」に戻って「Moment.js」ライブラリを追加し、「新しいエディタ」に戻ればOK。
今後の動作保証はないので、あくまで応急処置として使える小ネタです。

 

「Moment.js」から「Day.js」への移行に一括置換を使ってはいけない!?

どちらのライブラリも同じようなコードの書き方をするので、以前書いたものを「moment」から「dayjs」に一括置換することが思いつきます。
しかし、それは注意が必要です。
理由は、「Moment.js」はミュータブル(mutable)、「Day.js」はイミュータブル(immutable)と違うから。
具体例を挙げてみましょう。

function myFunction3() {
  const Date1 = Moment.moment("2021-3-31");
  const Date2 = Date1.add(1, "day");
  console.log(Date1.format("YYYY/MM/DD"));   // ⇒ 2021/04/01
  console.log(Date2.format("YYYY/MM/DD"));   // ⇒ 2021/04/01
}

「Moment.js」だと、変数「Date1」まで変更されてしまいます。これがミュータブルの仕様です。
一方、「Day.js」だと、こうなります。

function myFunction4() {
  const Date1 = dayjs.dayjs("2021-3-31");
  const Date2 = Date1.add(1, "day");
  console.log(Date1.format("YYYY/MM/DD"));   // ⇒ 2021/03/31
  console.log(Date2.format("YYYY/MM/DD"));   // ⇒ 2021/04/01
}

変数「Date1」に変更はありません。
.add()や.startOf()など日付操作しているコードを一括置換する場合は、論理エラーになってないかを十分にチェックすると良いでしょう。

 

まとめ

「Moment.js」がメンテナンスモードに入り、代わりに「Day.js」ライブラリを使えることが分かりました。
他にも良い方法があるかもしれませんが、「Moment.js」を使い慣れた私には「Day.js」がちょうど良いようです。

-Google Apps Script, スプレッドシート
-, , , , , , , , , ,