Teams チャットの見落としを防ぐために Power Automate を使って 3 ステップでリマインダー通知を実装する

2020年09月25日 金曜日


【この記事を書いた人】
古賀 勇

IIJ ネットワーク本部アプリケーションサービス部・(兼)社長室所属。 メールサービスの運用業務に従事し、日々世界の悪と戦う一児の父親。社内 Power Automate エバンジェリスト(自称)。M3AAWG member / openSUSE Users / WIDE Project メンバー。趣味は大喜利。はがき職人。

「Teams チャットの見落としを防ぐために Power Automate を使って 3 ステップでリマインダー通知を実装する」のイメージ
更新情報(2021/10/25)

本記事公開時点では、「○○分後に通知」という相対時刻を指定するテンプレートでしたが、現在は通知して欲しい日付と時刻をユーザが指定するようにテンプレートが更新されています。
本文中のスクリーンショットと異なりますが、フローの組みかたや、基本的な改良の方法は変わりませんので、ぜひご参考ください。

⇒ 前置きは飛ばして手順を見たい方はこちら

今月の初頭、社内ブログにとある記事が投稿されました。

Teams のチャットすら見落とす

IIJ 広報部 副部長、堂前さんのつぶやきです。

社内外から受信するメールの数が多すぎて、返信できないことがある、というのは過去にも言われてきたことですが、これが Teams でも同じことが起き始めているとのことです。(だから反応がなくてもチャットを無視しているわけではないんです、という内容の主張)

 

COVID-19 で多くの企業がテレワークへ移行し、社内のコミュニケーション手段が大きく様変わりしました。

オフィスにいるときは、近くの席の人に何か頼みごとをしたり、「ちょっとこの件、お願い!」と伝えるとき、その場で伝えたり催促することができましたが、テレワークでは多くの場合、それがチャットツールになります。

チャットツールの代表格である Microsoft Teams や Slack には相手にメッセージを送って伝えたり、部署・チーム内で情報を共有するのにとても便利です。また、メールするほどではないけれど気軽に何かを伝えたい、電話するほどではないけれど見ていたら今すぐ回答が欲しい、といったシーンで、読者のみなさまの企業・チーム内でも活躍していることでしょう。

しかし、打ち合わせの最中や、業務に集中して取り組んでいるときに送られてきたメッセージで、「今はちょっと反応できない」、「少し考えてから返事したいな」、「できれば後で通知して欲しい」と思えるメッセージが送られてくることもあります。メールの場合はメーラーや IMAP の機能でフラグを付けておいて、後から見返したりすることもできますが、チャットツールは次から次に送られてくるメッセージに埋もれて、その存在を忘れてしまうことがあります。

IIJ の顔とも言える堂前さんの芸能活動に、支障が出てはならない。

そこで、自称 Power Automate エバンジェリストの私が(今初めて自称しました)、Power Automate で Teams のリマインダー通知を、たったの 3 ステップで実装する方法を、みなさまに伝授いたします。

手順

1. Power Automate にサインインする

やはり自動化は正義である

やはり自動化は正義である

2. テンプレートがあるのでそれを使う

Follow up on a message テンプレートを選択

3. 編集画面になるので、適当な名前を付けて保存

Follow up on a message テンプレート
「状況」がオンになっていることを確認

「状況」がオンになっていることを確認します。
とりあえず通知できればいい場合は、これでおしまいです。簡単ですね。

 

使いかた

1. あとで通知させたいメッセージの「…」をクリックして、「その他の操作」→「Follow up on a message (先ほど作ったフローの名前)」を選択します(表示されるまでに数秒が掛かることがあります)。この例はチーム内のチャネルの発言を選択していますが、1対 1のチャットや、グループチャット、Teams 会議中のチャットにも対応しています。

Follow up on a message を選択

2. どれくらい後に通知してほしいかダイアログが表示されるので、選択して「Submit」ボタンを押します。
どれくらい後に通知して欲しいか選択

3. 指定時間が経過すると、Flow ボットが通知してくれます。
Flow ボットによる通知

