Microsoft365」カテゴリーアーカイブ

[PowerApps]入退室管理システム

PowerAppsで部屋の入退室管理システムを作成します。

システムに対する要件

  • 部屋および建物の使用者を管理するシステムである。部屋は必ずひとつの建物に属する。
  • ユーザーは各部屋に対して入室できる。入室した部屋に対して退室できる。入室から退室までの間は、使用中とする。部屋の使用者は、その部屋が属する建物の使用者でもある。
  • 各部屋に対して、ユーザー個人の入室時刻と退室時刻を記録できる。入退出時刻のデータは過去にさかのぼって閲覧できる。
  • 部屋ごとに現在の使用者一覧を表示できる。使用者一覧から簡便に使用者へ連絡ができる。
  • 部屋の使用中の人数が閾値以下になると、退室しようとするユーザーに対して注意喚起を行う。閾値は部屋ごとに設定できる。
  • 建物についても、ユニークな使用者数が閾値を下回ると、退室時に注意喚起がなされる。
  • 退室操作は、他人が行うこともできる。これは退室操作を忘れたユーザーの情報をデータに反映させるため。

データソースの構成

SharePointリストで以下の5つのリストを作成しておきます。各マスタテーブルは、一つ上の階層の値を参照列で関連付けします。

BuildingMaster

列名列の型目的
Title一行テキスト(自動生成)建物名を入れる
ID数値(自動生成)
numUsersToNotify数値建物のユニークな使用者数がこの値以下であれば注意喚起します。
notificationMessage一行テキスト注意喚起で表示するメッセージを指定します。

RoomMaster

列名列の型目的
Title一行テキスト(自動生成)部屋名を入れる
ID数値(自動生成)
BuildingID数値BuildingMasterリストのIDで所属する建物を指定します。
numUsersToAlert数値残り人数が閾値以下のとき、退室に対して注意喚起をするのに用います。
AlertMessage複数行テキスト残り人数が閾値以下のとき、退室に対して注意喚起をするのに用います。
documentURL複数行テキスト部屋に関連する情報をまとめた外部資料へのリンクを示すのに用います。
isActiveはい/いいえ本システムで管理する対象とするかを指定します。

entry_exit_log

ポイントは2つあります。

一つ目に、利用者を特定する情報としてUPNを一行テキスト列で記録することです。一行テキスト列はテキストなのでPatch関数での記述が簡単なこと、委任が可能なことが重要です。

二つ目に、部屋や建物など関連する項目のIDを数値ですべてもっておくことです。これにより同じ部屋の利用者、同じフロアの利用者といった集計を簡便に行えます。

列名列の型目的
Title1行テキスト(自動生成)
ID数値(自動生成)
Start時刻部屋の使用開始日時
End時刻部屋の使用終了日時
isActiveはい/いいえ部屋を使用中か否かを示す
RoomID数値部屋を一意に特定します。
BuildingID数値建物を一意に特定します。
UserPrincipalName一行テキスト部屋を使用するユーザーを示します。UPNを文字列で設定します。
Created Byユーザー (自動生成)部屋を使用するユーザーを示します。
Modified Byユーザー(自動生成)レコードを書き換えたユーザーを示します。これがCreated Byと異なる場合、他人が操作したとわかります。

画面構成

  • 建物選択
    登録された建物を一覧表示します。一覧から建物をひとつ指定します。
  • 建物内の部屋選択
    指定した建物内の部屋を一覧表示し、個々の部屋の使用開始と使用終了を登録できます。部屋をひとつ選択し、部屋の使用者一覧画面に遷移できます。また、建物内の使用者一覧を表示する画面に遷移することができます。
    Paramでこの画面に直接アクセスできるようにします。
  • 建物内の使用者一覧
    指定した建物内の使用者を一覧表示します。個々の使用者に対して簡便に連絡を取ることができます。
  • 部屋の使用者一覧
    指定した部屋の使用者を一覧表示します。個々の使用者に対して簡単に連絡できます。指定した部屋の使用開始または使用終了を登録できます。
    操作者は自分以外の使用者について使用終了できます。このとき使用者終了されたユーザーに通知を行うほか、使用者自身が使用終了するときと同じ処理を行います。
    Paramでこの画面に直接アクセスできるようにします。
  • 使用終了への注意喚起
    部屋の使用終了操作をしたときに、部屋または建物の残り使用者数が閾値以下になる場合は、この画面に遷移します。ただし、操作者が最後の一人であった場合を除きます。
    この画面では使用終了にあたり注意喚起のメッセージを表示します。また、残りの使用者へ簡単に連絡できます。また、直前の画面(建物内の部屋選択または部屋の利用者一覧)へ戻ることができます。
  • 部屋使用終了の案内
    部屋の使用終了操作をしたときに、操作者が最後の一人であった場合は、この画面に遷移します。部屋の使用終了の手順を案内します。
    さらに、建物全体で最後の一人であった場合は、建物使用終了の案内画面へ遷移できます。
  • 建物使用終了の案内
    建物の使用終了の手順を案内します。

