MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Power Automate TIPS : 複数の人への@メンション を効率よく作る

はじめに

Power Automate を利用した Teams への @メンショントークンの取得・メッセージへの挿入が正式にサポートされるようになったということを以前の投稿でご紹介しました。

mofumofupower.hatenablog.com

ここで重要だったのは、結局 『@メンショントークン』 というものは <at>user@example.com</at> の形式の文字列だった ということです。

これをメッセージの本文であったり、Adaptive Cards に挿入することで、Teams 側でメンションに置き換えしてくれるわけです。

今回は、SharePoint のPerson or group field (ユーザーまたはグループ 列) と、Planner の 割り当て で複数のユーザーを含めた場合に、そこからどうやって @メンショントークンを効率的に作成するのかを紹介します。

SharePoint の Person or group field

まずは SharePointリストから。 列の設定で、「ユーザーまたはグループ」列を作成、「複数選択を許可」を有効にしている場合を考えます。

f:id:mofumofu_dance:20200721165322p:plain

この場合、Power Automate でアイテムを取得すると、この列の値は以下のような配列形式になっていることが分かります。

[
  {
    "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
    "Claims": "i:0#.f|membership|tanaka@xxxxx.onmicrosoft.com",
    "DisplayName": "Ichiro Tanaka",
    "Email": "tanaka@xxxxxx.onmicrosoft.com",
    "Picture": "https://xxxxx.sharepoint.com/sites/Automate/_layouts/15/UserPhoto.aspx?Size=L&AccountName=tanaka@xxxxx.onmicrosoft.com",
    "Department": null,
    "JobTitle": null
  },
  {
    "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
    "Claims": "i:0#.f|membership|yamada@xxxxx.onmicrosoft.com",
    "DisplayName": "Taro Yamada",
    "Email": "yamada@xxxxx.onmicrosoft.com",
    "Picture": "https://xxxxx.sharepoint.com/sites/Automate/_layouts/15/UserPhoto.aspx?Size=L&AccountName=yamada@xxxxx.onmicrosoft.com",
    "Department": null,
    "JobTitle": null
  },
  {
    "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
    "Claims": "i:0#.f|membership|nagao@xxxxx.onmicrosoft.com",
    "DisplayName": "Hiroaki Nagao",
    "Email": "nagao@xxxxx.onmicrosoft.com",
    "Picture": "https://xxxxx.sharepoint.com/sites/Automate/_layouts/15/UserPhoto.aspx?Size=L&AccountName=nagao@xxxxx.onmicrosoft.com",
    "Department": null,
    "JobTitle": null
  }
]

@メンショントークンに必要なのはこのうち Email のプロパティです。

完成形として、以下のような文字列が得られれば Teams に投稿した際に複数人へのメンションになることが予想できます。

<at>tanaka@xxxxxx.onmicrosoft.com</at> <at>yamada@xxxxx.onmicrosoft.com</at>  <at>nagao@xxxxx.onmicrosoft.com</at>

問題はこの文字列をどうやって作るかです。 この列に追加される ユーザーが複数で、個数が分からない場合、以下のようなフローで簡単に 上の文字列が生成されます。

f:id:mofumofu_dance:20200721170414p:plain

使った数式はメンションの形式にするための文字列結合だけです。

concat('<at>',item()?['email'],'</at>')

結果、期待通り Teams に投稿してメンションされました。

f:id:mofumofu_dance:20200721170729p:plain

Planner の Assign

次に複数ユーザーをタスクにアサインした場合です。

Planner の Assign にユーザーを追加した場合には SharePointの場合と異なり、 Azure AD の User ID が取得できます。 メールアドレスなどの情報は含まれません。

[
  {
    "userId": "868sssss-ce6e-436d-b63d-47c7152ab667",
    "value": {
      "@odata.type": "#microsoft.graph.plannerAssignment",
      "assignedDateTime": "2020-07-21T07:22:23.6717485Z",
      "orderHint": "8586062908018370861PJ",
      "assignedBy": {
        "user": {
          "displayName": null,
          "id": "e8c906f3-0000-422d-aaaa-e1aaba7ecbeb"
        }
      }
    }
  },
  {
    "userId": "e8c906f3-0000-422d-aaaa-e1aaba7ecbeb",
    "value": {
      "@odata.type": "#microsoft.graph.plannerAssignment",
      "assignedDateTime": "2020-07-21T07:22:23.6717485Z",
      "orderHint": "8586062908018370861Pm",
      "assignedBy": {
        "user": {
          "displayName": null,
          "id": "e8c906f3-0000-422d-aaaa-e1aaba7ecbeb"
        }
      }
    }
  }
]

@メンショントークンに必要なプロパティを含んでいないため、この "userId" をもとにデータを取得する必要があります。

Power Automate には AzureAD のコネクターがあり、ここからユーザー情報を取得できます。SharePointの場合とは異なり、以下のような Apply to each を含む形で @メンショントークンを生成できます。

f:id:mofumofu_dance:20200721171907p:plain

利用した数式は先ほどと同様ですが、ここでは Pieter's method と呼ばれる方法を用いて、 SharePoint の場合の「選択」アクションの結果を生成しています。(詳細な行程は上図参照)

フローを実行すると、確かにPlanner の割り当てから複数ユーザーへのメンションが生成されていることがわかります。

f:id:mofumofu_dance:20200721172219p:plain

おわり

Power Automate から便利に使えるようになった ユーザーへの@メンションですが、複数人へのメンション - 特に何らかのデータソースをもとにした場合 - には とにかくUPN/メールアドレスを以下に取得するか が重要です。 取得できれば、あとはここで紹介した方法以外にも、Apply to each で @メンションコードの取得アクションを利用してもよいですし、サービスに応じて使い分けができます。

特にApply to each を伴うようなループ処理では、Pieter's methodが有効です。

少しだけ数式を書きましたが、ぜひトライしてみてください。