3
3

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 1 year has passed since last update.

【0からGASを学ぶ】dayjs ライブラリを用いて、GASの日付操作で楽をしよう!

Last updated at Posted at 2023-12-04

はじめに

本シリーズでは、GASの始め方や便利な使い方、ビジネス活用まで幅広く解説します。シリーズをひと通り読んでいただければ、あなたもきっとGASマスターになれるはずです。

シリーズの対象者

  • そもそもGASってなんだかわからない
  • GASを学びたいけど何から始めればいいかわからない方
  • GASはわかり始めたけど、もっと活用ができないかと模索している方
  • とにかくGoogleが好き! という方

前回記事

dayjsライブラリを使いこなす

では早速始めていきましょう。【0からGASを学ぶ】シリーズの第13回は「dayjs ライブラリを用いて、GASの日付操作で楽をしよう!」です。前回、Googleフォームを用いた自動化の中で、dayjsライブラリを初めて登場させました。今後、このライブラリはヘビーに登場しますので、様々な日付操作をお伝えしておきたいと思います。

今回やること

  1. 現在日時および指定日時オブジェクトの生成
  2. 指定フォーマットの出力
  3. 各プロパティの取得、設定
  4. 日時の加算、減算
  5. 日時同士の差分を取得
  6. 日時同士の比較
  7. ちょっと便利な使い方

dayjsに関しては、以下ページにて各種使い方がまとまっていますが、GAS版のdayjsではすべてのメソッドが使用できるわけではないので、注意しましょう。代表的なものだとIsSameOrAfterなどがあげられます。これは、正確にはIsSameOrAfterdayjsのpluginメソッドであるためです。
Day.jsのAPI説明ページはこちらから

プログラム開始

GASエディタを開く

今回はdayjsライブラリを使い倒すことだけを目的としているため、スタンドアロン型でGASを記述していきます。こちらを参考にGASエディタを起動してください。では、どんどんいきますよ、ついてきてください。

STEP.0 dayjsライブラリを追加する

手順 イメージ
1 GASエディタの左メニューより「ライブラリ」横の「+」をクリックします。
2 表示されたダイアログ上のスクリプトID入力欄に以下IDを入力し、「検索」をクリックします。
1ShsRhHc8tgPy5wGOzUvgEhOedJUQD53m-gd8lG2MOgs-dXC_aCZn9lFB
3 検索結果が表示されたら、特段変更することなく「追加」をクリックします。

上記ダイアログのID欄にデフォルトは「dayjs」と表示されていますが、ここを変更すると、プロジェクト内でdayjsライブラリにアクセスするための文字列を変更できます。が、通常あまりやりません。

STEP.1 現在日時および指定日時オブジェクトの生成

Qiita013.gs
function Qiita013() {
  // 現在日時を取得する
  let now = dayjs.dayjs();

  // 指定日時を取得する
  let assignDate = dayjs.dayjs('2010/4/1 13:55:12');

  console.log(now);
  console.log(assignDate);
}
実行結果
17:23:17	お知らせ	実行開始
17:23:18	情報	{ '$L': 'en',
  '$d': Mon Dec 04 2023 17:23:18 GMT+0900 (Japan Standard Time),
  '$x': {},
  '$y': 2023,
  '$M': 11,
  '$D': 4,
  '$W': 1,
  '$H': 17,
  '$m': 23,
  '$s': 18,
  '$ms': 175 }
17:23:18	情報	{ '$L': 'en',
  '$d': Thu Apr 01 2010 13:55:12 GMT+0900 (Japan Standard Time),
  '$x': {},
  '$y': 2010,
  '$M': 3,
  '$D': 1,
  '$W': 4,
  '$H': 13,
  '$m': 55,
  '$s': 12,
  '$ms': 0 }
17:23:17	お知らせ	実行完

簡単ですね。ちなみに指定日付の場合は、/ではなく-とした場合でも問題なくオブジェクトを生成できます。

let assignDate = dayjs.dayjs('2010-4-1 13:55:12');

STEP.2 指定フォーマットの出力

次に、生成したオブジェクトをフォーマットを指定して、文字列として取得してみましょう。

の前に!!! STEP.1でお気づきの方もいると思いますが、実行結果を見ると