Power Appsで関数の実行時間を計測する

PowerAppsではユーザーの操作に対して処理を行うのであまり待ち時間を長くしたくありません。処理に要する時間が関数の書き方で大きく変わります。この記事では、関数の処理時間を計測する方法を示します。

まず実行時間を計測したい処理を以下のようなUpdateContext関数で挟みます。

//計測開始
UpdateContext({startime : Now()});

ここに計測したい関数を書く

//計測終了
UpdateContext({endtime : Now()});

得られた実行時間を表示するため、ラベルコントロールなどのTextを以下のように設定します。TimeUnitを秒またはミリ秒にしておくと良いです。

"実行時間 " & DateDiff(startime, endtime, TimeUnit.Milliseconds)  & "ms"

個人的には5秒を超える待ち時間は長いと思います。

処理時間を短縮する指針として、コネクションを呼び出す回数を極力減らす、コネクションを呼び出すにしても一括処理することが有効です。コレクションに対してForAll関数で愚直に繰り返し処理をするのをAddColumns関数で書き換えるだけで10分の1以下の時間で処理できることもあります。

PowerAppsから直接Teamsで20人以上に@メンションする投稿を行う

Teamsの投稿にはひとつの投稿でメンションできる宛先に上限があります。具体的な上限は、ユーザー20名、タグ20個です。PowerAppsを使ってTeamsに投稿するときも例外でなく、Teamsコネクタを介して20個以上のメンションを埋め込んだ投稿を行おうとするとエラーが返されます。

PowerAppsで定型的な作業を自動化する際に数の制限は困りものです。たとえばSharePointリストに登録されたユーザー全員に対してメンションする定型投稿を行うようなケースを実行しようとすると困ります。

本稿では、伝えたいメッセージ本文を親投稿としてスレッドを立てた上で、スレッドに返信する形で多数のメンションを追加することを考えます。これにより、通知を送りたい相手にもれなくメンションできます。

以下ではユーザーのコレクションからメールアドレスをThisRecord.Mailで取り出して上でUPNを取得し@mentionトークンを文字列として形成します。@メンショントークンの上限である20件ごとにコレクションを切り分けるため、GroupBy関数を用います。また、実行時間を短縮するため、Office365ユーザーコネクタを介してUPNを取得する処理をAddColumns関数で一括処理しています。

//多数のユーザーが入ったコレクション(配列)allusersからグループ分け用のコレクションallusersandindexを作成する。20行ごとにグループ分けする想定。
Clear(allusersandindex);
ForAll(allusers,
    Collect(allusersandindex,
        {
            numberofgroup: RoundUp( (CountRows(allusersandindex) + 1)/numberDivede,0),
            usermail : ThisRecord.Mail
        }
    )
);

//指定した行数ごとにグループ分けしたうえで、メンションタグを文字列結合した列concatmentiontagを作成する
ClearCollect(allusersmentiontags,AddColumns(GroupBy( AddColumns(allusersandindex, usermensiontag, "<at>" & Office365ユーザー.UserProfileV2( ThisRecord.usermail).userPrincipalName & "</at>" ), numberofgroup, assingedgroup ), concatmentiontag, Concat(assingedgroup,usermensiontag,",")));

コレクションの準備ができたら、これを使ってTeamsに投稿します。PowerAppsからPowerAutomateを介さずに直接Teamsに投稿したりスレッドに返信したりする方法は他のページで紹介しています。

