ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【Power Automate】グループチャットの発言から特定の言葉を抽出して記録する

この記事は RPACommunity Advent Calendar 2022 に参加しています。
adventar.org


今回の主旨はフローを使ってグループチャットの発言を特定のルールをもとに抽出するです。

今回作成したフローをGitHubで公開しました。下記リンク先からダウンロードしてください。
github.com

概要

今回はフローでグループチャットの発言に含まれる絵文字をSharePointリストに記録します。
※会議チャットの発言でも使えます

背景

数日前に下記のフローを公開しました。
wataruf.hatenablog.com

このとき公開したフローはMicrosoft Teamsの会議チャットの発言で特定の条件を満たした場合(例:斧の絵文字が含まれている場合)に自動でフローbotが応答するです。

今回のフローでも同じトリガーを使います。ですが今回はフローbotによる自動応答ではなくSharePointリストへのアイテム投稿を行います。

解説するフロー図

アクションの設定を閉じた状態のフロー図


開いた状態のフロー図

フローの使用イメージ

前準備

まずはグループチャットのIDを取得します。

グループチャットを開いたときのURLを取得します。このURLの「/conversations/」と「?ctx=chat」の間にある文字列をメモに控えます。この文字列はグループチャットの会話ID(conversationId)です。

会話IDの例:

https://teams.microsoft.com/_#/conversations/ 19:61167d4f3f824bab806f2b4197f02c70@thread.v2?ctx=chat


フローを開いて「作成-定数-処理対象の会話ID」アクションに入力します。入力が済んだらフローを保存します。

あとはフローを実行するユーザーをグループチャットに含めて、準備完了です。

フローの実行

グループチャットで参加者がそれぞれ発言します。発言には絵文字を含めます。


グループチャットで誰が、いつ、絵文字を含めた発言をしたのかがSharePointリストにアイテムとして記録されます。

発言に絵文字が含まれていない場合はリストアイテムの作成は行われません。

ステップごとの解説

解説の範囲(前回のフローと重複するアクションの解説は割愛)

下図の赤枠で囲んだ箇所は前回のフローと重複するため解説を割愛します。

今回はこの部分を解説します。

「作成-本文」アクション

このトリガーは「データ操作」>「作成」です。「メッセージ詳細を取得する」アクションの出力情報に含まれる本文(content)を取得します。


このアクションに記載している式:

@outputs('メッセージ詳細を取得する')?['body/body/content']


取得した本文(content)の例:

<p>わたしは<span title="微笑むロボット" type="(smilerobot)" class="animated-emoticon-20-smilerobot"><img itemscope="" itemtype="http://schema.skype.com/Emoji" itemid="smilerobot" src="https://statics.teams.cdn.office.net/evergreen-assets/personal-expressions/v2/assets/emoticons/smilerobot/default/20_f.png" title="微笑むロボット" alt="🤖" style="width:20px; height:20px"></span>でした</p>


「条件-本文に絵文字のIMG要素が含まれている」アクション

このトリガーは「コントロール」>「条件」です。本文に絵文字が含まれているかどうかを判定します。


分岐条件:

・outputs('作成-本文')
・次の値を含む
・'<img itemscope="" itemtype="http://schema.skype.com/Emoji"'


Teamsに使われる絵文字は正確には文字ではなく画像です。この画像はIMGタグで表されます。

絵文字を表すIMGタグには固定で以下の属性情報は含まれていますこの情報の有無で絵文字の有無を判定します。

  • itemscope="" itemtype="http://schema.skype.com/Emoji
「条件-本文に絵文字のIMG要素が含まれている」が「はい」の場合

この分岐では何もアクションを使用しません。本文に絵文字が含まれていることが判明しました。ここでは何もせず、後続のアクションに進ませます。


「条件-本文に絵文字のIMG要素が含まれている」が「いいえ」の場合

この分岐では「コントロール」>「終了」アクションを使用します。本文に絵文字が含まれていないことが分かりました。そのため、フローをここで終了させます。

「作成-絵文字のIMG要素」アクション

このトリガーは「データ操作」>「作成」です。本文に含まれるIMG要素のテキストを取得します。

このアクションに記載している式:

slice(
substring(outputs('作成-本文'),indexOf(outputs('作成-本文'),'<img itemscope="" itemtype="http://schema.skype.com/Emoji"'))
,
0
,
add(IndexOf(substring(outputs('作成-本文'),indexOf(outputs('作成-本文'),'<img itemscope="" itemtype="http://schema.skype.com/Emoji"')),'>'),1)
)


