はじめに
例えば、Teamsのチャネルの投稿を全て抜き出して
SharePoint ListやDataverseなどにナレッジとして整理して移行したいとします。
↓参考

Teamsのチャネルからデータを抽出する際、Power Automateの「チャネル内のメッセージを取得する」アクションから、投稿本文(コンテンツ)を取得することが多いと思います。
このとき、投稿がHTML形式で返されるため、画像が含まれている投稿では、HTMLの中に次のようなMicrosoft Graph APIのURLが含まれています。
<img src="https://graph.microsoft.com/beta/teams/{team-id}/channels/{channel-id}/messages/{message-id}/hostedContents/{hosted-content-id}/$value"…>
この画像まで取得しようとすると、ここで一つ壁にぶつかります。
以前は、Teamsの投稿に含まれる画像を取得するために、Azureでアプリ登録を行い、Microsoft Graph APIの権限を付与してGraph APIを呼び出す方法を利用していました。
しかし、会社によってはセキュリティ上の理由からアプリ登録やGraph APIの権限付与が制限されていることがあります。
ところが、今回検証してみたところ、以前とは少し事情が変わっていました。
- アプリ登録を行わなくても画像を取得できる
- Power Automateの「Microsoft Graph HTTP 要求を送信する」標準アクションを利用する
-
hostedContents/{id}/$valueを呼び出して画像を取得できる - Teamsの投稿に含まれる画像を取得できる
つまり、これまでアプリ登録が必要だと思っていた画像取得処理を、Power Automateの標準アクションだけで実現できるようになっていました。
じゃあ何で取得できなかった?
そもそも、なぜ今までTeamsチャネルの投稿に含まれる画像を取得できなかったのでしょうか。
実は、Microsoft Graph APIの hostedContents/{id}/$value を使って画像を取得する処理には、以前、Logic AppsやPower Automateのコネクタ側で問題がありました。
問題があった出力内容は下記記事の出力結果が参考になると思います。
(記事投稿主様、参考とさせていただきました。ありがとうございます。)
Microsoft Q&Aでも同様の問題が報告されており、2024年10月にはMicrosoft側でこの問題についてバグが起票されているのが確認できました。
その後、2025年9月にはMicrosoft社員から修正された旨のコメントがあり、2026年4月には実際に正常に画像を取得できるようになったことが上記Q&Aから確認されています。
つまり、以前うまく取得できなかったのは、Graph APIの権限設定の問題ではなく、コネクタ側で画像のバイナリレスポンスを正しく扱えない問題があったためでした。
そして現在はhostedContents/{id}/$value から画像本体を取得すると、
- $content-type
- $content
がきちんと返ってくるようになっています。
つまり、以前からAzureでアプリ登録を行い、Microsoft Graph APIの必要な権限を付与すれば、hostedContents/{id}/$valueから画像を取得すること自体は可能でした。
一方で、Power Automateの「Microsoft Graph HTTP 要求を送信する」アクションから同じAPIを呼び出した場合には、取得した画像のバイナリレスポンスをコネクタ側で正しく扱えない問題がありました。
そのため、これまでは「アプリ登録をしてGraph APIの権限を付与する」という方法が必要になるケースがありました。
今回、このコネクタ側の問題が修正されたことで、アプリ登録を行わなくても、Power Automateの標準アクションからGraph APIを呼び出して画像を取得できるようになった、というのが今回のポイントです。
よし、検証してみよう
下記の順で、実際にSharePointの複数行に画像が表示できるかやってみます。

1.SharePointのListを準備
SharePointListの複数テキスト列に画像を表示できるか試したいのでListを用意しました。

画像を含むHTMLを保存したいので、「その他のオプション」から「拡張リッチテキストを使用する」をONにして、msg列を作成します。
次にPower Automateのフローを作成します。
2.「チャネル内のメッセージを取得する」で投稿内容を取得する
まず、「チャネル内のメッセージを取得する」アクションで、画像のURIが含まれている投稿を取得します。

実行履歴から、body>contentの中の画像データの所を確認し https://graph.microsoft.com/ ~ $value の部分をコピーしておきます。
https://graph.microsoft.com/beta/teams/{team-id}/channels/{channel-id}/messages/{message-id}/hostedContents/{hosted-content-id}/$value
3.「Microsoft_Graph_HTTP_要求を送信する」にURIを設定する
「Microsoft_Graph_HTTP_要求を送信する」アクションに上記のURIを設定します。

このURLを「Microsoft Graph HTTP 要求を送信する」アクションのURIに設定します。
4.実行する

フローを実行をしてみると、contentに画像データがBase64形式で返されていることが確認できました。
また、content-typeには画像のMIMEタイプが返されています。
この2つの値を使えば、取得した画像をファイルとして保存できます。
5.Teamsの画像を「ファイルの作成」でSharePointのドキュメントフォルダに保存
「ファイルの作成」アクションでは、以下を設定します。
- サイトのアドレス:保存先のSharePointサイト
- フォルダーのパス:画像を保存するフォルダー
-
ファイル名:
$content-typeから画像の拡張子を取得 -
ファイルコンテンツ:
$contentをbase64ToBinary()関数でバイナリに変換した値
※画像は白抜きしています。
ファイル名:
test.@{last(split(
body('Microsoft_Graph_HTTP_要求を送信する')?['$content-type'],
'/'
))}
ファイルコンテンツ:
base64ToBinary(body('Microsoft_Graph_HTTP_要求を送信する')?['$content'])
これで、Teamsから取得した画像をSharePointのドキュメントフォルダに保存できます。
6.「項目の作成」アクションで複数行列に画像を埋め込む
最後に、SharePointのドキュメントフォルダに保存した画像を、SharePoint Listの複数行テキスト列に表示させます。
<p class="editor-paragraph">これは説明文です。</p>
<a href="@{concat(actions('ファイルの作成')?['inputs']?['parameters']?['dataset'],outputs('ファイルの作成')?['body/Path'])}">
<img src="@{concat(actions('ファイルの作成')?['inputs']?['parameters']?['dataset'],outputs('ファイルの作成')?['body/Path'])}" width="400">
</a>
<p>続きの文章です。</p>
ここでは、「ファイルの作成」アクションで保存した画像のSharePointサイトURLと画像ファイルのPathを組み合わせて、画像のフルパスを作成しています。
そのフルパスをimgタグのsrcに指定することで、複数行列の本文中に画像を表示できます。
また、aタグで画像を囲んでいるため、縮小された画像をクリックすると元サイズの画像ファイルを開くこともできます。
結果
まとめ
現在は、Microsoft Graph APIから$content-typeと$contentを取得できるため、Power Automateの「Microsoft Graph HTTP 要求を送信する」アクションを使って、取得した画像をSharePointなどに保存できます。
つまり、アプリ登録ができない環境でも、Teamsの投稿を画像付きで移行できる可能性があります。
※テナント設定や権限などによって動作が異なる場合があると思いますので要検証です
Teamsへの投稿は手軽ですが、ナレッジとして残すのであれば、画像も含めて投稿時の情報をそのまま再利用できるほうが便利です。
今回、それができるようになったことは、私にとって今年の検証の中でも一番うれしい発見のひとつでした。
検証していても面白かったので筆が乗りました。
次回は、取得した画像をDataverseへ登録するところまで試してみたいと思います!