groupIdをDropdownTeamID.Selected.id, channelIdをDropdownChannelID.Selected.idで与えています。

//新規スレッドの投稿内容を作成
UpdateContext(
    {
        newPostMessage:
        {
            recipient:{
                groupId: DropdownTeamID.Selected.id,
                channelId: DropdownChannelID.Selected.id
            },
            messageBody: TextInputMessage.Text
        }
    }
);
//新規スレッドを立てる
With(
    {
        newPostResult: MicrosoftTeams.PostMessageToConversation(
                    "user",
                    "Channel",
                    ParseJSON(JSON(newPostMessage))
                    )
    },
    //新規スレッドを立てるのに成功した場合、返信でメンションをつける
    If(IsBlankOrError(newPostResult), 
        Notify("error on new post", NotificationType.Error),
        ForAll(allusersmentiontags,
            With(
                { replyPostMessage:
                    {
                        recipient:{
                            groupId: DropdownTeamID.Selected.id,
                            channelId: DropdownChannelID.Selected.id
                        },
                        parentMessageId: newPostResult.id,
                        messageBody: "スレッドの親投稿を確認してください" & ThisRecord.concatmentiontag
                    }
                },
                MicrosoftTeams.ReplyWithMessageToConversation(
                        "user",
                        "Channel",
                        ParseJSON(JSON(replyPostMessage))
                    )
                );
        )
    )
)

テキスト入力の改行を反映してPowerAppsからTeams/Outlookのメッセージを送信する

PowerAppsのテキスト入力コントロールで入力した文章をTeamsコネクタやOutlookコネクタを使ってメッセージ送信する際に、テキスト入力の改行がメッセージに反映されない問題があります。テキスト入力コントロールを複数行にしているときに目にします。

テキスト入力コントロールの文字列には、改行を表す不可視な文字が含まれています。開業を表す文字は、Char関数で呼び出すことができ、具体的にはChar(10)です。TeamsやOutlookのメッセージはHTML形式で書かれるので、HTMLの改行タグである<br>に置換すれば改行が反映されます。

たとえば、コントロール名TextInput1に入力された文の変換はSubstitute関数を使って以下のように書けます。

Substitute(TextInput1.Text, Char(10), "<br>")

細かいことをいうと改行文字にはLF, CR, LF CRの3通りがあります。私が検証した範囲では、PowerAppsのテキスト入力コントロールに入力された改行文字はChar(10)すなわちLFだけでした。もしほかの改行文字が出てくる場面があるのなら、対応する改行文字をChar関数で与えて置換すればよいわけです。なお、CRはChar(13)です。

Power AppsからTeamsに直接メッセージを送信する。Power Automateを介さずに。

以前PowerAutomateを介してPowerAppsからTeamsにメッセージを送信したり、投稿に返信したりする方法をご紹介しました。ここでは、Power Automateを使わずPowerAppsから直接Teamsへメッセージを送信する方法を紹介します。

PowerAutomateを介さないメリットは2つあります。ひとつは、管理すべき対象がアプリひとつになること。共有するのも楽です。もうひとつは、投稿者をアプリを開いているユーザーに簡単にできること。PowerAutomateだと実行可能ユーザーとして権限設定してやる必要があります。

PowerAutomateを介さないデメリットは、アプリにアクセスしたユーザーの権限でしか動かせないことです。チームにメンバーを追加するなど特別な権限が必要な処理を行えない可能性があります。


本ページに関連する資料をまとめます。

操作画面付きの実施例が他サイトで紹介されています。PowerAppsに慣れない方はリンク先をご覧いただくことをお勧めします。
Power Apps のキャンバスアプリから直接 Teams にメッセージを投稿しよう


ボットチャットにメッセージを送信する

ボットチャットからのメッセージが投稿されるWorkflowsとのチャットにメッセージを送信する方法です。宛先メールアドレスとメッセージ本文が必要です。メッセージ本文はHTMLで記述できます。isAlertがtrueだとメンション等と同じく通知が受信者に届きますが、falseだと通知が届かず未読メッセージが増えるような挙動になります。

以下の例ではlocBotChatMessageで作成したメッセージをPostMessageToConversation関数で送信しています。

