【FileMaker】祝日をカレンダーに表示したい 1/2

年に一度の大仕事（？）、祝日を自システムに表示。
っていう現場、ありますか？
最近はGoogleなどのカレンダーを自システムに入れ込んで管理不要なことも多いですが、そこまでグループワークすることもなく単純に自社システムで土日祝日がわかればいいんです、という向きもあるかと思います。

この記事は、「そうした向き」向けに書きました。

# この記事の対象者
上にある通り、「そうした向き」の他、
・FileMakerを使って自システムを展開している方
・FileMakerでAPIを使ってみたいけど、難易度が高く感じられる方
・FileMakerで自社カレンダーに祝日を組み込む羽目になった方
などです。

要は、FileMakerで祝日をコントロールしたい人、というところです。

# 最終ゴール
祝日テーブルを使って、祝日をカレンダーで色分けして表示します。

# この記事の範囲
まずは、祝日テーブルを作って祝日がいつかを登録するところまでです。


# 実装環境
APIを実行するのにcurlを使いますので、FileMakerのバージョンには注意してください。
FileMaker Pro 16以上

# 実装する方法
ここでは、2つの方法をご紹介します。

方法1.祝日カレンダーテーブルを作って年に一度の大仕事で力技で入力する
方法2.国民の祝日を公開しているサイトのAPIで年に一度の大仕事を1秒で終わらせる

## 方法1.祝日カレンダーテーブルを作って年に一度の大仕事で力技で入力する
こちらは単純に、祝日カレンダーテーブルをマスタ管理し、年末の最後のご奉仕日までにどこかの企業からもらったカレンダーを見ながら（昭和か！）入力を終わらせるパターンです。
最近ではスマホのカレンダーを見ながら、でしょうか？
![スクリーンショット 2023-10-06 11.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/da03faf8-b9f1-b927-a0c1-156155ad539b.png)
できれば、サイト（目視）チェックも含めて二人で行いたいところですね。


## 方法2.国民の祝日を公開しているサイトのAPIで年に一度の大仕事を1秒で終わらせる
検索すると、複数の国民の祝日APIが公開されています。
「国民の祝日 API」という検索条件で検索すると、いくつかヒットします。

