面倒なことに愛を持って立ち向かう
本記事は SimpleForm Advent Calendar 2024 の 14 日目の記事です。
こんにちは、シンプルフォーム株式会社 エンジニアの喜多です。
シンプルフォームには 11 月 1 日に入社し、金融機関や法人審査といった初めて触れるドメインにワクワクしつつ、覚えることが盛りだくさんでヒイヒイ言いながら毎日を過ごしています。
面倒を愛する
私が入社前から良いなと思っていた弊社のバリューのひとつに「面倒を愛する」という言葉があります。
「面倒を愛する」と聞くとプログラマー三代美徳のひとつである「怠惰」と相反するように思えます。しかし「将来の社内外の面倒を減らすためには、いかなる面倒も厭わない」という解釈があり、私はこれは「怠惰」と同義ではないかと考えています。
「面倒を愛する」についての詳細は CEO 田代が熱く語る Podcast をご視聴ください。
みなさんはどんな面倒を抱えていますか?
今回は私が抱えている面倒のうちの一つ「通勤費の申請」から愛を込めてさよならする第一歩についてご紹介します。
通勤費の申請はなぜ面倒なのか?
「通勤費の申請」という概念が生まれた日
毎日通勤することが当たり前だった時代、我々は事前に通勤経路を申請しておくことで翌月に定期代が振り込まれる世界に生きていました。窓口やスマホで定期券を買うのが少し面倒でしたよね。特に定期券の期限切れに気づかずランチ代を失った経験は忘れもしません。
2020 年のコロナ禍以降、リモートワークを導入した企業では定期券を廃止し、実費支給に切り替えたケースが多いでしょう。これにより「出社日数分の通勤費を翌月に申請する」という新たな作業が生まれました。
これが「通勤費の申請」です。
通勤費の申請方法
弊社では現在、経費関連の SaaS を導入していないため、出社日や経路、通勤費をスプレッドシートに入力し、Slack のワークフローへ添付しています。過去に在籍していた企業では SaaS を導入しており、以下のような方法がありました:
- UI から直接登録する
- 交通系 IC カードと連携し通勤費だけを登録する
- CSV ファイルをインポートする
SaaS を導入すれば作業は多少楽になりますが、「出社の都度登録する」または「出社履歴をまとめて振り返る」作業は避けられません。
私の場合は Google Calendar の「勤務場所」を欠かさず入力しているので、毎月初に前月のカレンダーを眺めて「オフィス」となっている日の通勤費を入力しています。とても面倒ですね😢
(私事ですが本日誕生日です😉 おめでとうございます🎉)
Google Calendar API を使って「通勤費の申請」を少しだけ楽にする
前置きが長くなりましたが、今回は通勤費申請フローのうち「入力」を自動化していきます。
出社履歴を取得する
例えば入退出履歴や PC のアクセスログからオフィスにいたことを判別できそうですが、第三者の協力が必要になりますし、やりたいことに対して煩雑すぎます。そういったログを利用する必要がある課題が発生したら検討することにします。
今回は手っ取り早く Google Apps Script(以下 GAS)から Google Calendar API を利用して「勤務場所」を参照します。(「勤務場所」の入力が間違っていないことが前提となりますが、そこは頑張って入力しておきましょう💪)
「勤務場所」機能の活用
リモートワークやハイブリッドワークの普及とともに、従業員がどこで仕事をしているのかを明確に共有する必要性が高まりました。このような状況下でチームメンバーが互いの勤務場所を把握し、対面での会議や共同作業の日程調整を効率化するため 2021 年 8 月 に導入された機能です。
実は 2022 年ころに Google Calendar API から取得できるだろうと調べてみたのですが、当時はまだ対応がされておらず断念しました。今回転職後初めて通勤費申請をするにあたり、ふと思い出して調べてみたら 2023 年 8 月 から API に対応していたようです。
Google Calendar API で「勤務場所」を取得する
勤務場所は Google Calendar API の events.list
から取得できます。
とりあえずどんなレスポンスを取得できるか試したいので APIs Explorer から実行してみましょう。
まずは Google Workspace > Google Calendar > Reference > Events: list を開いてリクエストパラメータを確認します。calendarId = 'primary'
と eventTypes = 'workingLocation'
を指定すれば目的のデータに絞り込めそうなので、サイドバーの「API」を開いて実行してみます。
以下のような JSON が取得できました!やったね 🎉
// レスポンスの一部
{
...
"eventType": "workingLocation",
"summary": "オフィス",
"start": {
"date": "2024-11-01"
},
"end": {
"date": "2024-11-02"
},
...
}
GAS から「勤務場所」を取得して出社日を入力する
API から値を取得できることが確認できたので、次は GAS からのアクセスを確認してみます。
GAS のプロジェクトを開いたら「サービス > Google Calendar API」を追加します。これで Google Calendar API に Calendar
でアクセスできるようになります。
以下のリファレンスを参考に WorkingLocation
を取得してみます。
/**
* 指定された月に「オフィス」で勤務した日付の一覧を取得する
*/
function getOfficeWorkDates(year, month) {
const startDate = new Date(year, month - 1, 1);
const endDate = new Date(startDate);
endDate.setMonth(month, 0);
endDate.setHours(23, 59, 59);
const event = Calendar.Events.list('primary', {
eventTypes: 'workingLocation',
singleEvents: true,
timeMin: startDate.toISOString(),
timeMax: endDate.toISOString()
});
return event.items
.filter(item => item.summary === 'オフィス')
.map(item => item.start.date)
.sort();
}
console.log(getOfficeWorkDates(11));
// [ '2024-11-01', '2024-11-05', ... '2024-11-29' ]
出社日の一覧を取得できました🏢🗓
あとはこの日付リストと他の項目を合わせてセルに設定する処理を実装すれば完成です!
実装途中:日付の自動入力部分
余談ですが時間帯ごとに勤務場所を指定する機能があることはご存知でしょうか?
その場合は以下のような JSON になるのでもうひと工夫必要になりますが、そこまで厳密に移動を入力する機会もないので、今回は日にち単位の勤務場所の取得に留めておきます。
{
...
"eventType": "workingLocation",
"summary": "オフィス",
"start": {
"date": {
"timeZone": 'Asia/Tokyo',
"dateTime": '2024-12-16T15:00:00+09:00'
}
},
"end": {
"date": {
"timeZone": 'Asia/Tokyo',
"dateTime": '2024-12-16T17:00:00+09:00'
}
},
...
}
まとめ
「Google Calendar に勤務場所を正しく入力」していればワンクリックで通勤費の日付に反映させることができるようになりました!毎月初めにカレンダーを見ながら手作業で入力していた手間が省け、大幅に時短できてとても嬉しいです🥰
低頻度なルーチンにどこまで向き合うか
エンジニアリングに関わる頻度の高い定型業務は自動化(または半自動化)をしている、またはその道筋が立っていることが多いかと思います。しかし私の経験上「業務とは直接関係のない事務作業」かつ「発生頻度が少ないもの」は放置される傾向にあります。
今回の作業は「月1回」「数分」で終わるものですが「月初数日以内に対応すれば良い」「出社日を振り返って入力する必要がある」といった特徴から、心理的なハードルが高い作業でもあります。こうした作業は後回しにしがちで、その結果、脳内リソースを占有し続けるほか、コンテキストスイッチの発生によって生産性をじわじわと低下させる原因になると考えられます。
たとえ数分で終わる作業でも、簡単に自動化できるなら早めに取り組んでしまい、本業に集中できる環境を整えていきたいですね!
リアルタイム法人調査システム「SimpleCheck」を開発・運営するシンプルフォーム株式会社の開発チームのメンバーが、日々の開発で得た知見や試してみた技術などについて発信していきます。 Publication 運用への移行前の記事は zenn.dev/simpleform からご覧ください。
Discussion