Microsoft Power AutomateとTeamsでリモートワークでも確認事項を漏らさない仕組みを作ってみた

この記事は、 NTT Communications Advent Calendar 2021 7日目の記事です。

はじめに

はじめまして!PS本部DPS部門の福島です。 コンテンツデリバリーネットワークというサービスのセールスエンジニアをやっています。

今回はアドベントカレンダー企画と言うことで、Microsoft Power AutomateとTeamsを使って確認事項や締め切り通知を自動化したお話をします。 エンジニアブログとしては、まだこういったRPA(Robotic Process Automation)のお話は未投稿でした。 そこで、コードいらずで誰でも実践しやすいMicrosoft Power Automateで作る RPA が初回記事としてピッタリと思って今回投稿しています。

Microsoft Power Automateとは

Microsoft Power Automateは公式サイト(https://powerautomate.microsoft.com/ja-jp/) にあるように、確認のプロセスや反復作業などを自動化するためのツールになります。 各デスクトップ上で動作できる無料の Power Automate Desktop と従来のクラウド型サービスである Power Automate があり、前者は各クライアント端末上での自動化に、後者はチーム内のプロセス自動化に、それぞれ長けていると思います。

それぞれアプリケーションも用意されていて、今回説明するPower Automateはブラウザ上でも操作できます。 Desktop版と違い、O365の利用が必要だったり、有償だったりという点はあるのですが、担当全体を巻き込んだプロセスの効率化を実現できます。

やりたかったこと

今回の目的=実現したいこととしては 「リストから締め切りの近い項目について、通知してくれるRPAの実現」 になります。

うちの担当では、検証機で導入しているツールのライセンスや、監視サービスなどを利用しています。 この利用料について社内で決裁を毎年取っていて、担当の週次定例で決裁期限の近いものがないか、みんなで確認をしています。

ただ、普段その決裁を対応している人がうっかり漏らすと、対応が遅れ、決裁期限を過ぎてしまうということになりかねません。 実際にはそういったうっかりはなかったものの、忘れていたせいで対応を開始したかった時期より遅れてしまうということは、時々起きていました。

そこで決裁について対応期限が近付いているものを、人で確認するのではなく、自動で通知してくれるようなRPAが組めないかと思い、手を出したのがPower Automateになります。

設計

流れの説明

作成に当たり、以下のような流れを想定しました。

 ①エクセルの決裁リストを取り込む

 ②取り込んだリストから期限の近づいているものを識別する

 ③期限の近いものがあればTeamsで色んな人を巻き込んで通知する

いくつか準備や段階は踏まなければいけませんが、結果的にこの流れで実現できました。 ①は定例で利用している既存のものがありましたので、そちらを流用することにしました。

※画像はサンプルです。

f:id:NTTCom:20211129180635p:plain

②はそのリストをPower Automateで取り込み、期限について何日前なのか確認する処理になります。 リストでは決裁の実際の期限と別に、その決裁の対応を開始すべき日程も入れてみました。

③は期限確認した決裁について、近いものがあればTeamsで通知する処理です。 Teamsに投稿することでチームのみんなが見られるようにしています。 また、チームの複数名をメンションすることで、担当者が漏らしても周りの人が気づけるようにしてみました。

事前準備

実際に作成したときは、既に存在しているエクセルの決裁リストを利用しました。 今回はサンプルで用意した先ほどのエクセルを利用して、実際に作成しながら記事にしていきたいと思います。

まずは準備として、エクセルのリストをPower Automateが読み込める形にします。 目視で見やすいリストにするだけではだめで、エクセルの機能として「テーブル化」というものがあり、これを実行する必要があります。

テーブルにしたい範囲を選択して「挿入タブ」の「テーブル」を押すと、テーブルにできます。 これで準備完了です。

f:id:NTTCom:20211129180642p:plain

テーブルにしたセルを選択しているとき、「テーブルデザイン」というタブが現れるようになります。 後々使いやすいように、テーブルの名前を変えておいてもいいかもしれません。

f:id:NTTCom:20211129180649p:plain

Power Automateでのフロー作成

ここまでの準備が出来たら実際の設計に移ります。 Power Automateのメニュー画面で「作成」を選択すると、以下のようにフローを作成する画面になります。

f:id:NTTCom:20211129180655p:plain

今回作りたいのは定期的にリストを確認し、締め切りに近いものが無いか確認する仕組みなので、スケジュール済みクラウドフローで作成していきます。 今回のRPAは、最初の処理としては以下のようにしてみました。

f:id:NTTCom:20211129180703p:plain

定期実行してくれるトリガーが最初に入っていますので、このフローは設定した頻度で自動実行されるようになります。 その後、締め切り通知してほしいリストが入力されているエクセルファイルを読み込みます。 各処理の名称はわかりやすい形に変更できるのですが、後でどの機能かわかりにくくなるため、処理を挿入する際に表示される機能名は別途(機能名:~~)という形で併記しました。

その後の処理は以下のようになっています。

f:id:NTTCom:20211129180709p:plain

締切を確認するために現在時刻を「シリアル値」と呼ばれる形に変換しています。 また、この後計算で利用するために、変数の定義として「決裁開始日」「契約開始日」を準備し知恵ます。

コードの知識が不要、と言いつつ複雑な計算式は要求してしまうのですが・・・。 ここではざっくり、以下の計算式を使うと、現在時刻がPower Automate上で扱いやすい形になる、とだけ紹介しておきます。 「値」の入力欄をクリックしたあとに出てくる吹き出しメニューから、式のタブを選択することで入力できます。

div(sub(ticks(startOfDay(convertFromUtc(utcNow(), 'Tokyo Standard Time'))), ticks(startOfDay(convertFromUtc('1899-12-31T00:00:00Z','Tokyo Standard Time')))), 864000000000)

Power Automateでは、エクセルから取得する日付を、シリアル値、と呼ばれる形式で管理します。 その対応をやりやすくするために、あらかじめ現在時刻のシリアル値を用意しています。 詳しいことが知りたい場合はGoogleなどで「Power Automate 現在時刻 シリアル値」と検索してみてください。

最後の「Teamsに投稿」の部分は省略表示になっていますが、ここまでがフローの全体像です。 最後のTeamsに投稿する処理については、以下のようにしています。

f:id:NTTCom:20211129180716p:plain

Apply to eachという、繰り返しの処理を行ってくれる機能を入れて、そこにエクセルから取得したデータ=valueを設定することで、リスト内の各項目に対して繰り返しの処理を実行してくれるようにしています。 ここも全部説明したいのですが、長くなってしまうので割愛しながら書くと

 ①リストにデータが入っていること=空白でないことを確認し

 ②現在確認している項目の、決裁開始日や契約開始日に応じて条件を設定し(条件、条件2、条件3)

 ③合致した条件に応じたメッセージを投稿する

という流れになっています。

①と②の間に、念のため型判定の処理も入れています。 これはPower Automateにおいて、エクセルから取得される日付の形式が、通常はシリアル値なのですが、たまにMicrosoftが仕様変更して一時的にタイムスタンプ形式になっているということがあったためそのエラー対策になります。

条件、条件2、条件3 の中で実際にTeamsへメッセージが投稿されています。 やっていることは基本的に3つともすべて同じで、契約開始日や決裁開始日より何日前か、の日数ごとに条件を作成しています。 例として条件2の内部を紹介すると以下のようになっています。

f:id:NTTCom:20211129180722p:plain

条件2は、決裁期限=契約開始まで15日を切ったもの、を通知してくれる処理になります。

※ちなみに 条件 では、1か月前の通知、条件3 では、遡及警告、をそれぞれ担ってます。

決裁開始日が今日の日付を過ぎており、契約開始日まで15日を切っている、ただし契約開始日はまだ先である、という3段階の条件文になっています。 これに合致したときの処理が以下のようになっています。

f:id:NTTCom:20211129180729p:plain

Teamsの対応するチャネルにメッセージ文を投稿しています。 決裁件名や、いつまでに対応が必要か、などがわかるような投稿文にしてみました。 また <at> </at> で組織ID(主にメールアドレス)を囲うことで、Teamsで使っている「メンション」の機能を利用できます。 これを使って、決裁の担当者のメールアドレスをエクセルに記録しておけば、担当者にメンションで通知させることができます。

f:id:NTTCom:20211129180736p:plain

実際に投稿されている様子が上の画像の通りになります。 担当者にメンションしつつ、チャネルにも投稿することで担当のメンバーが対応されているか確認しやすくなっています。

作ったうえでの効果

実際に作ってみて担当として効果があったかですが、先にも書いた通り、そもそも対応忘れによる遡及まで発展したケースはこれまでありませんでした。 ただ、対応開始遅れは年に1,2件発生していました。それがこの仕組みを導入してからは発生しなくなっています。

また、人の手で個別に確認する手間もなくなったので、年1回の決裁対応後にリストを更新さえしておけばよく、確認稼働もある程度低減できています。

決裁開始期限、契約期限、という一見ややこしい2つの日付を用意したおかげで、決裁ごとに通知タイミングも柔軟に設計できるようになりました。

これをわざわざ用意した理由は 「各決裁ごとに、対応を始めたい期間に差異があるから」 になります。

例えば海外とのやり取りが発生するような決裁では、見積りのやり取りなど、準備だけで時間がかかります。 そういった対応まで加味して、決裁開始期限、を設定しておけば、決裁開始期限になったときの通知で「あ、そろそろあの会社にメール送っておかないと」というふうに気づきやすくなると思います。

うちの担当においては、この仕組みを導入することで、対応漏れの防止や稼働効率化に一定の効果があったと考えています。

おわりに

新型コロナが日本では落ち着いてきているとはいえ、世界的な感染状況を考えると、リモートワークはまだまだ続けていきたいという方や、そのように指示している企業も多いかもしれません。 リモートワークは通勤などのストレスが無く、自分で働く環境を設計しやすい反面、最大の欠点として「他のメンバーとのコミュニケーションレスに陥りやすい」ということが挙げられると思います。

コミュニケーションレスが原因となって引き起こされる事象は多々あるかと思いますが、今回挙げたような事務対応においても、担当者がちゃんとやっているか、確認しづらくなるということもあるのではないでしょうか。 そんなとき、Teamsなどで担当全体に通知してくれる仕組みがあれば、事務対応の取りこぼしも起こりにくくできます。

また、コロナの感染状況に関わらず、今後は自動化やRPAの活用がどんどん進んでいくことと思います。 今回紹介したのはそれほど大きく稼働を削減するような内容ではありませんが、それでも一定の効果は出せています。 こうした事務作業のところから徐々に自動化を進めて行ければと考えていますし、今回の記事が少しでも皆様のお役に立てれば幸いです。

明日の記事もお楽しみに!

付録

ここからは今回使用した式の簡単な紹介等になりますので、読み飛ばしていただいても問題ありません。 また、あくまで簡易紹介ですので、詳細は別途Googleなどで調べてください。(社内の方は福島までご質問いただければ時間のある時に回答できるかもしれません)

型判定

最後のTeamsに投稿する処理の繰り返し文で、日付の型判定は以下の式で行いました。

タイムスタンプ:endsWith(string(items('Teamsに投稿(機能名:Apply_to_each)')?['契約開始日']), '.000Z')

この式の動的部分は items('Teamsに投稿(機能名:Apply_to_each)')?['契約開始日'])  になります。 これは「Teamsに投稿」と名付けた機能に設定された「value」から、リストの「契約開始日」を見る動的コンテンツになります。 「value」には一番最初に読み込んだエクセルのテーブルに入っているデータが格納されています。