ここで「View message」をクリックすると、指定したメッセージに移動できます。
対象のメッセージにジャンプ

やったね!

フローを改良する

テンプレートは素っ気ないアダプティブカードなので、もう少し機能を追加したい場合は、このテンプレートを元にフローを編集できます。例えば、次のようなことが考えられます。

 

待ち時間のバリエーションを増やす

デフォルトのテンプレートでも、そこそこ使えますが、もうちょっと本気出すまでの選択肢を増やしたくなったとします。これはとても簡単で、アダプティブカードの内容を編集するだけで OK です。その日のうちに終わらせなければいけない用途であれば、1時間後〜12時間後の 12個の選択肢があれば十分でしょう。

アダプティブカードの編集

カードの編集したい場所をクリックして、選択肢を増やしたり減らしたりできます。テンプレートは英語なので、日本語化したいときも、ここから選択肢を編集します。編集が終わったら、「カードの保存」をして、フローの「保存」をクリックすると反映されます。

待ち時間のバリエーションを増やす

 

Teams だけではなくメールでも通知する

Teams で見逃してしまうのに、Teams で通知したら意味がないかもしれません。

そこで自分宛てにメールしておく、というオプションも追加しておきましょう。メールに Teams の Permanent link も付けておけば、後でやっぱり Teams でスレッドを見たくなったときにも一発で飛べます。また、メールしておくことで、流れてしまうチャットをアーカイブする的な用途にも使えるでしょう。

ついでに、メールの件名を編集できるようにして、ちょっとしたメモを追記できるようにしておくことにします。あとで思い出す時のキーワードにしたり、発言するほどではないけれど自分がどんなことを考えていたか、といったメモを追記できます。そうすれば、お気に入りのメーラーで件名をキーに検索することも可能です。

少々ややこしくなりましたが、アダプティブカードとフローはこんな感じになります。

メールオプションを追加したアダプティブカードの例

メールオプションを追加したフロー例

    • アダプティブカードの編集
      • 「この件について自分宛てにメールも出す」というチェックボックスを追加しました。これは Input.Toggle を使います。Element Properties の Id が、Power Automate に渡される変数名です。チェックボックスの変数名は email としました。チェックボックスがオンになると、これが True になります。
      • 次に件名を入力できるよう、Input.Text でフォームを追加しています。変数名は email_subject としました。Placeholder に文字列を入れておくと、何を入力すればいいのかヒントになります。ここでは「件名」と入力しておきました。

       

    • アダプティブカードから受け取る変数定義
      • フローの始めの方で変数を 2回定義しています。これはメールにリマインドされる時刻を追記したかったからですが、時刻計算に使う addMinutes() が加算する時間(分)にとる引数は int 型です。
      • しかし、アダプティブカードから受け取る変数は string 型です。
      • 一般的なプログラミング言語であれば一発で int() にキャストすればよいのですが、Power Automate はキャストできる変数が予め制限されていて、さらに自分自身の変数を再定義できないため、まどろっこしいのですが、他に方法がないのでこのようになっています。(アダプティブカードから受け取る string 型を汎用的な変数にコピーしてから、その変数を int 型に変換)
        int(variables('本気出す一時変数'))

         

  • リマインドされる時刻計算
    • Power Automate 内で一貫した時計は UTC です。(タイムゾーン変換で、変換後の時刻を管理することもできますが、基準となる時刻は UTC に揃えておき、表示するときにだけ変換したほうが無難です)
    • 日本時間に直すため 9時間足した上で、さらに待ち時間を加算しています。件名は長くなると視認性が悪くなりますので、表示を “MM/dd HH:mm 〆” としました。
      addMinutes(addHours(utcNow(), 9), variables('何分後に本気出すか'), 'yyyy/MM/dd HH:mm:ss')

こんな感じで入力すると、
メールも出すオプションをアダプティブカードに追加した例

こんな感じのメールが届いて、指定時刻に通知もされます。
メールオプションでも通知される例

 

予定表にも入れておく

