Blog

[GAS] [Slack] [Kintone] 清掃員さんは勤務表を作らせたい〜平社員たちの自動化頭脳戦〜

札幌オフィス清掃員 技術ブログ

釣りタイトルで失礼します。札幌オフィス清掃員です。

月末にはみなさん「勤務表」なるものを作成するのではないでしょうか。
グループウェア的なものを使うにしろ、Excelで作成して共有するにしろ、何かしらあるのではないかと思います。
もちろんコルシスでも勤務表の提出が義務付けられています。

今日はそんな、一部の人々からは忌み嫌われる存在である、勤務表についてのお話をさせて頂ければ。

弊社現況

勤務表提出ルール

コルシスでは残念ながら気の利いたタイムトラッキングツールを使っていたりはせず、Excelで各自まとめてkintoneで提出というフローになっています。
そして私は出社時刻や退勤時刻、昼休憩の開始時刻などをいちいちメモしていたりはしません。

じゃあどうやって毎日の出社、退勤時刻を得るのか?
それは次項でご説明します。

勤務状況の可視化

このコロナ禍によりリモートワークを導入したという会社さんも多数あられるのではないでしょうか。
コルシスではこちらの記事でも紹介させて頂いておりますように、コロナ以前よりリモートワークが前提となっています。

リモートワークやスライド勤務で困るのはやはり「他メンバーの"今"の勤務状況がわかりづらい」ことではないでしょうか。
"お客様先へご訪問中"であったり"休暇中"であったり"午後からの稼働"であったり・・・。

そのような事を解決する為、コルシスではSlackステータスによる勤務状況通知を活用しております。
こんな感じですね。

2a169d258f6a71d5282c36f522ea5da5b6812728.jpg

そして、このステータスの変化を AWS lambda で受け取り、lambdaからSlackの特定チャンネルへ投稿するようになっています。

Slack___notify_member-status___colsis (1).jpg

そうです。
このログを1ヶ月分遡ってExcelに記入するという、それだけで"1日の稼働時間の20%は消費する"作業を毎月末に私は行っていたのです。

しかし、いい加減に手作業で自分のステータス変化だけを拾ってきて記入するのは飽きたし、繁忙期にはそんなことやってられません。

よろしい。ならば戦争自動化だ。

GoogleSpreadsheet + GoogleAppsScript + Slack での勤務表自動作成

ということで前置きが長くなりましたが、ここからようやく本題です。

  • 各人のSlackステータス変化を特定チャンネルに集約するBOTの投稿をAPIで拾い
  • GoogleSpreadsheet上に勤務表形式で自動作成していくGoogleAppsScriptを作成する
  • Kintone休暇申請Appのデータも取得し、休暇なのか公休なのかもわかるようにする

そんなものを作ってみました。

colsis-sapporo-cleaner/gas_timecard

colsis-sapporo-cleaner/gas_timecard

もし誰かに需要があるようであればご自由にカスタマイズ等しながらご利用頂ければ幸いです。
pull-reqもお待ちしています。

使い方

環境構築

上記プロジェクトを clone して

# yarn global add @google/clasp

とかでclasp自体はインストールできます。(もちろんnpmでもOKです)

clasp についてはこちらが参考になります。
GAS のGoogle謹製CLIツール clasp - Qiita

clasp を入れたら、下記のような内容でプロジェクトルートに .clasp.json を作成してください。scriptId は事前にGUIからAppsScriptプロジェクトを作成し、そのIDを取得してください。

{
  "scriptId": "*************************************************",
  "rootDir": "src/"
}

GoogleSpreadsheetの準備

適当なGoogleSpreadsheetを作成し、勤務表作成対象のSlackユーザIDを1列目に列記します。
このシート(タブ)の名称は "targetusers" としていますが、次項のGASプロジェクトプロパティで指定可能なので何でも良いです。
ExcelとGoogleSpreadsheetでは各部の名称が異なるのでこのように記事を書く時に色々と困りますね

98cad1be61074b4f0b9534452cb5437d785200f6.jpg

GASプロジェクトへのスクリプトプロパティの設定

スクリプトを clasp push したら下図のように、対象のGASプロジェクトのスクリプトプロパティに各種情報を入力していきます。

Gas_timecard (1).jpg

最低限必要なのは下記の4つです。

  1. SHEET_ID:勤務表用に作成したGoogleSpreadsheetのIDを指定する
  2. USERS_SHEET_NAME:勤務表用Spreadsheet内の、勤務表作成対象ユーザIDを書くためのシートの名前
  3. SLACK_TOKEN:SLACKのAPI-TOKEN
  4. SLACK_CHANNEL_ID:SLACKの出勤状況ステータス用チャンネルのチャンネルID

SlackのAPIトークンの作成方法などはこちらが参考になります。