この処理でエクセルから取得された契約開始日が、「000Z」で終わるタイムスタンプ形式になっていないか確認しており、この条件に合致すればタイムスタンプ形式で日付を取得してしまっています。 今のところ、タイムスタンプかシリアル値のいずれかが、Power Automateで利用されている日付表現方式なので、この式に合致しなければ高確率でシリアル値です。

シリアル値での処理を想定して作成されていますので、タイムスタンプで取得した場合は、シリアル値に以下の式で直します。

シリアル値への変換式:div(sub(ticks(items('Teamsに投稿(機能名:Apply_to_each)')?['契約開始日']), ticks(startOfDay(convertFromUtc('1899-12-31T00:00:00Z', 'Tokyo Standard Time')))), 864000000000)

動的コンテンツが入力できない時

動的なコンテンツ、では読み込んだリストの各項目を動的変数のような形で入力可能です。 しかし、場合によっては以下のようにコンテンツが出てきてくれないことがあります。

f:id:NTTCom:20211129180742p:plain

ちなみに動的コンテンツが出てくるときはこんな感じです。リストの項目が直接入力できるようになってます。

f:id:NTTCom:20211129180748p:plain

こういうときは、どこか別のところで該当の動的コンテンツや変数を入力していないか確認します。 入力していたら、該当のコンテンツをマウスオーバーしてみてください。 代替テキストとして、式の中身が出てくるはずです。

f:id:NTTCom:20211129180755p:plain

変数もこのようにどういう式を書けばそれが入力できるのかマウスオーバーすれば確認できます。

f:id:NTTCom:20211129180801p:plain

動的コンテンツが自動入力できない時や、動的コンテンツ・変数を利用した式を書きたい時には、マウスオーバーすることで、直接入力するための文字列を確認できますので試してみてください。

© NTT Communications Corporation All Rights Reserved.