日報の自動化をする


こんにちは、@24guchiaです。
日報書いてますか?(書いてません!)

日報を書く意義とは

Career Skillsの第43章、人事考課で最高評価を獲得するを参考。
評価が想定したより悪い時、覆すための根拠。

評価で有利だったり、過去の振り返りだったりで便利だと思います。
僕はこの本の作者が好きなので、とりあえず初めてみました。
ただ、めっちゃめんどうなポイントがいくつかあるので、
自動化して楽してます。かっこよく言うとRPAです。

日報を書くめんどくささ

とはいえ、めんどくさいですよね、日報書くの。

めんどくさいポイント

  • 日報のテンプレート用意したりファイル名を統一したりなど
  • そもそも日報ファイルを開かないといけない
  • 帰る前に日報をdocbaseに投稿するのを忘れる

一個でもやるの忘れると、あーもう良いかでやめちゃいがちです。
そのため、この辺を自動化しました。

自動化ポイントの洗い出し

上であげためんどくさいポイントがそのまま自動化ポイントです。
それ以外に、会社員なら起きる出退勤時の
めんどくさいポイントを洗い出し、ついでに解決します。

出勤時

  • 自社勤怠システムサイトで出社ボタンを押す
  • Slack上で出社した旨を発言(出社時間が不定のため)
  • 日報を開く

退勤時

  • 自社勤怠システムサイトで退勤
  • Slack上で退勤した旨を発言(退社時間が不定のため)
  • 日報をdocbaseに投稿

要件がまとまったので、後は実装するだけです。

自動化の実装

puppeteerとBashコマンドでやりました。
これらをまとめて、shellファイルにし、aliasでworkin,workout
出勤退勤.shを呼び出すようにしています。

出退勤bot

自社勤怠システムサイトはpuppeteerを使い、
Chromeを立ち上げ、ログインの後、出勤か退勤ボタンを
押すところまで実装しました。

const puppeteer = require('puppeteer');

puppeteer.launch({
  headless: false,
  slowMo: 20
}).then(async browser => {
  const page = await browser.newPage();

  await page.setViewport({ width: 1200, height: 800 }); // view portの指定
  await page.goto('https://kintaisystem/');
  await page.type('#email', process.env.email);
  await page.type('#password', process.env.password);
  await page.waitFor(100);
  await page.click('input[type="submit"]');

  await page.waitFor(100);
  await page.click('#shukkin');

  await page.waitFor(30000);
  await browser.close();
}, ((reason) => {
  console.log(reason);
}));

ヘッドレスで動かしてないのは、深い意味はないです。趣味です。
退勤も上記をほぼ使いまわししています。

出退勤した旨を発言してくれるcurlコマンド

Slackはincoming webhookを用意したら、
後はコマンドを叩くだけなので簡単です。

curl -X POST --data-urlencode "payload={\"channel\": \"#投稿したいチャンネル\", \"username\": \"出退勤bot\", \"text\": \"出社しました\", \"icon_emoji\": \":neko:\"}" https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

退勤するとこんな感じ。

現場猫かわいい

当日分の日報を作って開いてくれるshell

日報書くのにあたって、実はめんどくさくて忘れがちなのが、
そもそも当日分の日報ファイルを作ることだったりします。
で、退勤前に書いてないというかファイルすら作ってない・・・ってなり、
雑な日報を書き始め、そのまま書くのをやめるってことになります。

ここを自動化して、日報ファイルが出社と同時に開かれると、
とりあえず書き始めるかとなるので、習慣付けられることができます。

#!/bin/sh

filename=`date '+%F'`.md
dirname=`date '+%Y%m'`
now=`date '+%H:%M'`

cd ~/dev/nippou
sed -e 's/DATE/'$now' ~ DATE/g' nippou_template.md > $filename
if [ ! -e $dirname ]; then
  mkdir $dirname
fi
mv $filename $dirname
open -a Typora $dirname/$filename

sedコマンドで日報テンプレートのDATEを、
このshellを実行した時間に置換されます。
日報上で正確な出社時間がわかるようになります。

nippouディレクトリの当日分の日報を当月分ディレクトリに配置した上で、
Typoraで開くようにしています。
開かれたらすぐに最初にやる作業を書くようにして、
書き続けるようにします。

退勤時、当日分の日報をdocbaseに投稿する

日報はすでに書き上がっている状態なので、
後はdocbaseに投稿するだけです。

#!/bin/sh

filename=`date '+%F'`.md
dirname=`date '+%Y%m'`
today=`date '+%Y/%m/%d'`
now=`date '+%H:%M'`
docbase_token=`echo $docbase_token`

cd ~/dev/nippou/$dirname
txt=`less $filename | perl -pe 's/DATE/'"$now"'/g; s/\\n/\\\n/g;'`
curl -H 'X-DocBaseToken: ${docbase_token}' -H 'Content-Type: application/json' -d '{"title": "日報 西口 '"$today"'", "body": "'"$txt"'", "draft": false, "tags": ["日報"] }' https://api.docbase.io/teams/sample_team/posts

txtには日報ファイルを読み込み、出退勤時間を書くところに残してある
置換用文字列のDATEを退社時間に置換します。最後に改行コードをいい感じにして、
docbaseにファイルを作成するcurlコマンドの引数に渡してます。
mdファイルの改行をいい感じにして、curlに渡す方法が
ググっても見つからなかったので、ここが一番苦労しました。

自動化してよかったこと

日報書くのが習慣化される

達成したかったことがこれですが、
今の所、無事に続いています。
こういうのは積み重ねが大事なので、引き続きやっていきたい。

出退勤時間が明確化される

日報ファイル、Slackの発言、社内勤怠システムの時間で
出退勤時間が保存されるので、正確に労働時間がわかるようになりました。

改善したいこと

勤務時間を自動で計算

日報に出社退社時間を残しているため、
そこから差分を計算するだけなのですが、
shellで時間計算するのが微妙にめんどくさくて放置している。
毎回計算するのもめんどくさいので時間見て直したい。

退社時のSlack上の発言にdocbaseの日報URLを乗せる

退社時のコメントで日報URLを乗せて、
フィードバックもらいやすいように導線作ろうと考えてます。

curlの戻り値がjson形式で、
docbaseに作成されたURLがあるのも確認できているので、できるそうなもんなんですが、
shellファイルでcurlした結果を変数に代入できないので、調べ中です。

まとめ

この手のものは効果が出るのは時間がかかったりするので、
気長に効果が出るのを待ちます。

本当に効果が出るのか?という疑問については、
このブログ読んだことが方から仕事のオファーがあったので
後からみんなが辿れる形で残すことには良い効果があると考えています。

日報はまだ効果出てないですが、
毎日の出退勤といつ会社にいるのかの共有が
一つのコマンドででできるので一気にできるので楽です。