取得したIMG要素の例:

<img itemscope="" itemtype="http://schema.skype.com/Emoji" itemid="smilerobot" src="https://statics.teams.cdn.office.net/evergreen-assets/personal-expressions/v2/assets/emoticons/smilerobot/default/20_f.png" title="微笑むロボット" alt="🤖" style="width:20px; height:20px">


「作成-絵文字の本体」アクション

このトリガーは「データ操作」>「作成」です。IMG要素から絵文字を取得します。絵文字はalt属性から取得します。

alt属性(オルト属性)とは本来は画像が表示されなかった場合の代替手段(alternative)として表示させるための文言であり「代替テキスト」とも呼ばれています。

取得する箇所は下記の通り、IMG要素のalt属性です。

<img itemscope="" itemtype="http://schema.skype.com/Emoji"; itemid="smilerobot" src="https://statics.teams.cdn.office.net/evergreen-assets/personal-expressions/v2/assets/emoticons/smilerobot/default/20_f.png" title="微笑むロボット" alt="🤖"; style="width:20px; height:20px">


このアクションに記載している式:

slice(
substring(outputs('作成-絵文字のIMG要素'),indexOf(outputs('作成-絵文字のIMG要素'),'alt="'))
,
add(nthIndexOf(substring(outputs('作成-絵文字のIMG要素'),indexOf(outputs('作成-絵文字のIMG要素'),'alt="')),'"',1),1)
,
nthIndexOf(substring(outputs('作成-絵文字のIMG要素'),indexOf(outputs('作成-絵文字のIMG要素'),'alt="')),'"',2)
)


取得した絵文字本体の例:

🤖


ここでは文字の抽出をslice関数nthIndexOf関数 で実現しています。

この2つの関数は文字の抽出でとても役に立ちます。


slice関数:

指定テキストから任意の開始・終了位置の部分文字列を切り出す関数です。substringと似ていますが、どこまで切り出すかの指定が文字数(substring)か位置(slice)かの点が異なります。
slice('<text>', <startIndex>, <endIndex>)


参考:
Power Automate 「slice」関数 | 誰でもできる業務改善講座


nthIndexOf関数:

指定テキストが任意の番目で一致する開始位置を取得します。
nthIndexOf('<text>', '<searchText>', <occurrence>)


参考:
Power Automate 「nthIndexOf」関数 | 誰でもできる業務改善講座

「作成-絵文字のタイトル」アクション

このトリガーは「データ操作」>「作成」です。

IMG要素から絵文字のタイトルを取得します。

<img itemscope="" itemtype="http://schema.skype.com/Emoji" itemid="smilerobot" src="https://statics.teams.cdn.office.net/evergreen-assets/personal-expressions/v2/assets/emoticons/smilerobot/default/20_f.png" title="微笑むロボット"; alt="🤖" style="width:20px; height:20px">


このアクションに記載している式:

slice(
substring(outputs('作成-絵文字のIMG要素'),indexOf(outputs('作成-絵文字のIMG要素'),'Title="'))
,
add(nthIndexOf(substring(outputs('作成-絵文字のIMG要素'),indexOf(outputs('作成-絵文字のIMG要素'),'Title="')),'"',1),1)
,
nthIndexOf(substring(outputs('作成-絵文字のIMG要素'),indexOf(outputs('作成-絵文字のIMG要素'),'Title="')),'"',2)
)


取得した絵文字のタイトルの例:

微笑むロボット

「項目の作成」アクション

このトリガーは「SharePoint Online」>「項目の作成」です。ここまでのステップで取得した入力情報をもとにリストアイテムを作成します。

入力情報:

"item/Title": "@convertTimeZone(outputs('メッセージ詳細を取得する')?['body/createdDateTime'],'UTC','Tokyo Standard Time','yyyy/MM/dd HH:mm:ss')",
"item/OData__x8ab0__x304c_": "@outputs('メッセージ詳細を取得する')?['body/from/user/displayName']",
"item/OData__x7d75__x6587__x5b57_": "@outputs('作成-絵文字の本体')",
"item/OData__x7d75__x6587__x5b57__x306e__x54": "@outputs('作成-絵文字のタイトル')"


このアクションによってリストにアイテムが投稿されます。
 ※ちなみに今回のフローでは列をすべて「1行テキスト」にしています。列の種類は変更することも可能です

フローをGitHubで公開しています(再掲)

今回作成したフローをGitHubで公開しました。下記リンク先からダウンロードしてください。
github.com


今回は以上です。