'$L': 'en'

となっています。これはロケールが英語となっていることを意味し、このままだと文字列を出力した際に曜日等が英語になってしまいます。そこでこれはお約束として、dayjsで日付操作を行う場合は、一番最初にロケール設定を日本に変更しましょう。といっても以下の1行を書くだけです。

dayjs.dayjs.locale('ja');

タイムゾーンはGMT+0900 (Japan Standard Time)となっているため、日付操作のみを行う場合は特段ロケールを変更する必要はありませんが、間違いが起こらないように必ず設定するようにしましょう。

それでは、気を取り直して、指定フォーマットでの出力を試したいと思います。

Qiita013.gs
function Qiita013() {
  dayjs.dayjs.locale('ja');
  // 現在日時を取得する
  let now = dayjs.dayjs();

  console.log(now.format('YYYY-MM-DD HH:mm:ss'));
  
  // 年
  console.log(now.format('YY'));
  console.log(now.format('YYYY'));

  // 曜日
  console.log(now.format('d'));
  console.log(now.format('dd'));
  console.log(now.format('dddd'));
}
実行結果
17:30:32	お知らせ	実行開始
17:30:33	情報	2023-12-04 17:30:33
17:30:33	情報	23
17:30:33	情報	2023
17:30:33	情報	1
17:30:33	情報	月
17:30:33	情報	月曜日
17:30:32	お知らせ	実行完了

生成したdayjsオブジェクトに対して、formatメソッドを用いてパラメタを指定すれば様々な情報を取得することができます。

パラメタ 出力例 説明
YY 23 2桁年表記
YYYY 2023 4桁年表記
M 1, 12 1桁月表記(2桁のものはもちろん2桁)
MM 01, 12 2桁月表記
MMMM 1月, 12月 日本語月表記
D 1, 31 1桁日表記
DD 01, 31 2桁日表記
d 0, 6 数値曜日表記(日曜日を0としてインクリメント)
dd 日本語曜日表記(短縮)
dddd 月曜日 日本語曜日表記
H 0, 23 1桁時間表記(24時間制)
HH 00, 23 2桁時間表記(24時間制)
h 0, 12 1桁時間表記(12時間制)
hh 00, 12 2桁時間表記(12時間制)
m 0, 59 1桁分表記
mm 00, 59 2桁分表記
s 0, 59 1桁秒表記
ss 00, 59 2桁秒表記
SSS 000, 999 ミリ秒表記
Z +09:00 協定世界時 (UTC) との差分
ZZ +0900 協定世界時 (UTC) との差分
A または a 午前, 午後 AM/PMの表記

ロケール設定がenの場合は、MMMdddも意味のあるものとなりますが、jaの場合は他のパラメタ設定と同一であるため、ここでは省略しています。

STEP.3 各プロパティの取得、設定

出力値としてはformatメソッドに似ていますが、各プロパティも取得してみましょう。

Qiita013.gs
function Qiita013() {
  dayjs.dayjs.locale('ja');
  // 現在日時を取得する
  let now = dayjs.dayjs();

  console.log(now.year());
  console.log(now.month());

  now = now.year(2021);
  console.log(now.year());
}
実行結果
17:32:47	お知らせ	実行開始
17:32:47	情報	2023
17:32:47	情報	11
17:32:47	情報	2021
17:32:47	お知らせ	実行完了

そりゃそうだろって結果ですが、dayjsでは各プロパティの取得も設定も非常に簡単に、直感的にできるのが魅力です。

直感的で明瞭ですが、プロパティの取得・設定時にはひとつ注意点があります。

now.day()
now.date()

なんとなく、dayと書くと日付が取得できそうですがこれは曜日(日曜日を0としてインクリメント)を取得します。日付はdate なのでお間違えの無いよう。

STEP.4 日時の加算、減算

次は、加算と減算です。それぞれaddおよびsubtract、そして各種パラメタ(y, M, d等)を用いることで加算・減算が可能です。それではプログラムを見てみましょう。