//メッセージを作成
UpdateContext({
    locBotChatMessage:
    {
        recipient: 宛先メールアドレス,
        messageBody: メッセージ本文,
        isAlert:true
    }
    });
//メッセージを送信。戻り値をlocResultBotChatMessageに格納
UpdateContext({locResultBotChatMessage:
MicrosoftTeams.PostMessageToConversation(
    "Flow bot",
    "Chat with Flow bot",
    ParseJSON(JSON(locBotChatMessage))
)});

グループチャットにメッセージを送信する

まじめにPowerAppでTeamsコネクタを使いこなすよりも、宛先・タイトル・本文をURIスキーマで指定し、Luanch関数でTeamsを起動する方が楽なような気がします。とはいえPowerAppでがんばる場合の作例をまとめておきましょう。

グループチャットにメッセージを送信するには、まずチャットの場を作ってその会話IDを基にチャットにメッセージを送信するという流れになります、注意が必要なのですが1対1の会話でもグループチャットと呼びます。

具体的は次の通りです。CreateChat関数でグループチャットを作成し会話IDを得ます。次にPostMessageToConversation関数から会話IDをrecipientにしてメッセージを送信します。

注意が必要な点としては、宛先メールアドレスを複数入力する場合は、;で結合した文字列を渡すこと、ただし末尾には;を付けないことが必要です。
正常な例: abc@example.com;zyx@example.com
不適な例: abc@example.com;zyx@example.com;

messageBodyはHTML形式で渡せます。本稿の本題ではありませんが、”のエスケープは””と2個重ねて書けばよいです。

//グループチャットを作成
UpdateContext({
   resultCreateChat:
      MicrosoftTeams.CreateChat("宛先メールアドレス",{topic:"グループチャットのタイトル(任意)"})
   }
);

//メッセージを作成
UpdateContext({
   newPostMessage:{
      recipient: resultCreateChat.id,
      messageBody: "<p>ここにメッセージを挿入する<br><a href = ""https://www.office.com/?auth=2"">リンクもできる</a><br>リストも使える<ol><li>番号ありリスト01</li><li>番号ありリスト02</li><li>番号ありリスト03</li></ol></p>"        }
});

//チャットに投稿する
MicrosoftTeams.PostMessageToConversation(
   "User",
   "Group chat",
   ParseJSON(JSON(newPostMessage))
);

前準備

メッセージを投稿する先のチャネルの情報を確認します。
チャネルのURLからチームIDとチャネルIDを読み取る方法を参照してください。

新しいメッセージをチャネルに投稿する

新規メッセージを投稿する場合の方法を紹介します。新しいスレッドを建てることです。

PostMessageToConversation関数を使います。

以下の例文のうち、チームID、チャネルID、メッセージ本文、メッセージタイトルにそれぞれ文字列を設定します、メッセージタイトルは必須ではないので、タイトルが必要ない場合はsubjectを消してください。メッセージ本文はHTMLで記述できるので、リンクを張ったり文字を大きくしたり色を付けたりできます。

//メッセージを作成
UpdateContext({
    locPostMessage:
    {
        recipient:{
            groupId: チームID,
            channelId: チャネルID
        },
        messageBody: メッセージ本文,
        subject: メッセージタイトル
    }}
);
//メッセージを送信。戻り値をlocResultPostMessageに格納
UpdateContext({locResultPostMessage:
MicrosoftTeams.PostMessageToConversation(
    "user",
    "Channel",
    ParseJSON(JSON(locPostMessage))
)});

戻り値は、conversationId, id, messageLinkの3つが入ったレコードです。

conversationIdはチャネルID、idは後述する返信で使用するメッセージID、messageLinkはその投稿へアクセスできるURLです。

既存のスレッドに返信する

ReplyWithMessageToConversation関数を使います。

チームID、チャネルID、メッセージID、メッセージ本文が必要です。
メッセージIDは前節でPostMessageToConversation関数の戻り値のidとして得られることを紹介しています。

なお、ReplyWithMessageToConversation関数の戻り値はPostMessageToConversation関数の戻り値と同じ構造です。

//メッセージを作成
UpdateContext({
    locReplyMessage:
    {
        recipient:{
            groupId: チームID,
            channelId: チャネルID
        },
        parentMessageId: メッセージID,
        messageBody: メッセージ本文
    }}
);

