きっかけ
- 勤怠管理にジョブカンを使っている
- チャットルームで勤務開始、勤務終了後を自動投稿したい
フレックスで勤務終了予定時間になってもダラダラ仕事を続けてしまいがちになっている。
エンジニアたるもの、定時にあがって自分のやりたい分野の勉強をして自己研鑽したり、
リフレッシュのために家族との時間に充てて翌営業日も最善のパフォーマンスで業務に取り組みたいモノです。
つくったもの
- ジョブカン勤怠データの読み取り GAS ライブラリ
- ジョブカンのモバイルページをスクレイピングする
- 勤怠データのモデル化とか
- ジョブカンが打刻されたことを判定して通知する GAS アプリケーション
ジョブカン勤怠データの読み取り GAS ライブラリ
■ JobcanAttendanceReader
https://github.com/yamatomo73/JobcanAttendanceReader
はじめての GAS スクレイピング
ライブラリを探して、いくつかためしたのですがこれがよさげでした。
Easy data scraping with Google Apps Script in 5 minutes ~ kutil.org
https://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html
ジョブカンのスクレイピングも、こんな感じにお手軽に
https://github.com/yamatomo73/JobcanAttendanceReader/blob/master/src/AttendanceRecordParser.gs#L20
スクレイピングという、不安定な実現方法なので最大限力をぬいた実装です。
ちょっとデザインが変わっただけでも破綻するので一切頑張らないと心得よ。
ジョブカンが打刻されたことを判定して通知する GAS アプリケーション
ジョブカンの勤怠記録をスクレイピングするライブラリはつくりましたが、どのように通知するかは考えなければならない。
勤務開始をトリガーに1度だけChatworkに投稿したいし、勤務終了をトリガーに1度岳Chatworkに投稿したい。
せっかくの GAS なので通知したかしないかの状態をスプレッドシートで管理して、通知していなければ通知するようにします。
失敗したときのリカバリもこちらのほうが容易だとおもいますし。
用意したスプレッドシート
- 日付
- 勤怠の日付。これがキーとなる
- ステータス / 勤務開始 / 勤務終了
- ジョブカンの値をそのまま転記する。ただのコピーなのでいらないのだけど、今後スプレッドシート上でなにか集計したくなるかもとおもっただけ。
- 開始通知 / 退勤予告 / 終了通知
- 通知したかどうかの状態をここに永続化して判定に使う
アプリケーション実装
■jobcan_notifier_to_Chatwork
https://github.com/yamatomo73/jobcan_notifier_to_Chatwork
使用法
- 上記のスプレッドシートを用意する
-
yyyyMM
形式 (201812) のようなシート名にする - 作成したスプレッドシートのスクリプトエディタに良い感じとりこむ(※ライブラリはとくに一般公開してないので)
JobcanAttendanceReader
jobcan_notifier_to_Chatwork - アプリケーションの設定を「スクリプトのプロパティ」に設定する
https://github.com/yamatomo73/jobcan_notifier_to_Chatwork/blob/master/controller/endpoint.gs#L8-L14
業務時間や定時時間の業務ロジックの修正
その辺の実装は WorkRegulation というクラスにまとまっています。
これは自分の勤務形態ごとに実装を変える必要があります。
今の実装は
- 勤務時間は8時間
- 休憩時間は1時間
というだけのルールです。
始業時間固定や稼働時間が15分単位、30分単位の勤務形態であったりするとロジックを変更する必要があります。
まとめ
公式APIがないサービスと連携しようとすると、スクレイピングという不安定なことをやらざるを得ません。
スクレイピングをやるなら力を抜いて、実装すること、ただ、変更を前提に。
あと、優しくスクレイピングしましょう。大量にアクセスする必要があるなら sleep して、多重度もさげてあげてください🙇