Qiita013.gs
function Qiita013() {
  dayjs.dayjs.locale('ja');
  // 現在日時を取得する
  let now = dayjs.dayjs();
  console.log(now.format('YYYY-MM-DD HH:mm:ss.SSS'));

  // 加算する
  console.log('1年加算  :' + now.add(1, 'y').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1月加算  :' + now.add(1, 'M').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1週加算  :' + now.add(1, 'w').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1日加算  :' + now.add(1, 'd').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1時間加算 :' + now.add(1, 'h').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1分加算  :' + now.add(1, 'm').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1秒加算  :' + now.add(1, 's').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1ミリ秒加算:' + now.add(1, 'ms').format('YYYY-MM-DD HH:mm:ss.SSS'));

  // 減算する
  console.log('1年減算  :' + now.subtract(1, 'y').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1月減算  :' + now.subtract(1, 'M').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1週減算  :' + now.subtract(1, 'w').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1日減算  :' + now.subtract(1, 'd').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1時間減算 :' + now.subtract(1, 'h').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1分減算  :' + now.subtract(1, 'm').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1秒減算  :' + now.subtract(1, 's').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1ミリ秒減算:' + now.subtract(1, 'ms').format('YYYY-MM-DD HH:mm:ss.SSS'));
}
実行結果
17:39:31	お知らせ	実行開始
17:39:32	情報	2023-12-04 17:39:32.359
17:39:32	情報	1年加算  :2024-12-04 17:39:32.359
17:39:32	情報	1月加算  :2024-01-04 17:39:32.359
17:39:32	情報	1週加算  :2023-12-11 17:39:32.359
17:39:32	情報	1日加算  :2023-12-05 17:39:32.359
17:39:32	情報	1時間加算 :2023-12-04 18:39:32.359
17:39:32	情報	1分加算  :2023-12-04 17:40:32.359
17:39:32	情報	1秒加算  :2023-12-04 17:39:33.359
17:39:32	情報	1ミリ秒加算:2023-12-04 17:39:32.360
17:39:32	情報	1年減算  :2022-12-04 17:39:32.359
17:39:32	情報	1月減算  :2023-11-04 17:39:32.359
17:39:32	情報	1週減算  :2023-11-27 17:39:32.359
17:39:32	情報	1日減算  :2023-12-03 17:39:32.359
17:39:32	情報	1時間減算 :2023-12-04 17:39:32.359
17:39:32	情報	1分減算  :2023-12-04 17:38:32.359
17:39:32	情報	1秒減算  :2023-12-04 17:39:31.359
17:39:32	情報	1ミリ秒減算:2023-12-04 17:39:32.358
17:39:32	お知らせ	実行完了

明確に加算:addメソッドと減算:subtractメソッドがありますが、addの引数にマイナスの数値を渡せば減算を行うことはできます。

これ以降に、パラメタはヘビーに登場しますので、一覧で示しておきます。といっても、そりゃそうだろってパラメタです。

パラメタ 短縮表記 説明
year y
month M
week w
day d
hour h 時間
minute m
second s
millisecond ms ミリ秒

STEP.5 日時同士の差分を取得

次は、差分の取得です。これにはdiffメソッドを用いますが、少々注意が必要なメソッドとなりますので、扱い方には気を付けましょう。何が注意なのか、これはプログラムから見ていきたいと思います。

Qiita013.gs
function Qiita013() {
  dayjs.dayjs.locale('ja');
  // 基準日時を生成する
  let assignDateFrom = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時を生成する
  let assignDateTo = dayjs.dayjs('2023/6/1 12:59:59');
  
  console.log(assignDateTo.diff(assignDateFrom, 'y'));
  console.log(assignDateTo.diff(assignDateFrom, 'M'));
  console.log(assignDateTo.diff(assignDateFrom, 'd'));
}
実行結果
17:46:14	お知らせ	実行開始
17:46:15	情報	0
17:46:15	情報	1
17:46:15	情報	60
17:46:15	お知らせ	実行完了

上記プログラムではあえて、基準日時の時刻に対して、比較日時の時刻を1秒前としました。このようにした場合、2023/4/12023/6/1で見れば2ヶ月の差分がありますが、厳密にミリ秒単位で評価をすると2ヶ月になりきっていないため、1ヶ月となります。そのため、diffメソッドを用いる際は、ミリ秒単位で評価しているということに注意しましょう。

あくまでも日付だけで評価をしたいとか評価する対象が明確な場合には、dayjsstartOfendOfメソッドを併せて用いるとよいです。例えば先ほどのような、基準日時と比較日時であろうと、

assignDateTo.startOf('day').diff(assignDateFrom.startOf('day'), 'M');

このようにすれば、互いの00:00:00時点の評価となり、2ヶ月の差分が取得できます。

STEP.6 日時同士の比較

次は、比較です。これにはisBeforeisSameisAfterの3つのメソッドを用います。まずは、プログラムから見ていきたいと思います。

Qiita013.gs
function Qiita013() {
  dayjs.dayjs.locale('ja');
  // 基準日時を生成する
  let assignDate = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時_前を生成する
  let assignDate_Bef = dayjs.dayjs('2023/2/1 13:00:00');
  
  // 比較日時_後を生成する
  let assignDate_Aft = dayjs.dayjs('2023/6/1 13:00:00');
  
  console.log(assignDate_Bef.isBefore(assignDate));
  console.log(assignDate_Aft.isBefore(assignDate));
  
  console.log(assignDate_Bef.isSame(assignDate));
  console.log(assignDate_Aft.isSame(assignDate));
  console.log(assignDate_Bef.isSame(assignDate, 'y'));
  console.log(assignDate_Aft.isSame(assignDate, 'y'));
  
  console.log(assignDate_Bef.isAfter(assignDate));
  console.log(assignDate_Aft.isAfter(assignDate));
}
実行結果
17:55:41	お知らせ	実行開始
17:55:41	情報	true
17:55:41	情報	false
17:55:41	情報	false
17:55:41	情報	false
17:55:41	情報	true
17:55:41	情報	true
17:55:41	情報	false
17:55:41	情報	true
17:55:41	お知らせ	実行完了

比較メソッドもdiffと同じくですが、明確に評価対象をパラメタ指定することで比較結果を変化させることができます。

STEP.7 ちょっと便利な使い方

日付操作は、プログラムの中で結構頻繁に行われるかと思います。これまで紹介した使い方以外に例えば、月初月末翌月末年始年末年度末などを取得したい時があるかと思います。そんな時は、以下を参考にしてみてください。

月初

let now = dayjs.dayjs();
console.log(now.startOf('M').format('YYYY-MM-DD HH:mm:ss'));

月末

let now = dayjs.dayjs();
console.log(now.endOf('M').format('YYYY-MM-DD HH:mm:ss'));

翌月末

let now = dayjs.dayjs();
console.log(now.add(1, 'M').endOf('M').format('YYYY-MM-DD HH:mm:ss'));

年始

let now = dayjs.dayjs();
console.log(now.startOf('y').format('YYYY-MM-DD HH:mm:ss'));

年末

let now = dayjs.dayjs();
console.log(now.endOf('y').format('YYYY-MM-DD HH:mm:ss'));

年度末

let now = dayjs.dayjs();
if (now.month() >= 3) {
  console.log(now.add(1, 'y')
                 .month(2)
                 .endOf('M').format('YYYY-MM-DD HH:mm:ss'));
} else {
  console.log(now.month(2)
                 .endOf('M').format('YYYY-MM-DD HH:mm:ss'));
}

こちらだけ簡単に解説すると、現在日時が4/1~12/31であれば年度末は翌年となるため、現在年に1を加算させたのちに、3月の末日を取得します。

おわりに

お疲れ様でした。
第13回は「dayjs ライブラリを用いて、GASの日付操作で楽をしよう!」ということで、GASで使用することのできるdayjsライブラリの代表的なメソッドや使い方をひたすらお伝えしました。このライブラリは今後はもちろんですが、これまでの12回の中でもこれを使えばもっと楽に記述できた箇所も往々にしてあります。このようにGASはライブラリを追加することで、プログラムをより簡潔に記述することも可能です。引き続き、GASを楽しんでいきましょう!!
記事を読んで、「良いな」や「今後に期待できる!」と感じて頂けたらいいねフォローコメントいただけると幸いです。それではまた次回をお楽しみに!

ブログでより詳しく解説しています!

以下画像をクリックしてブログにアクセス!!

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?