//返信する
UpdateContext({locResultReplyMessage:
MicrosoftTeams.ReplyWithMessageToConversation(
    "user",
    "Channel",
    ParseJSON(JSON(locReplyMessage))
)});

各パラメータの関係を理解しやすくするため、新規スレッドの投稿から返信までを一貫して行う例を以下に示します。

//新規スレッドの投稿内容作成
UpdateContext(
    {
        newPostMessage:
        {
            recipient:{
                groupId: DropdownTeamID.Selected.id,
                channelId: DropdownChannelID.Selected.id
            },
            messageBody: TextInputMessage.Text
        }
    }
);
//新規スレッドを立てて、返信をつける
With(
    {
        newPostResult: MicrosoftTeams.PostMessageToConversation(
                    "user",
                    "Channel",
                    ParseJSON(JSON(newPostMessage))
                    )
    },
    If(IsBlankOrError(newPostResult), 
        Notify("error on new post", NotificationType.Error), 
        With(
            { replyPostMessage:
                {
                    recipient:{
                        groupId: DropdownTeamID.Selected.id,
                        channelId: DropdownChannelID.Selected.id
                    },
                    parentMessageId: newPostResult.id,
                    messageBody: "reply message here"
                }
            },
            MicrosoftTeams.ReplyWithMessageToConversation(
                    "user",
                    "Channel",
                    ParseJSON(JSON(replyPostMessage))
                )
            );
        )
)

応用例

PowerAppsから直接Teamsで20人以上に@メンションする投稿を行う

Teamsで音声通話やチャットを開くリンクの作り方

ディープリンクあるいはURIスキーマを使うと、リンクを開いたとき自動的に特定のユーザーとの音声通話を開始したり、チャット画面を開いたりできます。宛先は複数でも可能。
ユーザーがTeamsで投稿ボタンを押す動作が必要ですが、PowerAppsやPowerAutomateで頑張ってチャット送信の仕組みを作るよりも断然楽です。

Teamsが使用できる環境であれば、PCでもスマートフォンでも同様に動作します。

このページでは、メールアドレス example@onmicrosoft.com を宛先の例に使います。複数の宛先を用いる場合はカンマで繋げてください。

音声通話を開始する

Teamsの音声通話を開始するリンクの書き方は以下の通りです。参考リンク

https://teams.microsoft.com/l/call/0/0?users=example@onmicrosoft.com

https://teams.microsoft.com/l/call/0/0?users=example1@onmicrosoft.com,example2@onmicrosoft.com

&withVideo=trueを追加すると、ビデオ通話を開始します。

https://teams.microsoft.com/l/call/0/0?users=example@onmicrosoft.com&withVideo=true

外線電話番号への発信

Teamsから普通の外線電話番号に電話をかけさせることもできます。外線番号への発信は、公衆交換電話網, PSTNとの通話を発信するものと表記されます。参考リンク
Teams電話のようなサービスを使用してTeamsから外線電話に掛けられる環境が必要です。
以下の例は電話番号090-1234-5678に電話をかけるものです。いずれの表記にも対応しています。普通の電話アプリを起動するリンクはtel://09012345678のように書けるのに似ています。複数の宛先を書いたときにどのような挙動になるかは調べていません。

https://teams.microsoft.com/l/call/0/0?users=4:09012345678
https://teams.microsoft.com/l/call/0/0?users=4:090-1234-05678
https://teams.microsoft.com/l/call/0/0?users=4:+8190-1234-05678

チャットを開始する

Teamsのチャットを開くリンクの書き方は以下の通りです。参考リンク

https://teams.microsoft.com/l/chat/0/0?users=example@onmicrosoft.com

グループチャットのタイトルはtopicNameで指定できます。さらに、メッセージの下書きはmessageで指定できます。

ここで注意していただきたいのが、日本語の使用する場合はURIエンコードした文字列を埋め込むということです。
以下の例では
topicName=ここにタイトルを書く
message=ここに本文を書く
という文字列をURIエンコードした文字列を使用することで、グループチャットのタイトルと本文を指定した状態でTeamsを開かせることができます。