ここまで読んでくださっているかたは、Power Automate の可能性に魅了されてきたのではないでしょうか。楽しくなってきましたので、さらに予定表にも入れておくオプションを追加しましょう(※1)。そして、「○分後」のような相対時間ではなく、日付と時刻を入力できるようにします。予定表に入れておくことで、「忘れないぞ!」という意志表示と、Outlook の権限設定によっては他人からもタスクが見えるようになります。

アダプティブカードを編集して、日付と時刻を入力できるフォームを追加してみました。アダプティブカードはこんな感じです。

予定表にも追加するオプションを追加するアダプティブカードの例

先ほどと同じように Input.Toggle で「この件を予定表に入れる」チェックボックスを追加しました。Id は schedule です。

その下は見栄えの問題ですが、ColumnSet を使って 3列表示にしたあと、それぞれ左から順に TextBlock(ただのテキスト)、Input.Date、Input.Time を配置して、日付と時刻を入力できるようにしています。Input.Date の Id (変数名) は、schedule_date、Input.Time は schedule_time としました。

「この件を予定表にも入れる」オプションを追加したフローは、次のとおりです。
この件を予定表にも追加するオプション フロー例

早速、試してみます。
予定表に入れるオプションを追加した例

Teams のメッセージが予定表に追加されました!
Teams のメッセージが予定表に追加されました!

ちなみに入力された件名を Flow ボットが通知するアダプティブカードにも再利用できます。例えばこんな感じです。(※2)
Flow ボットが通知するアダプティブカードにも件名を追加した例

 

明日から本気出す

さらに機能を追加する

このように Power Automate を使えば、まるでプラモデルを組むかのように、自分が使いやすいよう、さらに独自に機能を追加することができます。思いつくものだけでも、以下のようなことが考えられます。

  • メールを送るオプションに、別の宛先を指定できるようにする。(※3)
  • 予定表のオプションに「非公開」オプションを付ける。
  • 部署チームの Planner にタスクとして登録するオプションを追加する。
  • 指定時刻になったら、スマートフォンにもプッシュ通知する。

などなど、夢は広がります。

みなさんも自由に機能を足してみてください。
ポイントはいきなり大きなフローを組むのではなく、少しずつ機能を足していくことです。Power Automate は所有者をグループにすることもできますので、作ったフローをチーム内で共有することもできますよ。(※4)

 

付録: Power Automate でよく使う関数逆引きチートシート

Power Automate の残念なところは、公式の圧倒的なドキュメント不足です。そのため、トライ&エラーを繰り返して勘所をつかんでいくしかないのですが、同じ轍を踏まないように参考になるリファレンスを記しておきます。(たまに自分も見ます)

日付をいい感じに出力したい

欲しい形式 Power Automate date コマンドで書くと
2020/04/01 addHours(utcNow(), 9, ‘yyyy/MM/dd’) date “+%Y/%m/%d”
2020/05/16 (今日から30日後) addDays(addHours(utcNow(),9), 30, ‘yyyy/MM/dd’) date –date “30 days” “+%Y/%m/%d”
14:56:23 addHours(utcNow(), 9, ‘HH:mm:ss’) date “+%H:%M:%S”
月曜日を現す 1 dayOfWeek(addhours(utcnow(), 9)) date “+%u”

 

Microsoft Teams 関連

  • 特定のユーザにメンションしたい
    • <at>(メールアドレス)</at> タグで囲む。
  • メッセージの改行がおかしい
    • 1つだけの改行は無視される。2つ改行を入れると、空行 + 改行が入る。
    • Teams は HTML タグが使えるので、フローの見栄えと揃えたい場合は <br> タグを入れる。

 

Microsoft Planner で開始日と終了日を指定する時のフォーマット

雑に addHours(utcnow(), 9) とかするのではダメで、以下のようなフォーマットで指定する必要がある。

formatDateTime(utcNow(), 'yyyy-MM-ddTHH:mm:ss.fffZ')

 

OneDrive for Business でたまにエラーが出る

