今日もローコードで業務改善をしたい

Power AutomateやPower Appsなど、Power Platformに関して学んだことを書いています。

Teamsチャネルに投稿されたメッセージをSharePointリストに格納する

はじめに

この記事は、Power Automate Advent Calendar 2022 カレンダー2の 12月10日(土)担当分の記事です。


Teamsを使っていて、参加しているチームが多くてどこにどのメッセージがあったかわからなくなる時はありませんか?

Power Automateを使ってチャネルに投稿されたメッセージをリストに格納すれば、後で一覧で確認/検索もできるのではとふと思いました。

また、フローを複製することで、別チームのメッセージも同じリストに格納することができます。
メッセージに添付されたファイルもリストの「添付ファイル」列に格納することができます。

更にリストに格納するときに、アイテムごとに固有のアクセス権を付与することで、自分が参加しているチームに投稿されたアイテムしか表示しないこともできます。
※リストのアイテムごとに固有のアクセス権を付与できるのは5,000件までです

今回は、これらの機能をPower Automateで自動化したので、作り方を紹介します!

フロー全体図


このフローは、以下を想定しています。
・Teamsチャネルに投稿されたメッセージと添付ファイル、リンクをSharePointリストに格納
・アイテムごとに個別(チーム別)のアクセス権を付与

用意するもの

SharePointリスト

以下のような列を作成してください。
赤枠の部分が新たに作成した列になります。それ以外は規定列です。
チーム列は、どこのチームから投稿されたかわかりやすくするためにチーム名が記載された選択肢列としました。

私は以下のように列を並び替えました。「添付ファイル」も規定列です。

フロー作成手順

1.チャネルに新しいメッセージが追加されたとき

Power Automateを開き「作成」>「自動化したクラウドフロー」をクリックします。

トリガーに「Microsoft Teams」の「チャネルに新しいメッセージが追加されたとき」を選択し、以下を指定します。


チームID:SharePointリストに格納したいチームID
チャネル:SharePointリストに格納したいチームのチャネル

2.メッセージ詳細を取得する

「+新しいステップ」から「Microsoft Teams」の「メッセージ詳細を取得する」アクションを選択し、以下を指定します。


メッセージ:動的なコンテンツより「チャネルに新しいメッセージが追加されたとき」の「メッセージID」
メッセージの種類:チャネル
チーム:トリガーで指定したチームID
チャネル:トリガーで指定したチャネル

3.条件

「+新しいステップ」から「組み込み」の「コントロール」>「条件」アクションを選択し、以下を指定します。


左辺:動的なコンテンツより「メッセージ詳細を取得する」の「本文コンテンツ」
次の値に等しくない
右辺:systemEventMessageを画像のように入力してください

この条件アクションは、たまにチャネルに投稿していないのに空白のアイテムが作成されるときがあり、その正体がsystemEventMessageだったため、回避するために入れています。

systemEventMessageは、チャネルの追加などのTeamsのイベントのことを指しており、イベントをきっかけにフローがトリガーされてしまうケースが過去に何回かありました。
systemEventMessageに関する詳細情報は、以下リンクを参考ください。
learn.microsoft.com

4.以下はいの場合「Htmlからテキスト」

「+新しいステップ」から「Content Conversion」の「Htmlからテキスト」アクションを選択し、以下を指定します。


動的なコンテンツより「メッセージ詳細を取得する」の「本文 コンテンツ」

Htmlからテキストに変換させることで、後にSharePointリストに格納するときに綺麗なテキストが入ります。

5.項目の作成

「+新しいステップ」から「SharePoint」の「項目の作成」アクションを選択し、以下を指定します。


サイトのアドレス:SharePointリストがあるアドレス
リスト名:事前に作成したSharePointリスト
Title:動的なコンテンツより「チャネルに新しいメッセージが追加されたとき」の「メッセージ件名」
投稿日時:動的なコンテンツより「チャネルに新しいメッセージが追加されたとき」の「メッセージcreatedDateTime」
Teamsで見る:動的なコンテンツより「メッセージ詳細を取得する」の「メッセージリンク」
本文:動的なコンテンツより「Htmlからテキスト」の「プレーンテキスト」
チームValue:任意の選択肢
投稿者Claims:動的なコンテンツより「チャネルに新しいメッセージが追加されたとき」の「メッセージfromユーザーdisplayName」

6.アイテムまたはファイルの共有を停止します

「+新しいステップ」から「SharePoint」の「アイテムまたはファイルの共有を停止します」アクションを選択し、以下を指定します。


