Power AutomateでTeamsに投稿された内容をSharePointに転記する際、チャットに貼り付けられた画像は後続のアクションで使用できません。
今回は、コピー&ペーストでTeamsチャット欄へ貼り付けた画像を抜き出し、本文とともにSharePointリストへ転記する方法をご紹介します。
- 前提
- 概要
- 本文をsplit
- 文章か画像か判別する
- HTTPアクションで画像を取得し、SharePointにファイルを作成
- 本文の該当箇所に画像を差し込む
- SharePointリストの項目を作成
- フロー実行後の結果
- まとめ
前提
- HTTPアクションを利用するためPower Automateのプレミアムライセンスが必要
- 事前にMicrosoft Entra IDアプリ登録が必要
- 今回利用するアクセス許可は下記
- アクセス許可の種類:アプリケーション
- アクセス許可:ChannelMessage.Read.All
- 「<テナント名>に管理者の同意を与えます」を有効にする
- 今回利用するアクセス許可は下記
概要
Teamsチャネルに新規投稿があると本文をSharePointリストに転記します。
本文内に画像が含まれている場合は、SharePointに画像ファイルを作成して本文に組み込みます。
利用する変数は以下の二つです。
- TeamsText:SharePointリストに転記するメッセージを格納(アレイ型)
- imagecount:本文内に含まれる画像の数(数値型)
フローの概要は以下です。(投稿本文から画像を抜き出す箇所のみ抜粋)
本文をsplit
まず、チャネルに投稿されたメッセージを、使用されているタグごとに分割します。
split(
outputs('メッセージ詳細を取得する')?['body/body/content'],
coalesce(
if(contains(outputs('メッセージ詳細を取得する')?['body/body/content'], '<div>'), '<div>',
if(contains(outputs('メッセージ詳細を取得する')?['body/body/content'], '<p>'), '<p>',
if(contains(outputs('メッセージ詳細を取得する')?['body/body/content'], '<span>'), '<span>',
outputs('メッセージ詳細を取得する')?['body/body/content'])))
)
)
文章か画像か判別する
分割したメッセージごとに処理を実行するため、Apply to eachを使用します。
画像部分にはGraphのURLが含まれるため、条件を設定して後続アクションを設定します。
- 左の値:Apply to each 現在のアイテム
中央の値:次の値を含む 右の値:https://graph.microsoft.com/v1.0/teams
HTTPアクションで画像を取得し、SharePointにファイルを作成
画像は 以下のようにHTML タグの img で表現されています。
"<span<img height=\"238\" src=\"https://graph.microsoft.com/v1.0/teams/xxxxxxx/channels/xxxxxxx/messages/xxxxxxx/hostedContents/xxxxxxx/$value\" width=\"286\" style=\"vertical-align:bottom; width:286px; height:238px\"></span>\n\n\n</div>\n\n\n</div>\n</div>"
img タグの src で指定されている箇所(「https://」から「$value\」)を抜き出しHTTPアクションのURIに指定します。
slice(items('Apply_to_each'),indexOf(items('Apply_to_each'),'https:'),add(IndexOf(items('Apply_to_each'),'$value'),6))
※認証は「Azure Directory OAuth」を選択し、各項目を設定します。
Graph API 経由で取得できた画像をpngファイルとしてSharePointに保存します。
その後、保存したファイルのメタデータを取得します。
本文の該当箇所に画像を差し込む
画像のUniqueIdとWidthを取得してTeamsText変数に格納します。
UniqueId
slice(outputs('パスによるファイル_メタデータの取得')?['body/ETag'], add(indexOf(outputs('パスによるファイル_メタデータの取得')?['body/ETag'], '{'), 1), indexOf(outputs('パスによるファイル_メタデータの取得')?['body/ETag'], '}'))
Width
replace(slice(items('Apply_to_each'),indexOf(items('Apply_to_each'),'width='),indexOf(items('Apply_to_each'),'style=')),'\','')
TeamsText
<iframe src="https://SharePointサイトURL/_layouts/15/embed.aspx?UniqueId=@{outputs('UniqueIDの取得')}" @{outputs('widthの取得')} height="250" frameborder="0" scrolling="no" allowfullscreen title="@{outputs('パスによるファイル_メタデータの取得')?['body/Name']}"></iframe>
Apply to eachアクションの後、TeamsText変数を適切なタグを使用して結合します。
if(contains(outputs('メッセージ詳細を取得する')?['body/body/content'], '<div>'), '<div>',
if(contains(outputs('メッセージ詳細を取得する')?['body/body/content'], '<p>'), '<p>',''))
SharePointリストの項目を作成
結合したメッセージをSharePointリストの複数行テキストに設定します。
※SharePointリストの投稿内容を格納する列は「複数行テキスト」で拡張リッチテキストを有効にします。
フロー実行後の結果
▼Teams投稿内容
▼SharePointリスト転記後
まとめ
- Teams のメッセージ内に貼り付けた画像は本文に img タグで埋め込まれます。
- Apply to eachで処理を繰り返すことにより、本文中に複数画像があっても対応可能です。
- Replace関数で、元のメッセージのimgタグ部分の文字列を置き換えることでSharePointリストの複数行列に画像を埋め込めます。