Ruby
ifttt

来年からはじめる勤怠オートメーション化

More than 1 year has passed since last update.

みなさんマジメに勤怠管理してますか?

私はここ1ヶ月ほど超が付くほどマジメにやっております。

みなさんがマジメにやれない理由、私わかります。

会社で導入されてるタイムカード的なWebツール開くのダルすぎとか、Excel開くのめんどくさすぎて月末に10:00-19:00とかビャーっと入れちゃうやつですよね。

はいもちろんわかりますとも。

さて、勤怠をつけておくというのは、過酷な環境であってもなくても自己防衛的な意味でわりと大事なことです。

とはいえ・・というのはもちろん承知しておりますので、そのとはいえ部分をイイ感じに解決する手段を提供しようじゃないか、というのが本稿の主題であります:tada:


導入するとどうなるの?

何かのボタンを押すとかも必要なく、毎日の出退勤が自動で記録されるようになります。

ただし! 毎日スマホだけは忘れないように!!


どういうものなの?

とある準備をすませたうえで、1ヶ月間適当に通勤し、翌月始めに後述のRuby製スクリプトを実行し、出た結果を勤務表などにペターとするだけで勤怠報告DONEにできます。1

ではさっそく準備にかかりましょう。


サービス/ツールの準備


用意するもの


  • iPhoneでもAndroidでもいいので、スマートフォン

  • IFTTTのアカウント

  • Dropboxのアカウント

  • Rubyの実行環境


それぞれの役割

ツール
役割

スマートフォン
GPS

IFTTT
位置情報をトリガーに、Dropbox上のテキストファイルにappend

Dropbox
会社付近に着いた/出た情報と、その発生時間のログを入れておく

Ruby
Dropboxに書き込まれた出退勤ログを集計

逆に言うとこれらができるなら他のサービスでもいいわけです。IFTTTをZapierとか。

とりあえず本稿ではこれらのサービス/ツールで話をすすめます。


各サービス/ツールのセットアップ


Dropbox

以降の設定の起点になるので、まず準備するのはDropboxが良いでしょう。

会社の規定で使えないよ!という方も安心です。今回はDropboxはただログが記録されるだけのストレージにすぎないので、特に会社のPCにマウントする必要はないのです。


IFTTT

役割でも説明したとおり、会社近くに着いた/出たら、Dropboxにイベントのログを追記するというアプレットを作ります。



  1. https://ifttt.com/my_applets を開き、New Appletボタンを押します

  2. +thisを押して、Choose a serviceでlocationで検索し、使う端末のOSのLocation Serviceを選択します。

  3. Choose trigger画面でYou enter or exit an areaを選択します。どっちかだけのもあるので注意!

  4. 雑に渋谷駅で検索してみました。実際は会社の住所を入力して、だいたいの位置に地図を移動しましょう。+ボタンで拡大して相当範囲を絞れそうですが、どうやら範囲指定はそれなりに制限があるらしく、ある程度の広さでないとエラーになってしまいます。手探りでなんとかお願いします:pray: locate_area_fix.png

  5. 次は+thatの方を設定します。Dropboxを検索、選択します。

  6. Choose actionでAppend to a text fileを選択します。

  7. 入力欄に幾つか白枠の表示があるかと思いますが、これがTriggerなどから渡ってきた変数を意味します。append_text_fix.png

  8. 今回は以下のように設定してみましょう。Contentは実際にテキストに追記される内容になりますが、処理の都合上JSONで記録されるようにします。

項目
内容

File name
kintai-log

Content
{"action": "{{EnteredOrExited}}", "at": "{{OccurredAt}}"}

Dropbox folder path
IFTTT/YourCompany

Review and Finish画面でFinishして完成です!IFTTTは以上になります。


スマートフォン

さて、せっかくIFTTTのアプレットを作ったところで、そのトリガーになる位置情報をハンドリングするデバイスがなくては始まりません。

App Store/Play StoreからIFTTTのアプリをインストールしてください。

インストール後、先程作ったAppletをアプリ上でONにしたらスマートフォンの準備は完了です。


Ruby

まあ適当に。。homebrewで入れるもよし、rbenvでもよし、システムデフォルトでもよし。

#!/usr/bin/env ruby

require 'time'
require 'json'

unless ARGV.length == 1
puts "Usage: ruby kintai.rb [input file]"
exit 1
end

lines =
File.new(ARGV.first).
readlines.
map(&:strip).
reject(&:empty?).
map { |v| JSON.parse(v) }.
map { |v|
at = Time.strptime(v['at'], "%B %d, %Y at %I:%M%p")
OpenStruct.new({
'entered?': v['action'] == 'entered',
'exited?': v['action'] == 'exited',
at: at,
date: at.to_date
})
}.
group_by(&:date).
reduce({}) { |acc, (date, list)|
acc.merge({
date.strftime('%Y/%m/%d') => {
entered: list.select(&:entered?).sort_by(&:at).first.at.strftime('%H:%M'),
exited: list.select(&:exited?).sort_by(&:at).last.at.strftime('%H:%M')
}
})
}

puts lines.to_json

↑のコードを適当なところに置いておいてください(上記コードではkintai.rbということになっています)。


雑なコード解説


  1. 入力値(ファイル名)をチェックして

  2. ファイルを行ごとに読んで

  3. 空行を飛ばし、各行をJSONパースしてHashにして

  4. OpenStructにして

  5. 日付がキーになるようにgroup_byして

  6. 日付ごとの集計結果をひとつのJSONとして出力できるようにHashに集計して

  7. JSONを出力する

という感じです。

強いていうと、5と6でsendできるように、4でOpenStructにしているというところですかね:thinking:


注意点

IFTTTはApplet単位で通知のON/OFFができるようになっていますので、こちらは動作の確認が取れ次第OFFにしておくといいでしょう。

地図アプリを見ている最中に突然現在位置が変なところに飛んでしまうという経験がみなさんもあるかと思います。この状態のときに自分は全く動いていないのに退勤/出勤を繰り返すという挙動になることがあります。

登録後の設定画面だと、Receive notifications when this Applet runsのスイッチが通知設定になります。


いざ実践

といっても、もう後はいつものように出勤して飯食って仕事して帰るだけです。

サイコーですね:joy:

ただ・・毎月の月初だけちょっと作業があります。


月初の作業

集計とログのローテーションが必要なんです。

IFTTTにはDropboxのファイルのリネームがないのです。。残念 2

1. (マウントポイントを変えていなければ) $ mv ~/Dropbox/IFTTT/YourCompany/kintai-log.txt ~/Dropbox/IFTTT/YourCompany/kintai-log.201612.txt

2. ↑新しいkintai-log.txtは次のApplet実行時に自動で作られます:thumbsup:

3. Ruby準備編で置いたファイルがカレントディレクトリにあるとして、 $ ruby kintai.rb ~/Dropbox/IFTTT/YourCompany/kintai-log.201612.txt > kintai201612.json

以上になります!


まとめ

現職の勤怠管理システムはWebシステムですが、CSVアップロードみたいな機能なかった:confounded:ので、bookmarkletにJSONを食わせて、みたいなことをする必要があったためJSONで出力していますが、みなさんお使いの高機能な勤怠管理システムや、高機能なExcelであればCSVで出力するのが使いやすいかと思います。

よしなに編集してお使いください :muscle:





  1. 提出はわすれないようにしましょうね!! 



  2. Zapierだとできそうですね。いずれ移行しようかなーと思います。