今回はその中から「[国民の祝日：日本](https://national-holidays.jp/about.html)」サイトさんが公開しているAPIを使って取得してみます。
こちらのサイトをピックアップした理由の一つとして、[API Documents](https://national-holidays.jp/api.html)がページ化されていることです。
こうしたドキュメントがあると、実装するときにとても助かりますね。

# 国民の祝日APIで祝日を取得する
上にあげた国民の祝日APIは、承認プロセスが不要なので、ちょっとAPIを使いたい、学習したい、という向きにはとてもいいAPIだと思います。

ここでは、以下の２通りの取得を行なってみます。

1.現行の祝日法(昭和23年法律第178号)が施行された1948年7月20日以降の全祝日データ
2.年を指定して取得する、年間の祝日データ

祝日データを格納するテーブルは、以下のように最小限で構成しています。
![スクリーンショット 2023-10-06 12.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/889295ec-92db-7137-517a-d3da876ef652.png)
以下のフィールドだけでも、問題なくAPIからの祝日データを取得・格納できます。
| フィールド名 | タイプ |
|:-:|:-:|
| date  | 日付  |
|  name |  テキスト |
| type  |  テキスト |


## 1.全祝日データ取得
URIも難しくなく、APIを公開しているURLにallを付けるだけです。

```
http://api.national-holidays.jp/all
```

これを、FileMakerのスクリプトにすると、こんな感じです。
![スクリーンショット 2023-10-06 12.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/2d77b8f9-825b-7b0c-9709-0fb89f31d101.png)
$retに祝日データがJSON形式で返ってきます。
date,name,typeの３種類の項目が1つの祝日データとして複数件の配列で返ってきます。
![スクリーンショット 2023-10-06 12.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b27aee10-c279-6c21-8a94-93a1a0b1822a.png)

手動で作成する祝日カレンダー同様、API経由で祝日データを祝日テーブルに入れます。
件数は、$retのJSONには入っていませんので、3〜4行目にあるように配列を数えます。
仮に、祝日データが取得できていなかった場合は、後続の処理は実行しません。
この辺のエラー処理は、自社の開発ルールで処理してください。
![スクリーンショット 2023-10-06 12.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0c99f565-2601-38aa-73cf-bee31002c5e0.png)
テーブルに取得した祝日データを展開する流れは、FileMakerを扱っている方であれば単純にLoopでデータをセットしていくのがわかるかと思います。
JSONに慣れていない場合は、JSONからデータを取得するのに手惑うかもしれませんが、JSONGetElement関数で対象の１行分のJSONデータ(20行目)からキー（この場合は"date","name","type"）を指定するだけです。

## 2.年を指定して取得
では、来年の祝日データを取得したい場合です。
来年の祝日データは、通常2月に公開されます。
なので、来年の祝日データを取得したい場合は、2月を過ぎてから行います。

先ほどの全データ取得のテーブルを使ってもいいのですが、ここではテスト用にテーブルをコピーして別テーブルで作業をしていきます。
通常は、同じテーブルで問題ないです。

年を取得する計算フィールドを追加します。
これは、指定された年の祝日データがすでに存在する場合、同じ祝日データが重複しないようにテーブルにセットする前に年単位で祝日データを削除するためです。
![スクリーンショット 2023-10-06 15.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a7dc148d-bc61-48ef-f49f-a27871993f57.png)

スクリプトでは、この、取得する年の祝日データを削除する処理を追加します。
また、どの年の祝日データを取得したいか、スクリプトの最初でカスタムダイアログの入力を使って指定しています。
この部分は、処理を定期自動化する場合などは、次の年を自動で計算してもいいと思います。
例えば、

```
year( get( 日付 ) ) + 1
```

とか、
処理する前に年でソートしたテーブル内で一番値の大きい年に＋１をした年を取得する、などなど。

FileMaker ServerやFileMaker Cloudのスクリプトスケジュールで指定することで、年次処理の自動化が図れます。

スクリプトを見ていきましょう。
![スクリーンショット 2023-10-06 16.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/fb6ec414-7fde-759e-65b6-f5872ee6a980.png)

取得する年を指定し、先ほどの全件取得と同じURLに、今度は取得する年をつけてURLを飛ばします。
すると、その年だけの祝日データが取得できます。

もしかしたら既にその年の祝日データがテーブルにあるかもしれないので、先に該当データを削除しておきます。
「# 対象テーブルデータの該当年の削除」部分です。

ここの、対象レコードの絞込みは、次のように指定しています。
![スクリーンショット 2023-10-06 16.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9aecc54c-d673-c3d3-e631-288c48f47d32.png)
この、絞り込んだ祝日レコードを削除してから、テーブルに展開することで、祝日が重複しません。

# 祝日テーブルの完成
これで、祝日テーブルが出来上がりましたね！
祝日テーブルをメンテナンスしていくときは、2個目の年ごとの取得を毎年繰り返すだけです。

# 気をつけること
1.ローカルなお休み
土日以外のお休みということで、この祝日データ取得をしていますが、地方自治体ごとに記念日を作って学校などを休校にしているところもあります。
東京都で言えば、10月01日の都民の日とか、都内の市区町村立や都立の小中高学校が休校になったりしますね。
こうしたローカルな休日も入れたい場合は、対象データを削除する際に削除してはいけないデータとなるので、何かしらのフラグ管理などで対応していきましょう。

2.API終了
APIの公開は、いつ終了するかわかりません。
いつの間にかAPIサイトが閉じていて、データが取得できなかった、、、ということもなきにしもあらずなので、回避策をあらかじめ作っておきましょう。

# 次回
次回は、この祝日テーブルを使ってカレンダーに祝日表示をします。
カレンダーの作り方ではないですので、カレンダーの作り方を知りたい人は、検索サイトで「filemaker カレンダーの作り方」とキーワードを入れて検索してみてください。
色々やり方があります。

↓↓↓祝日表示の記事公開しました！↓↓↓

https://qiita.com/tyuma/items/3da8e01dec5470a2e7b0