https://teams.microsoft.com/l/chat/0/0?&users=example1@onmicrosoft.com,example2@onmicrosoft.com&topicName=%E3%81%93%E3%81%93%E3%81%AB%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8F&message=%E3%81%93%E3%81%93%E3%81%AB%E6%9C%AC%E6%96%87%E3%82%92%E6%9B%B8%E3%81%8F

掲示物への表示

商店でQRコードを読み込むと電話をかけられるポスターを見たことがある方は少なくないと思います。このページで紹介した通話を開始するリンクはWEBページに埋め込むことで利用できますが、リンクをQRコードにして掲示物に表示することもできます。仕事の現場でも、PowerAppsを作るまでもない定型連絡をするのに便利です。

QRコードの作成はQRQRが便利で安心です。

新しいデジタルツールを組織に導入するには

会社のような組織でTeamsのような現代的なデジタルツールを利用できるようになったとしても、それだけ同僚の多くが業務に活用するようになるわけではありません。それどころか、ツールが導入されただけで使われないまま何年も経過することさえあります。

デジタルツールを業務で活用していくためには、実際の業務で実践できることが何よりも肝心です。新規プロジェクトを例にとってデジタルツールを導入できるか否かは、以下の3点が揃った人物が行動するか否かにかかっています。

  • プロジェクトの主導的な立場である
    プロジェクトのやり方が決まる前にデジタルツールを使おうと言える立場であること。
    発起人、とりまとめ役、初期メンバーのいずれかである。
  • デジタルツールを使える
    Teamsで新しいチームを作れる、Plannerで新しいPlanやTaskを作れる、など少し調べればたいていの操作を自分でできる
  • 協働する同僚をサポートできる
    ツールの使い方を教える、業務に合わせて適切な使い方を実践して見せる、などツールを使って実際の業務をみんなで進めるために他人を支援できる。

ユーザーの手間を最小化 Param関数を使おう

業務アプリは使ってもらって価値を生みます。たくさん使ってもらうには、作業の手間、難易度、認知的負荷のすべてを小さくすることが有効です。

業務アプリの中でも、PowerAppsでQRコードを読み込むアプリを作っている方に、Param関数の利用をおすすめします。

PowerAppsのバーコードリーダーコントロールを使用すれば、アプリの中でQRコードやバーコードを認識し、埋め込まれた文字列を取り出せます。IDや情報を埋め込むことで、PowerAppsで詳しい情報を表示したり、手続きを行ったりできます。

ところで、普段お店などでQRコードを読み込むとき、わざわざ何かのアプリを起動するでしょうか?たいていはスマホの標準カメラに内蔵されたQRコードを読み込む機能を使用すると思います。PowerAppsの中でバーコードリーダーを使うよりも、スマホの標準カメラでQRコードを読んだ方がひと手間少なく済みます。ユーザーの手間を惜しみ、できるだけ少ない手数でユーザーが作業を完遂できるように工夫するのがアプリ制作者の腕の見せ所です。

このような処理をするには、PowerAppsのアプリURLにパラメータを付加する手法が有効です。

Param関数を使ったアプリとしては過去にオフィス内宅配ロッカーを作成しました。

Power Automateでカンマ区切りメールアドレスから複数人にTeamsのメンションをかける

Teamsで複数人にメンションをかける方法が知られています。リンク先の方法では、複数のメールアドレスが配列として得られています。一方で、複数人の宛先を記述するよくやる方法として、カンマ,やセミコロン;で区切って複数のメールアドレスを書き並べた文字列を作ることがあります。本記事では、このようなケースでカンマ区切り文字列から複数のメールアドレスの配列を生成します。

なお、この記事で紹介するフローであれば、カンマ区切りで連結していない単独のメールアドレスが入力であるときも正常に動作します。

フローの全体像

Power Automateのフローは以下の通りです。各処理の中身は後述します。

各アクションの解説

カンマ区切りのメールアドレス

組み込み>データ操作>作成アクションを使用して、このフローで使用するカンマ区切りテキスト形式のメールアドレスを格納します。実際のフローでは、PowerAppsトリガーなどを経由して値を渡します。

ここでは “aa@exaple.com, bb@example.com, cc@example.com” のような形でメールアドレスが記述されています。