【Slack】APIトークンを取得する方法 - 理咲ログ

【Slack】APIトークンを取得する方法 - 理咲ログ

動かしてみる

gasエディタで、関数「main」を選択し、実行ボタンをクリックします。

e2d3402c99a72531576ba28d9441aac0937ce759.jpg

するとSpreadsheet側に下図のようにシートが増えます。
これは対象ユーザシート(画像の場合は"targetusers")の、A列に記載したSlackユーザ名の分だけ作られます。

9f9fd063a08162597e3eb34a5cc08a6ed11f2147.jpg

このようにして動作が確認できたら、下図のようにこのスクリプトにトリガーを設定し、毎日定時に自動実行されるようにしておく事で、自動的に前日分の勤務表が作られていきます。

f80df7747403e73b9609cd8c42e153275f54dd49.jpg

ご注意頂きたいのは「前日分の行だけが作成される」事です。つまり、トリガーによって毎日実行される事により、実行された前日の分の勤務表がシートに追記されていくということです。

1ヶ月分をまとめて作成するように改造というのもできなくはないのでしょうが、GoogleAppsScriptの"1実行あたり6分の実行時間制限"と、SlackAPIの"一度のリクエストでの取得件数の制限"の兼ね合いにより、ユーザ数次第で動作しなくなる恐れがあったためこのような仕様としています。
この懸念が完全に解消されたわけでは全然ないのですが。。

Kintone休暇申請Appと連携する

Kintone連携の場合はちょっと複雑になってきます。
KintoneAPIの実行には、OAuth 認証を必要としますので、Kintone側でClientIDを生成したら
このClientIDを用いてGAS側でOAuth認証を通し、Tokenを取得するという作業が必要です。

この辺りについてはKintone様公式ガイドがものすごく丁寧に書かれていますので、こちらを参考にすると迷うことなく進められると思います。

OAuthクライアントの使用 - cybozu developer network

OAuthクライアントの使用 - cybozu developer network

Google Apps ScriptからOAuth 2.0でkintone APIを利用する - cybozu developer network

Google Apps ScriptからOAuth 2.0でkintone APIを利用する - cybozu developer network

Kintone連携を行う場合には、Slackユーザを列記しているシートのB列に、Slackユーザと対応するKintoneユーザIDも列記する必要があります。
また、GASのプロジェクトプロパティに、下記のようなKintone用の追加設定が必要になります。

  • KINTONE_CLIENT_ID:KintoneのClientID
  • KINTONE_CLIENT_SECRET:KintoneのClient Secret
  • KINTONE_AUTH_CALLBACK:Kintone OAuth2 での認証コールバック関数名(index.ts内のauthCallback)
  • KINTONE_SUB_DOMAIN:Kintone契約サブドメイン
  • KINTONE_APP_ID:Kintoneでの休暇申請を管理しているAppのID

できあがり

こんな感じで毎日自動で記録されていきます。
これで"月末に慌ててオートフィルするだけの簡単なお仕事"から解放されますね!

a2940ce2f464fab453097c5497847582fec9748b.jpg

ご注意

  • 本記事の内容についてコルシス及び清掃員は一切の責任を負いません。
  • 本スクリプトは弊社向けであり、汎用性はありません。
    コード断片などご利用頂くのは全く構いませんが、個々にカスタマイズするのがほぼ必須である事をご承知おきください。
  • Slackステータス変更ミスなどには対応していません。ミスした場合は手作業でSlack上の該当の投稿を削除するなどが必要です。

まとめ

いかがだったでしょうか。

ここまで作ってはみたものの、実は今のところ社内での共有などしておらず、当然ながら勤務表提出ルールを撤廃してコレに変更するといったような社内活動はできておりません。
きっとこの記事を見た管理部が、"勤務表提出ってそんなにストレスなのか・・・" と気付き、ルール変更を検討するという動きが発生するだろうと期待しています。

このコロナ禍での勤務体系の変更などもあり、"リモート勤務した日を記録として自動で残したい!"といったようなお悩みもあるのではないでしょうか。
この方法が完全にオススメというわけではないのですが、何らかの問題解決手段のひとつとしてお役に立てれば嬉しく思います。

そして弊社では、私のような"在り物と小手先でなんとかしようという小賢しい人"や、"もっと強気でドラスティックな改善提案ができる方"など、一緒に働く仲間を随時募集中です。
下記などもご覧頂き、お気軽にご連絡ください。

AWSの設計・構築・運用まで、クライアントとつなぐインフラエンジニア募集! - 株式会社COLSISのインフラエンジニアの求人 - Wantedly

AWSの設計・構築・運用まで、クライアントとつなぐインフラエンジニア募集! - 株式会社COLSISのインフラエンジニアの求人 - Wantedly

一覧にもどる