1コネクション、60秒ごとに API 100 コールのスロットリングが入っている。
https://docs.microsoft.com/ja-jp/connectors/onedriveforbusiness/

    • これに抵触すると、実行中に HTTP 429 や、HTTP 502 が返り、フローに異常がないのにエラー終了するようだ。
    • Apply to each 内で OneDrive の操作をしているときに抵触しやすいと考えられるが、再現性がないためトラブルシューティングが難しい。
    • こんな感じで OneDrive の操作前後に sleep を入れると回避しやすい。
      OneDrive for Business でたまにエラーになるときの回避方法

 

HTML をテキストに変換したい

Power Automate の中でも便利な機能の一つに承認のアクションがあるが、このアクションに指定できる本文は Markdown 形式なので、メールや予定表から流用すると表示が崩れてしまう。HTML → Markdown にコンバートする方法は現時点ではなさそうだがテキスト形式にはできる。ただし、改行は失われる。

html to text

 

変数をうまく扱えないケース

どういうわけか変数の直前に “@” が入ると、うまく変数が展開されないようである。
"@" が変数の直前に含まれていると、うまく変数展開されない例
仕方ないので、苦肉の策でこうする。

    • 1つ目の変数初期化で、”@” の後ろにホワイトスペース ” ” を入れておく
    • 2つ目の変数初期化で、そのホワイトスペースを replace() で取り除く
      replace(variables('固定メールアドレス (不使用)'), ' ', '')

少々ダサいのですが、こんな感じになります。
変数がうまく展開されない例の解決法

日本語訳が分かりにくいところ

中途半端に日本語訳されているせいで逆に分かりにくくなっているところ。

アクション 元の表現 (英語) 日本語表現
データ操作 Data operations データ操作
  compose 作成
  join 参加

制限事項

  • ?鍵付きの非公開チャネルには使えない
    • このリマインダーは 1 対 1 のチャットや、グループチャット、自分自身の発言にも使えるのですが、鍵付きの非公開チャネルには使えません。
    • その非公開チャネルに、Power Automate が接続できないからです。
  • コールできる API 数に制限がある
    • いっそのこと、「何かキーワードが入力されたら、全部自動的に通知するように仕掛けたらいいのでは」と思いつきますが、これはやってはいけません
    • これをすると指定したチャネルで発言があるたびに API が発行されるため、チャネルの発言数によっては、あっという間に API コール数の制限値に達してしまいます。

注釈

    1. 予定表といえば、過去に投稿した「Microsoft Power Automate (Flow) で Outlook の予定表を自動承諾する」も、ぜひご覧ください。こちらでも Power Automate を活用しています。 [↑]
    2. ここまでのフロー作成に要した時間は約 3時間ほどです。慣れの問題もありますが、全くコードを書かない「ノーコード開発」でも、そこそこのものが作れてしまうのが Power Automate の素晴らしいところです。また、大きな機能が提供されるのではなく、小さな部品をパーツごとに組み合わせていく思想は、過去に投稿した「UNIX という考え方」に通ずるところがあります。 [↑]
    3. 宛先の指定方法にはご注意ください。指定の方法によってはセキュリティ事故となる可能性があります。また、組織のポリシーによっては社外へのメール送信が禁止されているケースもありますので、「できるからやっていい」のではなく、常に組織のセキュリティポリシーと照らし合わせるようにしてください。[↑]
    4. 機能を追加して他人が使うようになると、そのぶんエラーハンドリングが重要になってきます。自分が使う程度でしたら、それほど問題になりませんが、エラーハンドリングこそ開発の要とも言えます。今回は触れていませんが、本気出すまでの時間が選択されずに実行されたり、予定表に入れるオプションで過去の日付が指定されたら場合は、すぐに Flow ボットに通知させる、といったことが考えられます。[↑]

 

古賀 勇

2020年09月25日 金曜日

IIJ ネットワーク本部アプリケーションサービス部・(兼)社長室所属。 メールサービスの運用業務に従事し、日々世界の悪と戦う一児の父親。社内 Power Automate エバンジェリスト(自称)。M3AAWG member / openSUSE Users / WIDE Project メンバー。趣味は大喜利。はがき職人。

Related
関連記事