日本の祝日 を Google App Script 経由で FileMaker に取り込む

日本の祝日

新元号令和が4月1日に発表され、5月1日から新しい元号になりました。
いろいろな対策に一苦労されたエンジニアの方も多いと思います。
次に明るみになった課題は「日本の祝日」にシステムをどうやって連動するかです。
日本の祝日は、振替休日や、連休と連休に挟まれた・・・といった定形ルールだけでなく、
今回のような天皇の御即位、政治決定された国民の祝日など、
来年の祝日ですら100%確定していません。
システム管理者がコツコツ祝日カレンダーをメンテナンスするのも大変です。
良記事 https://qiita.com/nakaaza/items/b81be1fe16839369a6ee に刺激され、
記事投稿しました。

Googleカレンダーの 日本の祝日 と連動させる

Googleカレンダーには「日本の祝日」という共有カレンダーがあります。
これはGoogleの中の方が常にメンテナンスしてくれる便利なカレンダーで、
すでに2019/12/23や2020/2/23~24も反映されています。
Googleアカウントをお持ちのかたは簡単に自分のカレンダーに表示させることが出来ますし、
GoogleカレンダーAPIを使えば自前のシステムに連動させることも可能です。

Googleカレンダー API と token

Google の各種 APIと FileMaker との連動は最近いろいろサンプルが出てきました。
基本的には OAuth で認証してtokenを取得し、
そのtokenを使って必要なAPIをたたく、
という2つのリクエストが必要です。
しかし、カレンダーは個人に紐づく情報ですので、
tokenの取得に基本的に人間のクリック操作を介する必要があります。
システムが人間の手を一切介することなく自動的にtokenを取得する方法もありますが、
技術的難易度は結構高く、手を付けたくありません。

Google Apps Script と Google のAPI

Googleアカウントを取得すると、GmailやGoogleドライブなど無料で使用できます。
おなじく無料で使用できるサービスに Google Apps Script があります。
これはざっくりいうと Microsft Officeでいうところのマクロみたいなものなんですが、
専用言語ではなく、JavaScript で記述できるサーバーサイドスクリプトとして、
クラウド上で実行されます。
便利なのはGoogle の各種APIと面倒なtoken取得などをプログラミングレスで利用できることです。
そして外部システムから HTTPリクエスト・レスポンスを返すことができます。
つまり、「GoogleのAPIを簡単に利用するための中間APIサーバー」を構築できます。
FileMaker からGoogle のAPIと直接連携するのではなく、
Google API  <−> Google Apps Script <−> FileMaker
と連携すると簡単なんです。

Google Apps Script でGoogle カレンダーAPIの結果を返すウェブアプリケーションを作成する

大まかな手順
  1. Googleアカウントに Google Apps Script を追加する
  2. Google Apps Script ファイルを作成する
  3. ウェブアプリケーションとして公開する
1. Googleアカウントに Google Apps Script を追加する

初めて Google Apps Script を使用するかたのための手順です。
一度でも利用した方はこの手順は不要ですので、2.に進んでください。

Googleドライブを開き、
「新規」をクリックし、「その他」ー「アプリを追加」をクリックします。

検索フィールドに「script」を入力すると Google Apps Script が上位にフィルターされてくるので、
「接続」をクリックします。

2. Google Apps Script ファイルを作成する

「新規」をクリックし、「その他」ー「Google Apps Script」をクリックします。

無題のプロジェクトという名のGoogle Apps Script ファイルが開きます。
まずは名前をつけたいので「無題のプロジェクト」のあたりをクリックします。

適当に名前を入力して、「OK」をクリックします。

もともと入っているfunctuin muFunctuin~のコードをすべて消去し、次のコードをコピペします。

function doGet(e) {

  //クエリーパラメータをそのまま渡す (?y=2019&m=5&d=1)
  var resHoliday = holidayName(e.parameter);

  var output = ContentService.createTextOutput(resHoliday);
  output.setMimeType(ContentService.MimeType.JSON);
  return output;

}

function holidayName(param){

  //var targetDate = new Date(2019, 4, 1 , 0 , 0 );
  var targetDate = new Date( parseInt(param.y ,10), parseInt(param.m ,10) -1, parseInt(param.d ,10) , 0 , 0 );
  var calendars_japanHolidays = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');

  var events_japanHolidays = calendars_japanHolidays.getEventsForDay(targetDate);

  var resObj = {};
  resObj.date = targetDate.toLocaleDateString();

  if(events_japanHolidays.length > 0){
    resObj.result = true;
    resObj.name = events_japanHolidays[0].getTitle();
    resObj.id = events_japanHolidays[0].getId();
  } else {
    resObj.result = false;
    resObj.name = '';
    resObj.id = '';
  }

   return JSON.stringify(resObj);
}

3. ウェブアプリケーションとして公開する

メニューの「公開」ー「ウェブアプリケーションとして導入…」をクリックします。

  • プロジェクト バージョンが「New」
  • 次のユーザーとしてアプリケーションを実行が「自分」
  • アプリケーションにアクセスできるユーザーを「全員(匿名ユーザーを含む)」に切り替え

に設定し、「導入」をクリックします。
この設定がtokenの取得をプログラミングせずに利用できる肝なんだと思います。
設定内容は適宜変更してください。

承認が求められますので「許可を確認」をクリックします。

先程の設定画面で 次のユーザーとしてアプリケーションを実行 のアカウントが出てきていると思いますので、
そのアカウントをクリックします。

今回のGoogle Apps Scrtiptファイルから 設定したGoogleアカウントのカレンダー情報に対する許可の確認画面です。
「許可」をクリックします。

これで設定完了です。
表示されている ウェブ アプリケーションの URL をコピーして控えておいてください。

FileMaker から 「URLから挿入」スクリプトステップでデータ連動する

上記で作成したウェブアプリケーションは次のような仕様にしています。

  • リクエスト先:ウェブ アプリケーションの URL
  • メソッド:GET
  • リクエストパラメータ:y:西暦年(数字)、m:月(数字)、d:日(数字)
  • レスポンス(JSON):result:祝日ならtrue(bool)、date:評価した日付(日本の日付形式)、name:祝日名称、id:GoogleカレンダーのID

URLから挿入のスクリプトステップには次にように設定します。
ポイントはリダイレクトを許可するcURLオプション「-L」を追加することです。

  • ターゲット:$res
  • URLを指定:ウェブ アプリケーションの URL & “?y=2019&m=5&d=1”
  • cURl オプションの指定:”-L”

サンプルファイルご希望の方は お問い合わせページよりご連絡いただければすぐ(平日のみ)お送りします。

 

 

 

 

【 開発者募集中 】
弊社では FileMaker を使った高度な技術力で、モバイルデバイスのビジネス利用を楽しく発展させていく仲間を随時募集しています。詳しくは採用ページをご覧ください。