人手不足が続くIT業界では、「少数の正社員が多数の非正規社員を管理する「といった業務形態が一般的になりつつあります。
私が従事している実際のプロジェクトでも、正社員4名に対して非正規(派遣)社員8名という業務形態がおよそ1年間続いています。
この記事では、私が複数の非正規(派遣)社員の業務管理をする中で、実際に挙げた課題と、その対策の過程で作成したアプリケーションについて紹介します。
この記事は、以下のような方にご覧いただき、業務内の課題解決の一助となれば幸いです。
- 実務と管理業務を同時に抱えることが多く、その両立に課題を感じている方
- 管理業務を少しでも効率化し、自己実現のための時間を捻出したい方
1. 実務上の課題
1-1. 作業者ごとの進捗状況の変化がリアルタイムに把握できない
私が従事しているプロジェクトでは以下のようなフォーマットのスプレッドシート(以下では、「管理シート」とします。)で、開発案件ごとの進捗状況を管理しています。
2、3、6~8列目はシステム開発特有のものですので、無視していただいても問題ありません。
この管理シートには以下のような課題があると考えています。
→ 作業状況によっては手が空いている作業者が存在し得る
1-2. 作業者からの直接的な報連相が必須
1-1章で述べた通り、管理者から作業者の作業状況の変化を把握できないため、管理者は作業者からの直接的な報連相をキッカケに次の作業を割り振ることになります。
Bさんの場合は作業が完了(Done)となったタイミングで、Dさんの場合は作業が中断となったタイミングで、それぞれ作業者からの直接的な報連相が必要になります。
しかし、新たに着手できる作業があるのであれば、この報連相がない状況でも、直ぐに次の作業に移行してもらうことも可能と考えられます。この場合に必要な段取りとしては、こちらから作業者に対して作業内容を展開するのみで、報連相が苦手な方への配慮をしつつ、作業の隙間時間を最小にできます。
2. アプリケーションの選択
1章で述べた通り、作業者の作業状況の変化がリアルタイムに把握できれば、以下のようなメリットが期待できます。
- コスト面: 「作業者の手が空いてしまう状況を予防」「作業者ごとの作業の隙間時間を最小化」「不要なコミュニケーションを削減」
- 心理面: 「報連相が苦手な方への配慮」
そのため、「作業者の作業状況の変化をリアルタイムに把握する」ことの実現のために、以下の2つのアプリケーションについて調査しました。
- スプレッドシートの情報を操作可能かつ、その変更をトリガーとして実行可能なアプリケーション
- ①のアプリケーションと通信可能なコミュニケーション
2-1. Google Apps Script (GAS)
①の「スプレッドシートの情報を操作可能かつ、その変更をトリガーとして実行可能なアプリケーション」について、候補に挙がったのが「Google Apps Script (GAS)」です。
「GAS」は「Googleが提供するサービスで利用できるスクリプト」であり、スプレッドシートの情報を操作(読み書き)することや、「定期的に実行する」「内容変更時に実行する」といったことも可能です。また、スクリプトの記法がjavascriptと同様ということもあり、HTTP通信用のAPIも使用できます。
「GAS」の「情報を操作(読み書き)」「内容変更時に実行」「HTTP通信が可能」という特徴から、外部のアプリケーションに対してスプレッドシートの変更内容をリアルタイムに通知することが可能なことが分かります。
2-2. Slack/Incoming Webhook
②の「①のアプリケーションと通信可能なコミュニケーション」について、「HTTP通信が可能」な外部アプリケーションは業務内で使用していた「Slack」の拡張アプリ「Incoming Webhook」が候補に挙がりました。
「Incoming Webhook」とは、公式のアプリ情報に記載されている通り、外部ソースからのHTTPリクエストをもとに「Slack」へのメッセージ投稿を可能とするアプリケーションです。
3. アプリケーション概要(GAS)
3-1. 実行トリガー設定
GASは、管理シートの「ツール」タブ -> 「スクリプトエディタ」から作成できます。
GASの実行トリガーの設定は、「スクリプトエディタ」の「編集」タブ -> 「現在のプロジェクトのトリガー」から行います。
トリガーの設定は、トリガーの設定画面の「+ トリガーを追加」から行います。
トリガーの条件は以下の画像を参照してください。
3-2. script(createAndPostMessageToSlack)解説
3-2-1. 開発環境
- [開発環境]: Google Chrome(バージョン: 80.0.3987.122(Official Build) (64 ビット))
- [開発言語]: Google Apps Script (GAS)
3-2-2. メイン関数
メソッド名 | createAndPostMessageToSlack |
メソッド名(和名) | 投稿メッセージ作成、Slackへの投稿リクエスト |
処理概要 | 1. アクティブなスプレッドシート(アクティブシート)、セル(アクティブセル)、および列数などの情報を取得 |
2. サブ関数(get_column_list)でスプレッドシートのカラム名を取得 | |
3. アクティブなセルが監視対象のカラムのものである場合、以下の処理を実行する 3-1. サブ関数(createMessage)で投稿メッセージを作成 3-2. サブ関数(postMessageToSlack)でSlackへの投稿リクエスト |
|
入力 | なし(スプレッドシート上の操作状況) |
出力 | なし(Slackへのメッセージ投稿) |
特記事項 | 1. 監視対象のカラムがシート内に存在しない場合、処理を中断する |
2. アクティブなセルが監視対象のカラムのものでない場合、処理を中断する | |
3. アクティブシート、アクティブセルの情報取得には、API(SpreadsheetApp)を使用しています API(UrlFetchApp.fetch)の詳細はSpreadsheetAppのリファレンスページを参照してください |
3-2-3. サブ関数
(getPayloadJsonForm)
メソッド名 | getPayloadJsonForm |
メソッド名(和名) | ペイロードデータのJson形式変換 |
処理概要 | 1. 引数で指定したユーザ名、投稿メッセージを含んだJsonデータ作成 |
入力(引数) | 1. username: Slackの投稿メッセージに表示するユーザ名 |
2. text: Slackの投稿メッセージ | |
出力(復帰値) | 1. data: Json形式のペイロードデータ |
特記事項 | 1. カラム名が入力されているヘッダ部の行数(開始/終了)と列数(開始)は「header_*_row_num」「header_start_column_num」で指定します |
2. カラム名が入力されているヘッダ部の列数(終了)はスプレッドシートの最大列数を使用します | |
3. ローカル変数のicon_urlを変更することで、Slackの投稿メッセージ上のアイコンを変更できます デフォルト設定: “https://slack.com/img/icons/app-57.png“ |
|
4. ペイロードデータのデータ構成は「Incoming Webhook」のセットアップの手順を参考にしています |
(postMessageToSlack)
メソッド名 | postMessageToSlack |
メソッド名(和名) | Slackへのメッセージ投稿(HTTPリクエスト送信) |
処理概要 | 1. 「Webhook URL」「投稿ユーザ名」を設定 |
2. サブ関数(getPayloadJsonForm)でJson形式のペイロードデータ作成 | |
3. API(UrlFetchApp.fetch)用のオプションデータ(HTTPリクエストのヘッダ+ペイロードデータ)作成 | |
4. API(UrlFetchApp.fetch)を用いて、「Webhook URL」へのHTTPリクエストを送信 | |
入力(引数) | 1. post_message: Slackの投稿メッセージ(String形式) |
出力 | なし(「Webhook URL」へのHTTPリクエスト) |
特記事項 | 1. API(UrlFetchApp.fetch)のオプションデータ内のペイロードデータは、JsonString形式で記述する必要があります |
2. API(UrlFetchApp.fetch)のオプションデータ構成は「Incoming Webhook」のcurlコマンド例を参考にしています | |
3. API(UrlFetchApp.fetch)の詳細はUrlFetchAppのリファレンスページを参照してください | |
4. 「Webhook URL」は「Slack」の拡張アプリ「Incoming Webhook」上で取得したURLを設定します |
(get_column_list)
メソッド名 | get_column_list |
メソッド名(和名) | カラム名リスト取得 |
処理概要 | 1. ヘッダ部の入力データをからカラム名リストを作成 |
入力(引数) | 1. values: アクティブシート内の入力データ(二次元配列形式) |
2. start_row_num: ヘッダ部の行数(開始) | |
3. end_row_num: ヘッダ部の行数(終了) | |
4. start_column_num: ヘッダ部の列数(開始) | |
5. end_column_num: ヘッダ部の列数(終了) | |
出力(復帰値) | 1. column_list: カラム名リスト(一次元配列形式) |
特記事項 | 1. ヘッダ部の行数が2以上の場合、一行ごとのカラム名をスラッシュ(/)で連結したカラム名が作成されます |
(createMessage)
メソッド名 | createMessage |
メソッド名(和名) | 投稿メッセージ作成 |
処理概要 | 1. 現在時刻データを、フォーマット「yyyy/MM/dd HH:mm:ss」で文字列として取得 |
2. アクティブシートのメタデータ(シート名、URL、編集者)を取得 | |
3. 投稿メッセージを作成 | |
入力(引数) | 1. sheet: スプレッドシート内のアクティブシート |
2. values: アクティブシート内の入力データ(二次元配列形式) | |
3. start_column_num: ヘッダ部の列数(開始) | |
4. end_column_num: ヘッダ部の列数(終了) | |
5. target_row_num: 監視対象のカラムの列数 | |
6. column_list: カラム名リスト | |
7. triger_index: 監視対象のカラムのvalues配列のインデックス(列方向) | |
出力(復帰値) | 1. post_message: 投稿メッセージ(String形式) |
特記事項 | 1. 投稿メッセージの構成は「メタデータ」+「アクティブセルと同行の行データ」になります |
2. 現在時刻データの取得には、API(Date、Utilities.formatDate)を使用しています API(Date)の詳細はDateのリファレンスページ(Oracle)を参照してください API(Utilities.formatDate)の詳細はUtilities.formatDateのリファレンスページを参照してください |
|
3. アクティブシートのメタデータの取得には、API(SpreadsheetApp)を使用しています API(UrlFetchApp.fetch)の詳細はSpreadsheetAppのリファレンスページを参照してください |
4. アプリケーション概要(Slack/Incoming Webhook)
4-1. アプリケーションの追加手順
「Slack」の拡張アプリは、ワークスペースの設定 -> 「その他管理項目」 -> 「アプリを管理する」から行います。
「App ディレクトリ」の検索画面で「Incoming Webhook」を検索します。
「Incoming Webhook」のアプリページで、「Slack」に追加をクリックします。
「チャンネルへの投稿」でメッセージを投稿したいチャンネルを指定します。ここで指定したチャンネルはデフォルトで使用されます。投稿したいチャンネルを変更したい場合は、「Incoming Webhook」のアプリを追加するか、HTTPリクエストのデータ内でチャンネル名を指定する必要があります。
4-2. 「Webhook URL」の取得・設定
「Webhook URL」は、4-1章の最後の手順を実施した直後に遷移したページで参照できます。
このページへは、「Incoming Webhook」のアプリページの設定変更(ページ右下部の鉛筆マーク)からも遷移できます。
「Webhook URL」は、3-2-3章のサブ関数(postMessageToSlack)のローカル変数(url)に設定するのみで、「GAS」からのHTTPリクエストを取得できます。
5. 動作確認
管理シートのstatus欄を変更し、Slackのテスト用チャンネルにメッセージが投稿されることを確認します。
No. | 作業No. | 変更内容 | 投稿メッセージ |
1 | 1 | New -> WIP | ![]() |
2 | 3 | WIP -> Done | ![]() |
3 | 4 | Pending -> WIP | ![]() |