新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

日本の祝日データを取得するのに苦労した話

データベースで祝日テーブルを作成するために、日本の祝日データを探していました。

最終的には、下記のサイトから、一番欲しかったCSV形式でのデータが取得できた(作者の方ありがとうございます)のですが、それまでに随分回り道してしまったのでそのネタメモです。

matsuoshi.hatenablog.com

はじめに

日本の祝日を取得しようと「日本 祝日 データ」とかで検索すると、上の方に内閣府のサイトが引っかかります。

CSVダウンロードもできるし、ある意味公式サイトなので、これでいいじゃんと使おうとしたところ、

  • 過去のデータがない
  • 振替休日のデータがない

ことが判明し、これじゃ使えないよとなります。

見てると過去に「【悲報】内閣府の「国民の祝日」CSVがひどいと話題に【更新】」と話題になっていて、それから2年経ってるけど改善はされてないようです…。

Googleカレンダーを使う

他にも色々休日が載っているサイトはあるのですが、いささか不安なので、もう少しちゃんとしたところのデータを取得したいと、天下のGoogleカレンダーからの取得を考えました。

Googleカレンダーに日本の祝日を追加するには、カレンダーの歯車アイコンから

  • [設定]-[カレンダーを追加]-[関心のあるカレンダーを探す]-[休日]-[地域限定の祝日]-[日本の祝日]

日本の祝日データを取得するのに苦労した話

で行えます。

ただ、Googleカレンダーの「日本の祝日」カレンダーはエクスポートできず、かろうじて「iCal」形式でのダウンロードのみができます。

「iCal」ファイルをCSVに変換…。何か違うなと思い直しました。

Outlook予定表を使う

仕方ないので、Outlookにも、Googleカレンダーのような、日本の祝日予定表があるので、天下のMicrosoftのOutlookからの取得を考えました。

日本の祝日予定表は、Office365のWebから行います。アプリのOutlookでの追加方法もあるのですが、その場合、日本の祝日予定表を自分の予定表として取り込んでしまうのでオススメしません。

Office365の予定表に日本の祝日を追加するには、Outlookの左の予定表一覧の一番下から

  • [予定表を見つける]-[祝日]-[日本]

日本の祝日データを取得するのに苦労した話

で行えます。

次にエクスポートですが、今度はOffice365のWebからは行えず、アプリのOutlookから行います…。ややこしいです…。

アプリのOutlookから予定表のエクスポートは、

  • [ファイル]-[開く/エクスポート]-[インポート/エクスポート]-[ファイルにエクスポート]-[テキスト ファイル(カンマ区切り)]

日本の祝日データを取得するのに苦労した話

で行えます。

APIを探す

上記で当初目的の、日本の祝日のCSVデータは取得できたのですが、APIとかありそうなものだけどなぁと「日本 祝日 API」で検索したら、この記事の最初に記載した、Googleカレンダーの日本の祝日を取得するAPIサイトがでてきました。

しかも余計な情報も出力されないし、使いやすいし。最初にこれを見つけていれば…と思った次第です。

Google Apps Scriptで取得する

APIもそうですが、Google Apps ScriptでGoogleカレンダーから取得する例が多いようです。

Googleスプレッドシートに出力するには下記のようになります。

Googleスプレッドシートのスクリプトエディタ

日本の祝日データを取得するのに苦労した話

出力結果

日本の祝日データを取得するのに苦労した話

コード.gs

function myFunction() {
  const sheet = SpreadsheetApp.getActiveSheet();

  const start = new Date('2019/01/01 00:00:00');
  const end = new Date('2020/01/01 00:00:00');

  const cal = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  const events = cal.getEvents(start, end);
  
  const week = ["日", "月", "火", "水", "木", "金", "土"];
  var out = [['曜日','日付','イベント']];

  for(var i=0, len=events.length; i<len; ++i){
    var e = events[i];
    out.push([
      week[e.getStartTime().getDay()],
      e.getStartTime().toLocaleDateString(),
      e.getTitle()
    ]);
  }
  
  sheet.getRange(1,1,out.length,3).setValues(out);  
}