作業を効率化しようとする中ではまったPower Automateに関する話
この記事は、「六間坂上 Advent Calendar 2024」15日目の記事になります。
Power Automateを含むMS製品を使って幾つかの作業を効率化できないか試していたら、色々と沼にはまったので、どのような沼にはまったのかを書き出そうと思います。
目次
注意点
この内容は2024年4月頃の話なので、もしかしたら現在はそれぞれの沼に対する解決策があるかもしれません。 (もし解決策があれば教えてください…)
やろうと思ったこと
今回は、Power Automateを利用して、Planner・Teams・Excel Online辺りも使いながら、下記3つの機能を実現しようと手を動かしてみました。*1
- Plannerでタスクを登録すると、そのタスクが登録された旨がTeamsに投稿され、Excelにタスク情報が記録される
- Teamsに投稿されたタスクに返信を行うと、その内容がExcelに記録される
- Plannerでタスク内容を修正すると、その旨がExcelに反映される
簡単なイメージとしては下記の通りです。

Power Automateについて
Power Automateはフロー(一連の作業)を自動化する際に利用可能なMicrosoft製のローコードツールです。検索すれば様々な記事が出てくると思うので詳細は割愛しますが、ここでは最低限知っておいたほうが良さそうな話だけ記載しておきます。
Power Automateのフローは、「何を起点としてフローを実施するか」を定義するトリガー、「何の処理を実行するか」を定義するアクション、の2つで構成されています。条件分岐や繰り返し等もありますが、基本的には「トリガー⇒アクション⇒アクション⇒…⇒アクション」のような形でフローが構成されています。
今回はやろうと思ったことの3つの機能について、それぞれ個別のフローを作成し、各フローが独立して動くような形で実装する予定です。
はまった沼
最終的にPower Automateを利用して上記に近い機能を実現することはできたのですが、それまでに下記のような沼にはまりました。
沼1:Teamsの返信を取得する
機能2を実現するにあたり、「Teamsからの返信を取得した」タイミングをトリガーとしたい場合、「返信」という文字列を含むTeamsのトリガーは存在しません。「チャネルに新しいメッセージが追加された場合」というトリガーもありますが、こちらは返信時の投稿はトリガーされず、返信元の投稿のみトリガーされます。
結局どうするかというと、下図のように「キーワードが言及された場合」というトリガーを利用します。どうやら検索キーワードにワイルドカードが利用できるようで、「"?"」を指定することで返信を含むすべてのメッセージを取得できます。その上で、返信時に含まれる特定の値が存在するかどうかを判定することで、返信を取得できます。

念のためちゃんと返信かどうか判定できているかを確認した結果、下記のように判別できていました。

沼2:Plannerの更新を取得する
機能3を実現にするにあたり、「Plannerでタスク内容を修正した」タイミングをトリガーとしたい場合、これに該当するトリガーは存在しません。沼1:Teamsの返信を取得するは何とかなっていましたが、こちらは本当に存在しません。そのため、定期的にフローを動かすように、「〇分ごとに実行する」トリガーを用意する、等の代替策が必要になります。
沼3:Teamsのプライベートチャネル
Teamsで新しいチームを作成した際、まず全体向けの「一般」チャネルが作成され、それ以外のチャネルはパブリック・プライベートのいずれも作成することができます。 この裏側では、チームに対応したSharePointのサイトが作成され、例えば各チャネルにファイルを投稿する場合、それぞれに対応したSharePointのフォルダ内にファイルが保存される等の役割を果たしています。

一方、上図を確認するとわかるように、プライベートチャネル(鍵付きのチャネル)は、同じSharePointのサイト内に作成されておらず、個別のSharePointサイトが作成されます。この辺りが原因で、ファイルを相対パスで探そうとする等の処理ができないので、例えば複数のチャネルに今回の機能を用意しようとした場合、チャネル別にフローを複製する必要があるようでした*2。
沼4:Excel Onlineの自動処理
Power Automateを利用して、沼3:Teamsのプライベートチャネルで紹介した、チャネル別のSharePointフォルダ内に用意したExcelファイルを操作する際、いくつかのパラメータを指定する必要があります。前提として、Power Automate経由でExcelファイルを操作する場合、Excelの機能を用いて作成したテーブルを指定して、そのテーブルを操作する必要があります*3。
その上で、Excelのテーブルにデータを更新する処理をPower Automateで実装する場合、テーブル内で指定した列の値に合致する行について、その行の値をどのように変更するか設定するようになっています。例えば、下図であれば、指定したExcelファイルのテーブルにおいて、「No.」列の値が「1」である行に対して、「メモ」列の値に「テスト」を記載するよう設定しています。テーブルに存在する列もPower Automateが自動で判定して出してくれるので便利ですね。

上記のように、予め存在する列の値を更新するのであれば問題ないのですが、例えばテーブルに新しい列を増やして更新を行いたい場合や、列名を動的に指定して値を更新したい場合は困りどころです。その場合、「項目のプロパティを指定する」パラメータを利用すると、JSON形式で更新する値を指定できます。この方法であれば、新規の列名を指定しても新しい列を増やせますし、列名を変数にすれば動的に値を設定できますが、このパラメータが出現する条件が分かりません。昔の私は他の項目を色々といじってこのパラメータを何とか出した記憶があるのですが、記事作成時点で試行錯誤してもパラメータを出せませんでした…*4

まとめ
Power Automateは製品に合わせた処理方法や認証はかなり自動で実施してくれて便利な一方、痒い所に手が届かないところが複数ある印章を受けました。 その他、MS製品の細かい仕様等に悩まされることも多く、気軽にローコード・ノーコードで効率化しよう、と言うのは難しいなぁという感じです。 あと、Power Automateで作成したフローは、作成した個人に紐づいてしまうため、例えば他の人に引継ぎを行う場合が面倒なように感じました。
テンプレートに沿ってメールを自動作成する等の内容は本当に気軽にできますが、少し凝ったものを作ろうとした途端に難易度が跳ね上がるように感じました…
効率化するって大変なんだなぁ(小並感)