Web事業部LP
Web事業部LP
2019.10.24

スプレッドシートの祝日一覧をiCalでGoogle Calendarに読み込めるようにする

まさくに

こんにちは。バックエンドエンジニアのまさくにです。

弊社はセブにも拠点があり、いまメンバーが急激に増えておりまして、組織づくりも変化に変化を重ねています。今は日本拠点のエンジニアよりもメンバーいますからね。いろいろと変えていかなければならないでしょう。

セブはオフショア拠点でもあるものですから、日本と休日が違うとけっこう困ることが多いんですね。そのため、これまで祝日も日本に合わせてもらっていました。日本が休みの日に、セブも休みです。ただ、現地メンバーの生活や文化を考えると、あんまり良くないんじゃないかということで、9月からセブはセブの祝日にしたがうことになりました。

で、セブの祝日って、フィリピンの祝日だけじゃないんですね。セブ島の日というか、ローカルな休みがけっこう多くて、年によっても違うとかで把握するのも大変なので、Google Calendarで読み込めるよう、祝日をiCal形式で吐き出すスクリプトを作りました。スプレッドシートをiCal形式にしています。

それではどうぞー!

祝日が羅列されたスプレッドシートを作っておく

下記のようなスプレッドシートを作っておきます。これで自分以外のメンバーでもカレンダーを更新できるようになるので便利ですね。

年月日と名前だけでいいです。ちなみに上記の年月日はLIG調べの情報なので、どこかの公式の情報とは異なるかもしれませんので気をつけてくださいね。しかも変動する祝日もあるんですって。大変ですね。

いやしかし、セブの祝日、名前がかっこよすぎませんか?

下記のスクリプトをGASで書く

スプレッドシートの「ツール>スクリプトエディタ」からGASのエディタを開いてください。GASのファイルを別に作っても(Standalone型)いいですが、このスプレッドシートの情報しか使わないので、この(Container Bound型)で構わないと思います。

function doGet(e) {
  var ical = ""
  
  ical += "BEGIN:VCALENDAR\n"
  ical += "VERSION:2.0\n"
  ical += "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n"
  
  var holidays = SpreadsheetApp.getActiveSheet()
  var rows = holidays.getDataRange().getValues()
  for (rowNum = 1; rowNum < rows.length; rowNum++) {
    var row = rows[rowNum]
    var formatedDate = Utilities.formatDate(row[0], "JST", "yyyyMMdd");
    
    ical += "BEGIN:VEVENT\n"
    ical += "DTSTART;VALUE=DATE:" + formatedDate + "\n"
    ical += "DTEND;VALUE=DATE:" + formatedDate + "\n"
    ical += "SUMMARY:" + row[1] + "\n"
    ical += "END:VEVENT\n"
  }
  
  ical += "END:VCALENDAR"
  return ContentService.createTextOutput(ical)
}

ウェブアプリケーションとして公開しアクセスしてみる

上記スクリプトを実行すると、スプレッドシートに羅列された祝日がiCal形式で吐き出すわけなのですが、アクセスできなければなりません。スクリプトエディタの「公開>ウェブアプリケーションとして導入」を選んでください。

 

外部からもアクセスできるように下記のような設定で保存しておいてください。

出力されるiCalを確認する

前項で出力されたURLをGoogle Calendarの「URLで追加」に入力すると、カレンダーにセブの祝日が追加されると思います。これでセブメンバーの休みをGoogle Calendarで確認することができるようになりました。

ちなみにこのURLが吐き出しているのはただのテキストなので、ブラウザでアクセスすることができます。下記のような情報が吐き出されていますね。

Wikiなどを参考に作ったのですが、正確なところはRFC5545で定義されているのでご確認ください。

ただ、これスプレッドシートに書いた分だけiCalに出力されてしまうことになるので、それでいいのかなと思ってたんですが、下記コマンドでGoogleが出力している日本の祝日を確認すると2018年〜2020年まで出力しているので、これでいいんでしょうね。

curl -L https://www.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics | grep 'DTSTART' | sort

作ったものを普及させる方が難しい

このスクリプトはiCalの仕様確認も含めて30分くらいで作りましたが、GASは工夫次第で簡単に業務を効率化できますね。でも最近GASばっか書いてる気がするので、他にもなにか作っていきたいです。

ちなみに「こんなの作ったよ。便利だよ」とSlackで皆に伝えましたが、なぜかリアクションが一つもつかなかず無視されました。使ってるのは僕だけだと思います。いじめられているのでしょうか。バックエンドエンジニアのまさくにでした。