Microsoft 系のあれこれ

港区の SIer で よくわからんことをしている人です。Xamarin 中心でした。(過去形)

Microsoft Teams を使ってリモートワークでもチームの作業状況を把握する(with Power Automate & Excel)

~まえがき~

  • この記事の対象:
    • コロナウィルスなどの影響で急遽リモートワークの世界に異世界転生してきた Office 365 ユーザーの人たち

コロナウィルスの影響で様々な会社でリモートワークが推奨されるようになりました。
チーム全体が準備期間も満足に取れず、いきなりリモートになったことにより、あまりノウハウもなく、いろいろな問題がもうすぐ散見されることになるでしょう。
その最たる例として ”各人の作業の様子がわからない” みたいなことがあると思います。

よくあるフルリモートの会社さんみたいにWeb 会議ツールで常時繋いでいる、とかじゃなくチャットのみのやり取りの場合、メンバー間だけでなく、リーダーやマネージャーがメンバーの状況がわからないからどんどんモヤモヤが募ってお互い疲弊していきます。(Web 会議ツールで常時繋いでるのがいいと言っているワケではないです。今の世界情勢的に帯域の問題もあるし)
それが行きつくところまで行くと PC 操作ログを収集して稼働時間の管理をどうのこうの…という話になるのではないかと思います。そんな世界は嫌です。

そうなる前にちょっとでもチームメンバー間の心理的安全性の向上を図り、リーダーやマネージャーも全体の状況が把握することができる世界を目指しましょう。
細かいタスクの内容や進捗状況は各プロジェクトで利用している別の管理ツールでチケット管理等するとして、
本記事での目的は
メンバーを ”監視” することではなく、お互いに大した手間をかけずに作業の状況をリアルタイムで「こんなことやってるんだー」程度に知って&知ってもらってモヤモヤを少しでもなくそう
です。(そしてついでに作業報告書みたいなヤツも自動で作っちゃおう。みたいな。)
手間をかけないっていうのが重要だと思います。

よく Slack で使われている "分報" の作業状況の共有に特化したバージョンに近い内容です。
Slackで簡単に「日報」ならぬ「分報」をチームで実現する3ステップ〜Problemが10分で解決するチャットを作ろう | | Craftsman Software Inc.

Office 365 の世界でそれを実現するために Microsoft Teams と Power Automate を利用してみよう、ということです。
ベストな方法ではないかもしれませんし、それぞれの組織や個人によって向き不向きがあるかもしれません。他にもいいやり方があったら教えてください。
まえがきが長くなりましたが、以下から本編です。

本記事の内容でできること

  • Teams の一つのチャネルにメンバー全員の作業状況(例:XXXX画面, 設計書作成 など)が投稿できる(する)ようになる

f:id:ShunsukeKawai:20200409121735p:plain:h600
Teams 画面サンプル

  • 投稿内容を Power Automate で加工しつつ、Excel に登録し、メンバーごとのシートに作業ログを蓄積する
  • Excel でその日の作業時間の集計する

f:id:ShunsukeKawai:20200403145604p:plain
Excel サンプル

STEP1 : Teams にやっていることを書き込むチャネルを作ろう

専用のチャネルを作成します。
これやるだけでもだいぶ違います。(今回の例では「TaskLogger」というチャネルを作っています。)
やっていることを単語で簡潔に記載します。休憩とか終了とかもです。
ここのチャネルにメンバーがみんな投稿するので、だいたいのみんなの動きが把握できます。
Excel 連携とかいらないのであればこれだけやるでもいいでしょう。
なんとなく作業している内容が流れてくるだけでその場にいなくても空気感が共有できて安心できるのではないでしょうか。
いちいち書くのめんどくさいかも知れませんが、慣れてくると逆に「これをやるぞ!」と気合が入るので自分にとってもいい影響があります。