メールアドレス配列の初期化

組み込み>変数>変数を初期化するアクションを使用して、カンマ区切り文字列から配列を生成します。

split関数に分割する文字列と、分割する位置を指定する文字(ここではカンマ,)を与えることで、文字列を分割します。注意すべきことに、split関数を使うだけではPower Automateのフローで繰り返し操作の対象となる配列になりません。split関数の出力は文字列です。変数を初期化するアクションに配列のもとと「値」に、このsplit関数の出力を渡す必要があります。

式にはsplit(outputs(‘カンマ区切りメールアドレス’),’,’)のように記述します。

この配列は「メールアドレス配列」という名前で後段で使用できます。

メンショントークンの初期化

各メールアドレスから生成したメンショントークンを格納します。組み込み>変数>変数を初期化するアクションを使用して、空の配列を用意します。

Apply to each

組み込み>コントロール>それぞれに適用するアクションを使用して、「メールアドレス配列」から各メールアドレス要素を取り出してメンショントークンを生成する処理を行います。


ユーザープロフィールの取得

標準>Office365Users>ユーザープロフィールの取得(V2)アクションを使用して、メールアドレスからユーザープリンシパル名を取得します。@mentionトークンを取得するのにユーザープリンシパル名が必要なのに対して、所属組織によってはメールアドレスがユーザープリンシパル名と異なる場合があるためです。

ここで入力には以下のように記述しています。
trim(items(‘Apply_to_each’))
trim関数はスペースを削除する関数です。カンマ区切りテキスト形式でメールアドレスを入力する際に、メールアドレス間にスペースを入力することが多いので、スペースを除去する処理を介在させた方が安全です。

ユーザーの@mentionトークンを取得する

Teamsの当該アクションで、ユーザープリンシパル名から@mentionトークンを生成します。

配列変数に追加

組み込み>変数>配列変数に追加アクションで、生成した@mentionトークンを配列に格納します。

メンショントークンの結合

組み込み>データ操作>結合アクションで、「メンショントークン」配列の要素を結合します。「次を使用して結合」はカンマ,を使用していますが、半角スペースなどでもOKです。

チャットまたはチャネルでメッセージを投稿する

「メンショントークンの結合」アクションの出力をメッセージの中で使用すれば、メンションがかかります。

なお、複数のメンショントークンを作成し、結果としてひとつのメッセージの中で同じユーザーに対して何度もメンションがかかるような本文ができたときは、本文中で最初にそのユーザーが登場する部分だけメンションがかかったように表示されます。


なお、Teamsの制限としてひとつのメッセージでメンションできるユーザーの上限は20人までです。20人以上に同時にメンションするにはタグメンションやチームメンションの使用が必要です。

ユーザーへのメンションに拘る場合、メッセージを投稿した上でスレッドに返信する形でメンションを並べる形が考えられます。。PowerAppsでの実装例を別のページに示します。PowerAutomateではChunk関数を使ってメンションの宛先を分割する方法があります。

Power AutomateでTeamsのスレッドに返信する

Power AutomateでTeamsのスレッドに返信のメッセージを投稿するには、チャネル内のメッセージで応答しますを使用します。新しいスレッドを建てるチャットまたはチャネルでメッセージを投稿するに比べて少々わかりにくい名称ですし、リファレンスを読んでもよくわかりません。こういうときは、Power Automate上で実際に作ってみるのが早いです。

投稿者はFlow BotまたはUserから選択します。投稿先はChannelの一択です。

Message IDはチャットまたはチャネルでメッセージを投稿するのメッセージIDを入力します。チャットまたはチャネルでメッセージを投稿するの出力は、メッセージ ID、メッセージリンク、会話 IDの3個です。なお、私の環境で試したところ会話IDはチャネルIDと同じでした。

TeamとChannelは投稿先のチームとチャネルを指定します。カスタム値の入力を使って、チームIDとチャネルIDから指定することもできます。チームIDとチャネルIDの取得方法は別の記事で紹介しています。

ところで、チャネル内のメッセージで応答しますの出力にもメッセージIDがあります。こちらのメッセージIDに対して返信しようとすると、メッセージが見つからないというエラーがでました。スレッドのトップのメッセージにしか返信できないのかもしれません。