概要
用途が限定的ですが、表題の通りです。
Teamsチャネル投稿をトリガーとし、そのメッセージにキャプチャ画像が含まれていれば、sharepointサイトに画像を保存します、というものです。
簡易フロー
Teamsに新しい投稿があったら働き出します。

左の続き。

詳細フロー
新しいデザイナーを使用しています
チャネルに新しいメッセージが追加されたとき
トリガーは「チャネルに新しいメッセージが追加されたとき」です。
似てる名称で「チャットに新しいメッセージが追加されたとき」や「チャットまたはチャネルに新しいメッセージが追加されたとき」がありますので、間違わないように注意

画像を投稿するチームを設定しましょう。
Teams名と、どのチャネルに投稿するのか、です。
投稿されるたびフローが起動しますので、新しいチャネルを新設して、画像専用の投稿チャネル、と割り切った方が使い勝手が良いです。
変数を初期化する
画像ではアクション名を「タイトル」と変更しています。
あとで保存画像のファイル名に、投稿メッセージのタイトルを付与するための変数です。

| アクション名 | タイトル |
|---|---|
| 名前 | タイトル |
| タイプ | 文字列 |
| 値 | (動的なコンテンツ)メッセージ件名 ※ |
※「表示数を増やす」で「メッセージ件名」を見つけるか、検索ボックスに「件名」などと入れて見つける方法があります。
動的なコンテンツの後に「_(アンダーバーを入れておきましょう)」

タイムゾーンの変換
ファイル名に日本時間で秒数まで入れたかったので、タイムゾーンの変換を挿入します。
「日時」で検索すると出てきます。
いつも日本語表記だったのに、なぜか今回は英語表記(;^_^A


Base timeはトリガーから動的コンテンツで「メッセージ作成のタイムスタンプ」を設定。
Source time zone は変換前の時間、UTCを設定。
Destination time zone は変換後の時間「大阪、札幌、東京」を設定。
Time unitは出力の書式設定。
以下を設定します(自由)
yyyyMMddHHmmss変数を初期化する
「変数を初期化する」アクションを2つ入れます。
1つ目は「サイトURL」で、2つ目は「フォルダのパス」。
保存先のURLをユーザーに明示するときに必要ですが、内部的な処理で今回のフローを使用する場合は、不要です。


適宜、自分の環境に書き換えてください。
★サイトURL
https://●●●●.sharepoint.com/sites/●●●●★フォルダのパス
/Shared Documents/●●●●ドキュメントフォルダの直下に保存する場合は「/Shared Documents」だけで良いと思います。
条件
投稿メッセージに画像データが含まれているか否かで分岐させます

動的コンテンツはトリガーの「メッセージ本文コンテンツ」を設定します。
@{triggerOutputs()?['body/body/content']}コンテンツ内に img タグが含まれていたら…という設定にします
とりあえずimgタグが始まるところを設定しておけば良いかなと。
<img以降は分岐の true 部分だけを作成していきます
false は画像が含まれていない場合の処理なので、今回は設定しません
作成
データ操作 > 作成

画像のURLを取得します
動的コンテンツではなく式で以下を設定
HTML文字列の中から src=”…” のURL部分だけを抜き出す処理です。(ちなみに最初の画像しか取得できません)
@{split(
split(triggerBody()?['body']?['content'], 'src="')[1],
'"'
)[0]}元データを取得
triggerBody()?['body']?['content']トリガーの本文(HTMLなど)を取得
src=” で分割
split( ~ , 'src="')画像が含まれているHTMLソースには「src=”」が絶対あるはずなので、これをキーにして前後にsplitで分割すると、↓↓ こんな感じになります
[
'<img ',
'https://example.com/image.png" alt="">'
][1] で後ろ側を取得
さっき img と https… と2分割した後ろの方を採用します、という意味。
前の方(img)を採用したい場合は [0] を使います
これで取得した情報は下記のようになってるはずなので
https://example.com/image.png" alt="">png 以降は削除したい。それが次。
” でさらに分割
split(上の結果, '"')ちょっと分かりにくいけど「”」で前後に分割したので、以下のような情報を取得できているはず
[
'https://example.com/image.png',
' alt="">'
]次は、2分割された「前」の方を採用したい。
[0] でURLだけ取得
さっきやりましたね、[0] で前の方を取得できます
最終的に
@{split(
split(triggerBody()?['body']?['content'], 'src="')[1],
'"'
)[0]}上記を設定することで、コンテンツ内の画像URL(src=”…”)の中身だけを取り出すことが可能です
完全に備忘録だけど次に同じことやろうとしてまた詰まるんだろうなぁ(;^_^A
Microsoft Graph HTTP 要求を送信する

img のURLが分かったので、そのコンテンツ(画像データ)を取得するため、HTTP要求します。
URIには先ほど「作成」した「画像のURL」の出力を設定。
メソッドは「GET」です。
他は設定不要です。
ファイルの作成

今まで作成してきたパーツを寄せ集めます。
サイトのアドレス
変数の初期化で設定した、サイトURLを設定。
フォルダーのパス
変数の初期化で設定した、フォルダのパスを設定。
ファイル名
式で以下を設定。
メッセージ投稿時に「タイトル」が設定されていれば、「タイトル+投稿日時&秒」のファイル名で画像が保存されます
concat(variables('タイトル'),body('タイム_ゾーンの変換'), '.png')ファイルコンテンツ
「Microsoft Graph HTTP 要求を送信する」の「本文」を設定。( ↓↓ ですね)
@{body('Microsoft_Graph_HTTP_要求を送信する')}チャネル内のメッセージで応答します
無事に画像が保存されたら、投稿したメッセージに自動で「ここに保存されたよ!」と返信するためのアクション

左記はあくまで一例として、自分の環境に合わせた設定にしてください。
新しいデザイナーは URL の挿入に難があって困りますよね。
右上の </> マークでコードに変換し、URLのところにサイトURLとフォルダのパスの変数を組み合わせ設定しましょう。
例)
<p class="editor-paragraph">画像が保存されました</p><br><p class="editor-paragraph">保存先は【<a href="@{variables('サイトURL')}@{variables('フォルダのパス')}" class="editor-link">こちらです</a>】</p><br><br>実行結果
以下のようにメッセージ返信がされ、画像データも保存されます。

sharepointサイトの指定場所に保存された画像です ↓↓

メッセージに何枚も画像キャプチャが貼られていても、取得保存できるのは最初の1枚のみです。
応用すればできるんだろうけど力尽きました。
私はユーザー側に「1枚ずつ投稿してね」という運用にします。