今回は後述する Excel への連携のために以下の半角のカンマ区切りのフォーマットで投稿するルールとしています。スレッドへの返信ではなくルートにメッセージを投稿します。(スレッドにすると他の人の投稿にいちいち通知来てしまうので。チャットでの通知コントロールは重要だと思います。
[category1], [category2], [startDate]

パラメーター 必須 説明
category1 作業カテゴリーその1
category2 作業カテゴリーその2
startTime タスク開始時間(指定しない場合は投稿時間になる)[HH:mm]形式

※ うっかり投稿忘れちゃったりすると思うので、後から投稿できるように任意でstartTimeがあります。

f:id:ShunsukeKawai:20200402174926p:plain
こんな感じ

STEP2 : 投稿したメッセージを Excel にため込もう

せっかく作業を投稿しているので、それを材料に作業報告書みたいな感じで一覧化すると進捗報告・管理とかで楽できるかもしれません。
なので Power Automate(旧 Microsoft Flow)を使って Excel に自動で流し込んでいきましょう。

STEP2-1 : Excel ファイルの作成

本項の内容を以下にテンプレートをアップしています。
1シート(1テーブル)に1人の実績がため込まれます。
"template" シートをコピーして使ってください。シートコピー後、テーブル名を上述のルールで変更してください。シート名も同じにしちゃうとわかりやすいでしょう。
https://1drv.ms/u/s!AteGEPv8p-wMgo0-c6NCfm-qwbX3SA?e=MvEJ7r

Excel を自分で作る場合は作成した Teams チャネルのファイルに Excel ファイルを作りましょう。

f:id:ShunsukeKawai:20200402181151p:plain:w300
Teams 上で作成
TaskLogs.xlsx としておきました。

STEP2-1-1 : Excel のテーブルに名前を付ける

Power Automate で Excel を更新できるのは Excel 内のテーブルに対してです。
後述する処理の中でテーブル名も可変にするためテーブル名は以下のルールで作成してください。(テーブル名には空白文字が設定できないため)
[TeamsのDisplayName(スペース抜き)]
例:川合俊介

f:id:ShunsukeKawai:20200403011615p:plain:w300
Teams の DisplayName はこれ
そしてテーブル名は Excel Onlile では編集できない(っぽい)ため、デスクトップ版の Excel でファイルを開いて テーブルデザインのところからテーブル名を編集してください。
f:id:ShunsukeKawai:20200403013045p:plain
テーブル名編集
テーブルには以下の列を定義しています。

作業日 開始時間 内容1 内容2

f:id:ShunsukeKawai:20200403090227p:plain
こんな感じ

シートとその中のテーブルはメンバー分作成してください。
1ファイルに人数分のシートがあり、そのシートに各個人用のテーブルがある状態です。
誰かひとりが全員分作るだけでよいです。
人数が多くてファイルを分割したい場合や1人1ファイルにしたい場合は Teams のチャネルから Excel ファイル、PowerAutomate の処理(本記事の内容すべて)を複数作成する必要があります。

STEP2-2 : Power Automate の処理作成

Power Automate の作り方を知りたい人以外は本項で作成できる構成を Zip ファイルにして置いておきますのでそれをインポートしてちょっと修正するだけで完成するので本項は飛ばしても大丈夫です。
飛ばす場合は下記リンクからジャンプしてください。
STEP2-3 : Power Automate を Zip ファイルからインポートする へジャンプ

Power Automate の作り方は以下の通りです。(長いです)
1. Teams からのメッセージを受ける
 まずは Teams に投稿されたらキックされるトリガーです。

種類 チャネルに新しいメッセージが追加されたとき(プレビュー)
設定 チーム 投稿するチーム
チャネル 投稿するチャネル
f:id:ShunsukeKawai:20200407150415p:plain:w500
2. 今の日付を変数に入れる
 Teams の投稿日時が UTC で来るので JST に変換して変数に入れておきます。
種類 変数を初期化する
設定 名前 logDate
種類 文字列
addHours(triggerBody()?['createdDateTime'],9,'MM/dd')
f:id:ShunsukeKawai:20200407150447p:plain:w500
3. 投稿されたカンマ区切りのメッセージ配列に格納
 半角カンマ区切りのメッセージ内容を分割して配列変数に格納します。
種類 変数を初期化する
設定 名前 messageArray
種類 アレイ
split(triggerBody()?['body']?['content'], ',')
f:id:ShunsukeKawai:20200407152219p:plain:w500
4. 内容1、内容2、開始時間の変数を初期化
 後で使うそれぞれの変数を初期化します。
種類 変数を初期化する
設定 名前 category1
種類 文字列
種類 変数を初期化する
設定 名前 category2
種類 文字列
種類 変数を初期化する
設定 名前 startTime
種類 文字列
f:id:ShunsukeKawai:20200407152315p:plain:w500

5. パラメーター数が3つ以下だったら
 一応パラメーター数のチェックをして FALSE だったら処理を中止してます。

種類 条件
設定 length(variables('messageArray'))
条件 次の値以下
3
f:id:ShunsukeKawai:20200407152947p:plain:w500
5-1. はいの場合
 ちょっと Power Automate の勉強も兼ねて無駄に複雑にしてしまったので全容をまとめて貼っときます。
f:id:ShunsukeKawai:20200407155651p:plain

5-1-1. パラメーターの配列の1番目をcaregory1に設定
 こいつは絶対入ってる前提で変数に設定します。

種類 変数の設定
設定 名前 category1
種類 文字列
trim(last(take(variables('messageArray'),1)))
f:id:ShunsukeKawai:20200408182207p:plain:w500
5-1-2. パラメーター数による処理分岐
 並列分岐を使ってます。分岐してそれぞれの処理をした後に合流を待機してくれるみたいです。
f:id:ShunsukeKawai:20200407155823p:plain
5-1-2-1. (並列分岐左側)パラメーター数が3つだったら
 配列が3つかで分岐します。
種類 条件
設定 length(variables('messageArray'))
条件 次の値に等しい
3
f:id:ShunsukeKawai:20200408182252p:plain:w500
5-1-2-1-1. はいの場合
5-1-2-1-1-1. パラメーターの配列の3番目をstartTimeに設定
 パラメーター数が3つだったら3番目(開始時間)を変数に設定します。
種類 変数の設定
設定 名前 startTime
種類 文字列
trim(last(take(variables('messageArray'),3)))
f:id:ShunsukeKawai:20200408183452p:plain:w500
5-1-2-1-2. いいえの場合
5-1-2-1-2-1. 投稿日時をstartTimeに設定
 パラメーター数が3つでなかったら(開始時間が設定されてなかったら)Teams への投稿日時を変数に設定します。
種類 変数の設定
設定 名前 startTime
種類 文字列
addHours(triggerBody()?['createdDateTime'],9,'HH:mm')
f:id:ShunsukeKawai:20200408183427p:plain:w500
5-1-2-1. (並列分岐右側)パラメーター数が2つ以上だったら
 配列が2つ以上かで分岐します。
f:id:ShunsukeKawai:20200408184812p:plain:w500
5-1-2-1-1. はいの場合
 パラメーター数が2つ以上だったら2つ目の値を変数に設定します。
種類 変数の設定
設定 名前 category2
種類 文字列
trim(last(take(variables('messageArray'),2)))
f:id:ShunsukeKawai:20200408184925p:plain:w500
5-1-2-1-2. いいえの場合
 なにもしません。
5-1-3. 表に行を追加
 SharePoint のドキュメントライブラリにある Excel ファイルのテーブルに行を追加する処理です。
種類 表に行を追加
設定 場所 Excel がある SharePoint サイト(= Teams のチーム)
ドキュメントライブラリ Documents(Teams のファイル保存先)
ファイル 作成した Excel を指定(Teams だと /チャネル/ファイル)
テーブル
※可変にするためにカスタム式に設定します
replace(replace(triggerBody()?['from']?['user']?['displayName'],' ',''),' ', '')
item
※コピペじゃできないので
それぞれの箇所を
@{} の中身を式で設定する
{
"作業日": @{variables('logDate')},
"開始時間": @{variables('startTime')},
"内容1": @{variables('category1')},
"内容2": @{variables('category2')}
}
f:id:ShunsukeKawai:20200408185652p:plain:w500

以上で Power Automate の処理作成は終わりです。
自分で作成した方は次項は飛ばして大丈夫です。
STEP2-4 : 動作確認 へジャンプ

STEP2-3 : Power Automate を Zip ファイルからインポートする

STEP2-3-1 : Zip ファイルのインポート

Excel テンプレートと同じフォルダに Power Automate の構成用 Zip ファイル が置いてあります。
https://1drv.ms/u/s!AteGEPv8p-wMgo0-c6NCfm-qwbX3SA?e=MvEJ7r

  • その Zip をダウンロードしておきます。
  • 以下に組織アカウントでサインインします。

Microsoft Power Automate | Microsoft Power Platform

  • 左のメニューから「データ」→「接続」→「新しい接続」を選択して接続情報を追加します。(すでに Teams の接続がある方は不要です。)

f:id:ShunsukeKawai:20200403103056p:plain:w300
新しい接続

f:id:ShunsukeKawai:20200403103203p:plain
Teams を選択

  • 確認画面が出てくるので「作成」を押した後認証画面が出てくるのでサインインします。

f:id:ShunsukeKawai:20200403103252p:plain:w500
作成を選択

  • Excel Online (Business) を選択します。(OneDrive の方じゃない)

f:id:ShunsukeKawai:20200403103434p:plain:w500
Business の方を選択

  • Teams と同じようにサインインします。
  • 左のメニューから「マイフロー」→「インポート」を選択します。

f:id:ShunsukeKawai:20200403101813p:plain:w300
インポートを選択

  • 先ほどの Zip ファイルをアップロードします。
  • アップロードに成功すると以下の画面が出てくるので「インポート時に選択する」を選択します。

f:id:ShunsukeKawai:20200407103912p:plain
インポート時に選択する を選択

  • 先ほど追加した接続情報が表示されているので選択して「保存」します。

f:id:ShunsukeKawai:20200403105014p:plain:w300
接続情報を選択

  • もう一つも同じように接続情報を指定して「保存」します。
  • 下記画面になったら「インポート」を選択します。(×と表示されていたり、私のメアドが表示されていますが、気にしないでください。)

f:id:ShunsukeKawai:20200403105448p:plain
インポートを選択

STEP2-3-2 : Power Automate の構成を修正
  • 前項でインポートが完了したら「フローを開く」を選択します。

f:id:ShunsukeKawai:20200403105801p:plain
フローを開く

  • 以下の画面が出てくるので Teams のところを選択します。

f:id:ShunsukeKawai:20200403110417p:plain
Teams を選択

  • わけわかんない文字列が設定されているため、一回消します。

f:id:ShunsukeKawai:20200403112531p:plain
×で消す

  • 使用するチームを選択します。

f:id:ShunsukeKawai:20200403112735p:plain
チームを選択

  • 同じように消してから使用するチャネルを選択します。

f:id:ShunsukeKawai:20200403112838p:plain
設定後

  • 一番下の「パラメーター数が3つ以下だったら」を選択します。

f:id:ShunsukeKawai:20200403113032p:plain
パラメーター数が3つ以下だったら を選択

  • 展開された条件の 一番下の Excel マークの「表に行を追加」を選択します。

f:id:ShunsukeKawai:20200403113141p:plain
Excel を選択

  • 「場所」、「ドキュメントライブラリ」を消してそれぞれ利用するファイルを再設定します。

f:id:ShunsukeKawai:20200403114026p:plain
再設定

  • 「ファイル」を再設定します。

f:id:ShunsukeKawai:20200403114415p:plain
ファイル設定
※ ファイルを再設定するとなぜか「item」が表示されなくなってしまうことがあります。その場合は一度、replace~と書いてあるところを消して、「カスタム値の入力」→「式」のところにreplace(replace(triggerBody()?['from']?['user']?['displayName'],' ',''),' ', '') を再設定すると「item」が復活します。
f:id:ShunsukeKawai:20200403114604p:plain
item が消えちゃった
f:id:ShunsukeKawai:20200403132717p:plain
テーブルを再設定する

  • 画面右上の「保存」ボタンで保存します。エラーがあったらここで表示されます。
STEP2-4 : 動作確認

Teams に投稿してみます。

f:id:ShunsukeKawai:20200403143720p:plain
投稿

しばらくすると Excel ファイルに登録されます。

f:id:ShunsukeKawai:20200403163132p:plain
Yeah!!!!!

STEP2-5 : 注意書きとか便利なところとか


※ Teams で投稿してからフローがキックされ、実際に Excel に値が登録するまで数分ラグがあります。気長に待ってください。みんなが一斉に投稿したりするともっと遅くなるかもしれません。

※ 今回の内容では半角カンマしか対応してません。

※ 内容1と開始時間だけ設定したい場合も内容2をブランクで [XXX, , 18:00] みたいに設定する必要があります。

※ 同じ作業とかで他からそのままコピペすると投稿が html 形式になっちゃって登録はできますが、タグとかもまとめて入っちゃいます。めんどくさいけど、手で入力するか、ctrl + v でなく ctrl + shift + vでテキストのみ貼り付けしてください

f:id:ShunsukeKawai:20200403143319p:plain
html になっちゃうので PlainText で

※ Office 365 に含まれるライセンスの場合、24時間で2,000回が上限(ほかにも使ってたら合計で)みたいです。
要求の制限と割り当て - Power Platform | Microsoft Docs

※ 投稿への返信ではフローがキックされないので、人の投稿(作業内容)で認識違いとかがあったり、気になったら返信することでその場で解消できます。便利。

※ このチャネルを頻繁に利用するハズなので、普段使ってる Teams のアプリとは別にブラウザでこのチャネルだけ開いとくとかをすると便利になるかもしれません。

STEP2-6 : Excel に集計関数を入れてその日の稼働時間を確認する

おまけです。
作業時間や案分を月末とかにまとめている人も多いと思うので
みんな大好き Excel 先生なので、各自好きにやったらいいと思いますが、一例として書いておきます。

f:id:ShunsukeKawai:20200403144903p:plain
集計例
=IF(A2=A3,B3-B2,0) でそのタスクの作業時間を出してます。
=IF(C2="終了",SUMIFS($F:$F,$A:$A,A2,$C:$C,"<>休憩"),"") で内容1が「終了」だったら同じ日の内容1の「休憩」の時間を除いた合計時間を出してます。

※ 深夜12時をまたぐ作業の場合には対応していないので、後で稼働日を直接修正してください。

~あとがき~

長くなってしまったw
今回いきなりリモートワークになって、てんやわんやでドタバタして、落ち着いたら「やっぱ会社にいないと仕事ができないね」って結論にならないように全世界大変な状況だけど、ポジティブに変革のチャンスと考えて楽しみながら少しでもみんなが幸せになれればよいなと思います。

本当に長くなってしましたが、以上です。