Power Automate x MSGraphで外部テナント操作用カスタムコネクタを作成する
外部テナントをMSGraphで操作するカスタムコネクタ作成について書きます。
Power AutomateとMSGraphを組み合わせると、外部テナントと連動するフローなんかもつくれてしまいます。
ざっくり手順
ざっくり、以下のような流れで作成していきます。
・AzureADでアプリの登録を行う。
・管理者の同意をもらう。
・カスタムコネクタを作成する。
・各自、自由にMSGraphを使用したPower Automateを作成する。
カスタムコネクタを作成するまでの手順はほぼ自テナントでMSGraphのカスタムコネクタを作成する手順と同様です。
下記のリンクにわかりやすい手順が乗っているので、参考にしてください。
https://docs.microsoft.com/ja-jp/graph/tutorials/flow
いくつか注意点がありますのでここに書いておきます。
管理者の同意について
アクセス許可を設定して利用するには、管理者の同意が必要になります。
設定までしても自動で管理者にメールが行ったりはしないのでとりあえずご安心ください。
管理者に同意を求める際には、ページのURLを送ればそのままダイレクトで管理者の方も開けるのでリンクを共有するのがいいと思います。
テナントIDは自分で設定する必要がある
自テナントの場合は必要ありませんが、外部テナントにつなげる場合はテナントIDを設定する必要があります。ここだけ自テナントの場合と異なるので注意してください。
テナントIDは下記の画面で設定します。
カスタムコネクタ テスト用body
テスト用のbodyを置いておくので良ければご利用ください。
{
"requests": [
{
"id": 1,
"url": "/me",
"method": "GET",
"headers": {
"Content-Type": "application/json"
},
"body": {}
}
]
}
カスタムコネクタ作成までの手順を行って、無事テストが通れば作成成功です。
一応取得した内容が外部テナントのものか、テナントIDを設定したか確認してください。
手順の通りだと自テナントを参照してしまいます。
外部テナントを対象にする場合はテナントIDを設定してください。
Power Apps ForAll + Patch で複数レコードを一括更新する
ギャラリーやコレクションで保持している変更を一括で更新したい場合、ForAll()とPatch()を組み合わせて行うことができます。
追記:新しくよりスマートなやり方の記事を書きました。ご参考にしてください!
一般的によくハマること
とりあえずForAllで更新してみようとすると、大体失敗すると思います。
Collectionやギャラリーのカラムの名前とデータソースのカラムの名前がかぶってると失敗するので、処理中に出てくるカラム名はかぶらないようにしないといけません。
いくつかのやりかた
このカラムかぶりを解消する手段として、3種類あります。
・曖昧性除去演算子で回避する
・ギャラリーに非表示コントロールを追加して回避する
・カラム名を変更して回避する
どれを使う?
方法はいくつかありますが、その中でも個人的におすすめのAddColumnsを利用した方法について書いておきます。
AddColumnsでかぶりを解消する
下記ではID、Cost、Statusの3つのカラムがかぶっているケースです。
それぞれAddColumns()で違う名前でカラムを追加して、Patch()しています。
例
ForAll(
AddColumns(
colItems,
"colID",
ID,
"colCost",
Cost,
"colStatus",
Status
),
Patch(
DataSourceItems,
LookUp(
DataSourceItems,
ID = colID
),
{
Cost: colCost,
Status: colStatus
}
)
);
このようにすることで更新を行うことができます。
上記は更新時にカラム名の変更を行っていますが、カラム名の変更をコレクションを作る段階で行ってもいいと思います。
他の方法を避けた理由
だめというわけではありませんが、他の方法を避けた理由を書いておきます。
曖昧性除去演算子の方法
委任問題が発生したため、場合によるかなとおもって避けました。コードは短いので問題なければこちらでもいいと思います。
ギャラリーの方法
ギャラリーに出していない場合も考えられますし、非表示のコントロールを追加するのも嫌な感じがしたので避けました。
他の方法の詳細については、下記のサイトに乗っています。
参考URL
How to bulk update records in PowerApps
https://powerapps.microsoft.com/ja-jp/blog/bulk-update-using-forall-and-patch/
AddColumns リファレンス
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-table-shaping
Patch リファレンス
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-patch
Common Data Service x Power Automateでトランザクション処理を行う
Common Data Serviceに対してトランザクション処理を行いたい場合、Power Automateで行うことができます。
トランザクションでなにができる?
トランザクション(変更セット、Change set)内では、CDSの
・Create
・Update
・Delete
が実行可能です。
処理の途中でエラーが発生すると、それまでのアクションは無効可されてなかったことにしてくれます。
一連の連動したアクションを実行したい場合に利用できます。
手順
まずソリューションからFlowを新規作成します。
トリガーはとりあえずなんでもいいです。
Common Data Service (current environment) コネクタの
Executes a changeset requestアクションを選択します。
※Executes a changeset requestが見当たらない場合はコネクタが間違っていないか確認してください。
Executes a changeset requestアクションの中に、トランザクションに含めたいアクションを追加していきます。この中ではCDSのCreate,Update,Deleteアクションのみ追加することができます。
成功パターン
DeleteやCreateなど異なるアクションも組み合わせることができます。
失敗パターン
試しに途中で失敗する処理を実行したところ、無事に途中の処理をなかったことにしてくれました。
注意点
手順にもありますがソリューションからPower Automateを作成する必要があります。
マイフローからは作成できません。
また、コネクタが2種類出てくる場合は、Common Data Service (current environment) を選択してください。
参考URL
Whats new in common data service connector
https://www.briteglobal.com/blogs/community/whats-new-in-common-data-service-connector/
Power Apps 曜日を表示する
Power AppsではCalender関数を使用して曜日リストを取得できます。
Calendar.WeekdaysShort()
Calendar.WeekdaysLong()
などを使用すると、曜日の単一行テーブルを取得できます。
新しい画面 > カレンダー で作成されるページでも使用されています。
ですが、月曜.. となっていて気持ち悪いですね。正しくは"月曜日"ですが、長すぎるので短くしたい。
曜日を短くして取得する
もっと短く、各1文字で表現したい場合は以下のようにすると"曜日"を取り除くことができます。
例
ForAll(
Calendar.WeekdaysShort(),
Substitute(Value,"曜日",Blank())
)
結果
こんな感じで使うことができます。
参考リンク
カレンダー関数のリファレンス
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-clock-calendar
Power Apps ナビゲーションバーを非表示にする
Power Appsのアプリの画面上部にはナビゲーションバーがついていますが、これは取り除くことができます。
やり方
アプリ起動用のURLに「&hidenavBar=true」をつけると取り除くことができます。
このようにスッキリします。
サイネージとかだとナビゲーションバーは無いほうが見栄えがよくなりますね。