サイトのアドレス:SharePointリストがあるアドレス
リストまたはライブラリ名:事前に作成したSharePointリスト
ID:動的なコンテンツより「項目の作成」の「ID」

アイテムごとに個別のアクセス権を付与させるため、このアクションでアクセス権の停止を行います。

7.アイテムまたはフォルダーへのアクセス権の付与

「+新しいステップ」から「SharePoint」の「アイテムまたはフォルダーへのアクセス権の付与」アクションを選択し、以下を指定します。


サイトのアドレス:SharePointリストがあるアドレス
リストまたはライブラリ名:事前に作成したSharePointリスト
ID:動的なコンテンツより「項目の作成」の「ID」
受信者:チームのメールアドレス
ロール:Can View
受信人への通知:いいえ

受信者で指定したチームに属している人にアイテムのアクセス権が付与されます。

※注意点
SharePointリストのアイテムごとに個別のアクセス権を付与していますが、付与できるのは5,000件までになっています。
5,000件を超えるアイテムをリストに格納される場合はご注意ください。

8.Apply to each

「+新しいステップ」から「組み込み」の「コントロール」>「それぞれに適用する」アクションを選択し、以下を指定します。


動的なコンテンツより「チャネルに新しいメッセージが追加されたとき」の「メッセージ添付ファイル」

9.パスによるファイルコンテンツの取得

Apply to each内で「+新しいステップ」から「SharePoint」の「パスによるファイルコンテンツの取得」アクションを選択し、以下を指定します。


サイトのアドレス:SharePointリストがあるアドレス
ファイルのパス:Shared Documents/チャネル名/Item(‘Apply_to_each’)?[‘name’]

ここでは、添付ファイルがチャネル直下にあることを前提にしています。

10.添付ファイルの追加

Apply to each内で「+新しいステップ」から「SharePoint」の「添付ファイルの追加」アクションを選択し、以下を指定します。


サイトのアドレス:SharePointリストがあるアドレス
リスト名:事前に作成したリスト
ID:動的なコンテンツより「項目の作成」の「ID」
ファイル名:式よりItem(‘Apply_to_each’)?[‘name’]
ファイルコンテンツ:動的なコンテンツより「パスによるファイルコンテンツの取得」の「ファイルコンテンツ」

おまけ

SharePointリスト書式設定1:行をコンパクトに表示する

格納したTeamsメッセージが長文だと、標準では縦長の行になり見づらくなってしまいます。そこで、列の書式設定を用いて「本文」列をコンパクトに表示させます。

1.「本文」列を左クリックし、「列の設定」>「この列の書式設定」をクリックします。

2.「詳細モード」をクリックします。

3.JSONの編集画面になるので、以下に置き換えます。

{
"$schema": "https://developer.microsoft.com/json-schemas/sp/column-formatting.schema.json",
"elmType": "div",
"style": {
"display": "block",
"max-height": "10px",
"padding": "11px 0",
"overflow": "hidden"
},
"txtContent": "@currentField"
}

これを行うと、複数行テキスト列がだいたい3行までの表示になるので、リスト全体がコンパクトに表示されておすすめです!

SharePointリスト書式設定1:ハイパーリンク列をアイコンにする

メッセージリンクがハイパーリンク列に格納されるのですが、そのままだと長いURLが格納されてしまいます。
代替テキストに変えるという方法もありますが、せっかくならアイコン表示にしちゃいましょう。

1.「Teamsで見る」列を左クリックし、さきほどと同じ手順でJSONの編集画面に行き、以下に置き換えます。

{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
"elmType": "a",
"style": {
"text-decoration": "none",
"font-size": "25px",
"margin": "0 auto"
},
"attributes": {
"iconName": "TeamsLogo",
"target": "_blank",
"href": "=@currentField"
}
}


ちなみに、"iconName"の「"TeamsLogo"」の部分を変えると他のアイコンになります。
アイコン一覧は以下のサイトを参考ください。
www.flicon.io
これで、ハイパーリンク列がTeamsアイコンになり、Teamsアイコンをクリックすると該当メッセージに飛ぶことができます。

さいごに

私の部署では、グループ会社さんや派遣さんがいるため、業務連絡用のチームが複数あります。
(プライベート/共有チャネルは使っていません)

いずれか1つだけの参加であれば問題ないのですが、すべてのチームに参加していたため、どこにどのメッセージがあるかわからなくなることが多々ありました。

複数ある業務連絡用のチームのメッセージをひとつのリストに格納したら、一覧で表示することができて結構便利なのでは?と思い、今回のフローを作成しました。

他にもいい使い方はあると思うので、よかったら作ってみてください!