権限セットグループの割り当てと削除を自動化する


[Automate the Assignment and Removal of Permission Set Groups](https://admin.salesforce.com/blog/2022/automate-the-assignment-and-removal-of-permission-set-groups)


自動化は、お客様やエンドユーザーだけでなく、管理者であるあなたにも役立ちます。今年は#WorkSmartNotHard の精神で、定型的かつ反復的な作業を自動化し、ユーザーに新しい機能強化を提供するなど、より付加価値の高い作業に集中できる年にしましょう！

管理者として、セキュリティに配慮し、組織のセキュリティを確保し、ユーザーが業務に必要なアクセス権のみを付与することが重要です。セキュリティと可視性に関する管理者設定キットをご利用いただくと、オブジェクトレベルのセキュリティ、項目レベルのセキュリティ、レコードアクセスに関する推奨ソリューションをご確認いただけます。

権限セットグループへのユーザーの追加や削除を手動で行う必要があることを思い出すために、コンピュータに付箋を貼るのはもうやめましょう。Salesforceに任せましょう！Flow Builderを使えば、特定の条件を満たしていれば、ユーザーへの権限セットグループの割り当てや削除を自動で行うことができます。

私たちの #AwesomeAdmin、Addison Dogster が、このタスクを自動化するために必要なプロセスと構成作業をどのように完了するかを見ていきましょう。

# オブジェクトの関係を理解する

まず、Addisonは「Cloudy's PSG」という権限セットグループを作成し、いくつかの権限セット（「レポートのエクスポート」と「取引先の編集」）をこの権限セットグループに割り当て、さらに自分自身にこの権限セットグループを割り当てます。次に、データローダを使用して以下のオブジェクトからレコードをエクスポートします。

注:これらのオブジェクトを表示するには、「すべての Salesforce オブジェクトを表示する」ボックスをオンにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b4724457-813e-4b12-a7b4-e5fe5ba6457c.png)


権限セットグループ (PermissionSetGroup):これは、権限セットグループの高レベル設定を保持するオブジェクトです。このオブジェクトでは、権限セットグループの開発者名 (DeveloperName) と権限セットグループ ID (Id) を取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5b55824d-981b-43ea-8a5f-23ece37fcccf.png)

権限セット（PermissionSet）：プロファイルの変更や再割り当てを行わずに、1人または複数のユーザーにアクセス権を付与するために使用される権限セットを表します。PermissionSetは、PermissionSetGroupと読み取り専用の子関係を持ちます。ここで重要なフィールドは、権限セット名（ラベル）と権限セットタイプです（「セッション」は権限セットグループ、「通常」は権限セットを表します）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fd02fd36-91d5-4847-9e2d-285aec2248a4.png)

権限セットグループコンポーネント（PermissionSetGroupComponent）：これは、PermissionSetGroupオブジェクトとPermissionSetオブジェクトをそれぞれのIDで関連付け、権限セットグループの再計算によってグループの集約権限を決定するためのジャンクションオブジェクトです。このオブジェクトでは、関連する権限セットグループ（PermissionSetGroupId）と、それに関連付けられた権限セット（PermissionSetId）を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6200d8fe-4c44-4d08-82f2-a2e3b8e20847.png)

権限セットの割り当て（PermissionSetAssignment）：ユーザーと権限セット（権限セットまたは権限セットグループ）の関連付けを表します。ここで重要なフィールドは、割り当てられたユーザー（AssigneeId）、ユーザーに割り当てられている権限セット（PermissionSetId）、およびユーザーに割り当てられている権限セットグループ（PermissionSetGroupId）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/68431e15-765a-452e-a8e0-02fe6c8627be.png)

Addison が権限セットの割り当てデータを確認すると、Jared Dunn のユーザー ID (005B0000007N5MQIA0) が 2 つの権限セットに割り当てられており、そのうちの 1 つは権限セットグループで構成されていることがわかります。しかし、自分のユーザーレコードを確認すると、権限セットグループは 1 つしかなく、権限セットは割り当てられていません。では、この謎の権限セットとは何でしょうか？

アディソンは、この権限セットが何なのかを確認するため、 https://servername.salesforce.com/またはhttps://mydomainname.my.salesforce.com/の後の URL に権限セット ID「0PSB0000001HY2aOAG」を入力しました。すると、次のエラーが表示されました。

「不十分な特権

要求された操作を実行するために必要なアクセスレベルがありません。アクセスが必要な場合は、レコードの所有者または管理者にお問い合わせください。詳細については、「権限不足エラー」を参照してください。

興味深いですね。これはシステムによって生成/所有された権限セットであるに違いありません。

アディソンは、設定ホームに戻ると、「最近使用した項目」リストにCloudyのPSG項目が2つ表示されていることに気づきました。1つは権限セットグループで、もう1つは権限セットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/520a1d7b-f7fc-4bfa-b64a-e196cf1ae657.png)

新しい権限セット グループが作成されると、同じ権限セット グループ名でシステム生成の権限セットが作成されるようです。

Addison は、権限セット グループ、権限セット、権限セットの割り当てとのデータ関係を理解し​​たので、次のようなフローを使用して権限セット グループの割り当て/削除を自動化できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2158764d-dbfa-404c-a610-7adb94ab2998.png)

# Salesforceの全体的なプロセスを確認する
アディソンがSalesforceにログインして新しいフローを作成する前に、自動化を作成するための最初のステップは、プロセス全体を理解することです。プロセスは、ユーザーを権限セットグループに追加することと、ユーザーを権限セットグループから削除することの2つの部分から構成されます。

まず、Addison は、権限セット グループをユーザーに手動で割り当てる手順を確認します。

1. ユーザーを検索します。
2. ユーザーの記録を表示します。
3. ユーザーの権限セット グループの割り当てリストに移動します。
4. [割り当ての編集]をクリックします。
5. 「使用可能な権限セット グループ」リストから権限セット グループを選択し、「有効な権限セット グループ」リストに追加します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cefad9ff-22ce-4eba-b07c-658abc767619.png)

注:ユーザー インターフェイス (UI) では、使用可能な権限セット グループ リストで使用可能な場合にのみ、権限セット グループを割り当てることができます。

6\. 「保存」をクリックします。


こで、アディソンはユーザーから権限セット グループを手動で削除する手順を確認します。

1. ユーザーを検索します。
2. ユーザーの記録を表示します。
3. ユーザーの権限セット グループの割り当てリストに移動します (マウスを移動します)。
4. 削除する権限セット グループを見つけて、[削除]リンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/44dba148-eb20-4f7e-9017-f0facb8d2745.png)

注: UI では、ユーザーに対してすでに有効になっている権限セット グループのみを削除できます。

Addison の自動化 (フローとも呼ばれます) はこれらの UI 制限に対応する必要があり、そうしないとフローが失敗します。

Addison が権限セット グループを割り当てる前に、ユーザーがその権限セット グループにまだ割り当てられていないことを確認する必要があります。
Addison が権限セット グループを削除する前に、ユーザーがすでにその権限セット グループに割り当てられていることを確認する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/da99e8aa-a314-4f38-84a7-e978c43ff1f0.png)


# 構成プロセスを文書化する

アディソンはSalesforceにログインしてFlowで自動化の構築を始める前に、紙と鉛筆を用意します。Flowを使い始めたばかりの頃や、非常に複雑なプロセスに取り組んでいる時は特に、キーボードを打つ前に紙の上で手順を論理的に考えておくのが効果的だと彼女は言います。設定をリファクタリングするよりも、紙の上で変更を加える方が簡単です。そんな時間なんて誰にもありません！ #WorkSmartNotHard

まず、ユーザーに権限セット グループを自動的に割り当てたり削除したりするための基準を理解する必要があります。

Addison のビジネス要件では、下図に示すように、新しいマーケティングユーザーが Salesforce に追加されると、Cloudy の PSG 権限セットグループが割り当てられます。既存のユーザーがマーケティング部門を離れ、オペレーション部門に異動すると、そのユーザーから Cloudy の PSG 権限セットが削除されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7a169f66-2a92-401c-8837-2009e0eb7f65.png)

以下に示すように、新規ユーザーまたは既存ユーザーの変更について、ビジネスプロセスを文書化する際に、新規ユーザーがマーケティングユーザーなのか、それとも既存ユーザーの所属部署が以前はマーケティング部門だったが現在は別の部門になっているのかを評価する必要があります。そして、新規マーケティングユーザーの場合は、権限セットグループを割り当てます。ユーザーが以前マーケティング部門に所属していた場合は、権限セットグループを削除します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f64e5d92-c501-4a10-a23c-9ea1c150d0a3.png)

新しい権限セット グループを割り当てるための文書化された手順を詳しく見てみましょう。

まず、権限セットグループを特定する必要があります。名前は分かっていますが、Flow では権限セットグループ ID が必要です。ID は、権限セットグループレコードの詳細を確認することで取得します。ここでは、ベストプラクティスに従い、権限セットグループレコードを API 名または開発者名で検索します。これは、権限セットグループ名/ラベルよりも変更される可能性が低いためです。

しかし、その名前の権限セットグループが見つからないとします。もしかしたら、名前が間違っていたのかもしれません。基本的に、その権限セットグループレコードがなければ、ビジネスプロセスは終了してしまいます。この時点では、他にできることはあまりありません。

フローを使用する場合は、フローの失敗を防ぐために、安全性の検証やガードレールを整備する必要があります。Salesforceの設定画面では、ユーザーがすでに権限セットグループに割り当てられているかどうかをUIで視覚的に確認できます。フローは、バックグラウンドで、ユーザーの権限セット割り当てレコードと、ユーザーが割り当てられている権限セットグループがあるかどうかを確認します。

ユーザーに権限セットグループがない場合は、次のステップとして、ユーザーに権限セットグループを割り当てます（または権限セット割り当てレコードを作成します）。ただし、ユーザーにすでに権限セットグループが割り当てられている場合は、これ以上のアクションは必要ありません。これで作業は完了です。

以下のアニメーションGIFは、権限セットグループを割り当てるプロセスを示しています。各ステップを関連するフロー要素に変換することで、さらに一歩進めています。これは、フローを構築する際に役立ちます。

レコードが見つかったら、レコードの取得要素を使用して権限セット グループに関する情報を検索します。レコードの取得要素で権限セット グループ レコードが見つかったかどうかを判断するには、決定を行う必要があります。そのため、決定要素を使用します。次に、ユーザーが権限セット グループに割り当てられているかどうかを確認するには、権限セット割り当てオブジェクトを照会する必要があるため、もう一度レコードの取得要素を使用します。次に、レコードの取得要素でそのユーザーと権限セット グループの権限セット割り当てレコードが見つかったかどうかを判断する必要があります。これは、別の決定要素を使用して行われます。最後に、権限セット割り当てレコードが見つかった場合は、レコードの作成要素を使用して、ユーザーと権限セット グループの組み合わせに対して新しい権限セット割り当てレコードを作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5f7999ca-8f39-4a85-82ce-ffdd63a5618f.png)


ここで、権限セット グループを削除するシナリオを見てみましょう。

+ 権限セット グループを割り当てるプロセスと同様に、権限セット グループ ID を取得するには、権限セット グループを識別する必要があります。
+ 繰り返しますが、権限セット グループが見つからない場合は、作業は終了です。
+ フローが失敗しないように、安全性の検証も実施する必要があります。「設定」画面で、削除したい権限セットグループにユーザーが割り当てられているかどうかを視覚的に確認できます。最初のシナリオと同様に、そのユーザーと権限セットグループの権限セット割り当てレコードがあるかどうかを確認します。
+ ユーザーが権限セットグループを持っている場合は、次のステップとして権限セット割り当てレコードを削除（または削除）します。ユーザーが権限セットグループを持っていない場合は、何もする必要はありません。

レコードが見つかったら、レコードの取得要素を使用して、権限セット グループに関する情報を検索します。レコードの取得要素で権限セット グループ レコードが見つかったかどうかを判断するには、決定を行う必要があります。そのため、決定要素を使用します。次に、ユーザーが権限セット グループに割り当てられているかどうかを確認するには、権限セット割り当てオブジェクトを照会する必要があるため、もう一度レコードの取得要素を使用します。次に、レコードの取得要素でそのユーザーと権限セット グループの権限セット割り当てレコードが見つかったかどうかを判断する必要があります。これは、別の決定要素を使用して行われます。最後に、権限セット割り当てレコードが見つかった場合は、レコードの削除要素を使用して、ユーザーと権限セット グループの組み合わせの権限セット割り当てレコードを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b06d5aa9-fc32-47c6-a4e4-3c65896b737a.png)

それぞれのプロセスをそれぞれ独自のプロセスとフローとして設計できますが、両方のプロセスに共通するものに気づきましたか？ 2つのプロセスには4つの共通ステップがあります。さらに優れた設計は、同じステップを何度も繰り返して構築しないように、ステップを統合することです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cba7d946-7d32-4a3a-a60b-26bfc9c1d056.png)

Flow Builder に入る前にもう 1 つあります。

Salesforce がユーザーに権限セット グループを自動的に割り当てることができるように、必要な情報 (または入力) を決定する必要があります。

ユーザーは誰ですか?
権限セットグループとは何ですか?
何を実行しようとしているのでしょうか (この場合、権限セット グループの割り当てまたは削除)?

これら 3 つの情報は、3 つの個別の変数としてテキスト値として保存されます。

変数って何ですか？変数とは、フローの後半で使用したり、フローの外部に渡したりするために情報を保持するコンテナです。私はタッパーウェアの容器のようなものだと考えています。

+ 変数 varUserId にはユーザー ID が保持されます。
+ 変数 varPermissionSetGroupDeveloperName には、権限セット グループの API または開発者名が保持されます。
+ 変数 varPermSetGroupAction には、権限セットで実行する操作を反映した「Add」または「Remove」という値が保持されます。

権限セットの開発者名を使って権限セットのグループIDを見つけます。#AwesomeAdmins は自動化でIDをハードコードしないからです。Salesforceで何をするにしても、ハードコードは決してベストプラクティスではありません。ハードコードされた参照は、新機能のリリース時に問題を引き起こし、問題発生時のトラブルシューティングを困難にする可能性があります。ですから、ハードコードしないでください。

権限セットグループが見つかった場合、そのIDをvarPermissionSetGroupIdという変数に格納します。見つからない場合、この変数は空になり、権限セットグループがないことを示します。

このプロセスで取得するもう一つの重要な情報は、ユーザーが既に権限セットグループに割り当てられているかどうかです。この情報はvarDoesUserHasPSGという変数に格納します。割り当てられている場合は、割り当て先IDが格納されます。割り当てられていない場合は、変数は空になり、ユーザーに権限セットグループが割り当てられていないことを示します。

情報に基づいた意思決定を行うため、またはフロー内でアクションを実行するために使用する重要な情報を保持する変数は合計 5 つあります。


# それでは、自動化を構築してみましょう。

さて、準備は整いました。では、Flow でこれを構築してみましょう。Salesforce にログインするまでにどれだけ時間がかかったかお気づきですか？設定を構築する前に、かなりの検討プロセスが必要です。

このプロセスは、レコードトリガーフロー2つと自動起動フロー1つの計3つのフローに分割されます。このフローは、新規ユーザーの作成時、または既存ユーザーレコードの更新時にユーザーレコードに何らかの処理が行われることから始まります。これは、2つのレコードトリガーフローに分割されます。1つのプロセスは、ユーザーが新しいマーケティングユーザーかどうかを処理します。もう1つのプロセスは、ユーザーが以前マーケティング部門に所属していたかどうかに焦点を当てます。どちらのプロセスも、権限セットグループの追加または削除アクションの処理に同じプロセスステップを使用します。統合されたプロセス設計を覚えていますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2aec9fd3-7111-427b-95c5-98fba6b14d19.png)

権限セットグループの割り当て/削除を統合したフローを自動起動フローとして構築します。つまり、他の何かによってトリガーされたときに実行されるフローです。今回のケースでは、2つのレコードトリガーフローのいずれかによってトリガーされます。この自動起動フローは、プロセス内で権限セットの割り当てと削除のために2回再利用します。フローは、レコードトリガーフローから自動起動フローに渡される3つの入力変数に基づいて、処理内容を判断します。自動起動フローを別のフローで再利用することを「サブフロー」と呼びます。今回は、ユーザーに権限セットグループを割り当てたり削除したりする必要があるときにいつでも再利用できるコンポーネント化されたフローを構築します。一度構築し、一度メンテナンスすれば、何度でも再利用できます。#WorkSmartNotHard

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f1349913-f11b-4623-8ae0-c7ae28c8b09a.png)

レコードトリガーフローが自動起動フローを呼び出すには、まず自動起動フローを構築する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d1fbe579-fcb8-4ea0-aeab-0fe6a0df2bd5.png)


1. まず、自動起動フローの作成を選択します。
2. 次に、5 つのテキスト変数を作成します。


最初のテキスト変数はvarUserIdです。これは、レコードトリガーフローから渡されたユーザーIDを格納します。これを入力可能にしてください。

+ リソース: 変数
+ 名前: varUserId
+ データタイプ: テキスト
+ 入力可能: チェックあり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f882fb40-fb52-4176-a367-2929c692ab68.png)

2つ目のテキスト変数はvarPermissionSetGroupDeveloperNameです。これは、レコードトリガーフローから渡された権限セットグループAPIまたは開発者名を保存します。入力できるようにしてください。

+ リソース: 変数
+ 名前: varPermissionSetGroupDeveloperName
+ データタイプ: テキスト
+ 入力可能: チェックあり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c28a6e89-715a-4013-8437-50ba3e17a95b.png)

3つ目のテキスト変数はvarPermSetGroupActionです。これは、レコードトリガーフローから渡された「Add」または「Remove」の値を保存します。これを入力可能にしてください。

+ リソース: 変数
+ 名前: varPermSetGroupAction
+ データタイプ: テキスト
+ 入力可能: チェックあり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/52ff10fe-87c7-4021-831e-47900847e978.png)

4番目のテキスト変数はvarPermissionSetGroupIdです。varPermissionSetGroupDeveloperName変数の値を使用して権限セットグループオブジェクトをクエリする際に、この変数に権限セットグループIDが格納されます。

+ リソース: 変数
+ 名前: varPermissionSetGroupId
+ データタイプ: テキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8f45fc07-15bc-4826-8700-f3804b6ed662.png)

最後の5番目のテキスト変数はvarUserHasPSGです。これは、ユーザーと権限セットグループの権限セット割り当てオブジェクトをクエリし、値が見つかった場合に、割り当て先IDを保存します。

+ リソース: 変数
+ 名前: varUserHasPSG
+ データタイプ: テキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7a817370-4889-4526-a371-3162e46a901b.png)

最初のフロー要素はレコードの取得です。権限セットグループAPIまたは開発者名を使用して、権限セットグループIDを取得します。レコードが見つかった場合、権限セットグループIDを変数varPermissionSetGroupIdに格納します。レコードが見つからない場合、変数をnullに設定します。これは、「レコードが返されない場合、指定された変数をnullに設定する」チェックボックスをオンにすることで実行されます。

+ 名前: PSG ID を取得
+ オブジェクト: 権限セットグループ
+ フィルター: DeveloperName が varPermissionSetGroupDeveloperName に等しい
+ 保存するレコード数: 最初のレコードのみ
+ レコードデータの保存方法: フィールドを選択して変数を割り当てる (上級)
+ フィールド値を保存する場所: 別々の変数に保存
+ 権限セットフィールドを保存する変数を選択: Id → varPermissionSetGroupId
+ レコードが返されない場合、指定された変数をnullに設定する: チェックあり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6c74675f-dc6d-42a0-b6f8-bf0f3d1f6ed8.png)

次に、決定要素を使用して、レコード取得要素が権限セットグループレコードを見つけたかどうかを判断します。「Found」の結果は、varPermissionSetGroupId に値があるかどうか（つまり、Is Null False、つまり2つの負の値は正の値と等しい）を確認します。デフォルトの結果は「Not Found」です。

+ 名前: PSG Found
+ 結果: 見つかりました | varPermissionSetGroupId が Null False
* デフォルトの結果: 見つかりません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/07ea5064-f72f-4cdc-a71f-cf1bab013927.png)

ユーザーが権限セットグループに割り当てられているかどうかを確認するには、別のGet Records要素を使用して権限セット割り当てオブジェクトをクエリし、ユーザーと権限セットグループを含むレコードを検索する必要があります。権限セット割り当てレコードが見つかった場合は、担当者IDを取得して変数varUserHasPSGに格納します。レコードが見つからない場合は、「レコードが返されない場合、指定された変数をnullに設定する」チェックボックスをオンにして、変数をnullに設定します。

+ 名前: 参照権限セットの割り当て
+ オブジェクト: 権限セットの割り当て
+ 権限セット割り当てレコードのフィルター:
  + AssigneeId が varUserId と等しい
  + PermissionSetGroupId は varPermissionSetGroupId と等しい


+ レコードデータの保存方法: フィールドを選択して変数を割り当てる (上級)
+ フィールド値を保存する場所: 別々の変数に保存
+ 権限セットフィールドを保存する変数を選択: AssigneeId → varUserHasPSG
+ レコードが返されない場合、指定された変数をnullに設定する: チェックあり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/275956b8-b030-44eb-84e9-c9440e212933.png)


次のステップでは、別の決定要素を使用して、レコード取得要素が、そのユーザーと権限セットグループの権限セット割り当てレコードを見つけたかどうかを判断する必要があります。結果は「PSGに追加 - 未割り当て」と「PSGを削除 - 割り当て済み」の2つです。

前述のように、ユーザーに権限セットグループを追加する前に、そのユーザーが既に権限セットグループを持っていないことを確認する必要があります。持っていない場合、フローは失敗します。ここでは、varUserHasPSG変数がnull値（つまりIs Null True）であり、varPermSetGroupActionが「Add」であることを確認します。

権限セットグループを削除するには、ユーザーがその権限セットに割り当てられている必要があります。ここでは、varHasPSG変数に値（つまり、Is Null False、つまり2つの負数は1つの正数）があり、varPermSetGroupActionが「Remove」であることを確認します。

この決定により、権限セット グループ UI にすでに同じガードレールが配置されているフローにガードレールが配置されます。

+ 名前: ユーザーは既に割り当てられていますか?
+ 結果 #1: PSG に追加 – 割り当てなし | varUserHasPSG が Null True かつ varPermSetGroupAction が Add と等しい
+ 結果 #2: PSG の削除 – 割り当て済み | varUserHasPSG が Null False かつ varPermSetGroupAction が Remove と等しい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/06fb1cbc-7deb-4fcb-a01d-420ebd67adc2.png)

権限セット割り当てレコードが見つかり、varPermSetGroupAction が「追加」の場合、AssigneeId フィールドが変数 varUserId の値に設定され、PermissionSetGroupId フィールドが変数 varPermissionSetGroupId の値に設定されたレコード作成要素を使用して、ユーザーと権限セット グループの組み合わせの新しい権限セット割り当てレコードが作成されます。

+ 名前: PSGにユーザーを追加
+ 作成するレコード数: 1
+ レコードフィールドの設定方法: 個別のリソースとリテラル値を使用する
+ オブジェクト: 権限セットの割り当て
+ 権限セット割り当てのフィールド値を設定します。
  + 担当者ID: varUserId
  + PermissionSetId: varPermissionSetGroupId

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/534906ba-536c-4253-8992-00f773aa5b75.png)

最後に、決定結果がユーザーの権限セットグループを削除することである場合、「レコードの削除」要素を使用して、ユーザーと権限セットグループIDの組み合わせに対応する権限セット割り当てレコードを削除します。割り当て先IDが変数varUserIdに等しく、権限セットグループIDが変数varPermissionSetGroupIdに等しい権限セット割り当てレコードを削除します。

+ 名前: ユーザーから PSG を削除
+ 削除するレコードの検索方法：条件の指定
+ オブジェクト: 権限セットの割り当て
+ 権限セット割り当てレコードをフィルター: AssigneeId が varUserId と等しく、PermissionSetGroupId が varPermissionSetGroupId と等しい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/63333a37-0739-4844-8103-44ef1ac5d7c0.png)


動起動フローを保存し、「権限セット グループへのユーザーの割り当てまたは削除」という名前を付けます。

Flow デバッガーを使用してテストし、自動起動フローをアクティブ化することを忘れないでください。

モジュール化されたフローが完成したら、ユーザーへの権限セットグループの割り当てまたは削除のプロセスを起動するトリガーを作成する必要があります。前述の通り、レコードトリガーフローを使用して自動起動フローを起動します。

Addison が構築する 2 つのレコードトリガーフローのうち、最初のフローは次のようになります。このシンプルな 1 ステップのレコードトリガーフローは、新しいマーケティングユーザーが作成されたとき、または既存ユーザーの部署がマーケティング部門に変更されたときに実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/caffe6a6-7e8c-4d8e-bad3-06047ac2ad70.png)

2 番目のレコードトリガーフローは、既存のユーザーがマーケティング部門に所属しなくなったときに起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9cbb103d-9a65-415f-acbe-0cfc396414ec.png)

最初のレコードトリガーフローの構成を見ていきましょう。

レコードトリガフローは、ユーザーレコードが作成または編集され、ユーザーの部署がマーケティングである場合に開始されます。このフローから自動起動フローを呼び出すため、アクション要素を使用します。そこで、「アクション」と「関連レコード」を選択します。

+ オブジェクト: ユーザー
+ フローをトリガーするタイミング: レコードが作成または更新されたとき
+ エントリ条件の設定: すべての条件が満たされている (AND)
  + 部門はマーケティング
+ 更新されたレコードのフローを実行するタイミング: 条件要件を満たすようにレコードが更新されたときのみ
+ アクションと関連レコードのフローの最適化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c1ea4feb-e18c-4d6b-8337-1aa4864d5a0d.png)


次に、アクションを使用します。具体的には、ユーザーに権限セット グループがまだ割り当てられていない場合は、サブフロー (自動起動フロー) を参照して、ユーザーに権限セット グループを追加します。

+ サブフロー名: 権限セットグループにユーザーを割り当てまたは削除する
+ 変数を次のように設定し、変数が含まれるように切り替えます。
  + varPermissionSetGroupDeveloperName: Cloudy_PSG (これは権限セット グループの API 名です。)
  + varPermSetGroupAction: Add (ユーザーに権限セット グループを追加します。)
  + varUserId: {!$Record.Id} (これはレコードトリガフローを起動したレコード ID です。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bdf67c88-a090-48d7-be8f-0bc17ae6f43a.png)

このレコードトリガーフローを「新しいマーケティングユーザーまたはマーケティングに更新されたユーザー」として保存しましょう。

フローデバッガーを使用して、想定される結果（新しいマーケティングユーザーとマーケティング部門に異動した既存ユーザー）と、ユーザーがエントリー基準を満たさない場合（つまり、マーケティング部門以外の部門に異動した新しいユーザー）の両方をテストします。その後、フローをアクティブ化します。

次に、2 番目のレコード トリガー フローを構築しましょう。

このレコードトリガフローは、ユーザーレコードが更新され、ユーザーの部署がマーケティング部門以外で、かつ部署が変更されたときに開始されます。このフローから自動起動フローを呼び出すため、アクション要素を使用します。そのため、「アクション」と「関連レコード」を選択します。

+ オブジェクト: ユーザー
+ フローをトリガーするタイミング: レコードが更新されたとき
+ エントリ条件の設定: すべての条件が満たされている (AND)
  + 部門はマーケティングと同じではない
  + 部門が変更されました

+ 更新されたレコードのフローを実行するタイミング: レコードが更新され、条件要件を満たすたびに
+ アクションと関連レコードのフローの最適化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/669098c0-eba7-4492-976d-11c812f264c8.png)


次に、ユーザーが以前マーケティング部門に所属していたかどうかを判断するための決定要素が必要です。「マーケティング部門に所属」という結果を得るには、ユーザーレコードの部門フィールドの以前の値が「マーケティング」であったかどうかを確認する必要があります。デフォルトの結果は「以前はマーケティング部門に所属していなかった」に設定されています。

+ 名前: ユーザーは以前マーケティングを行っていましたか
+ 結果1: マーケティングの一環
  + $Record__Prior>部門がマーケティングに等しい
  + 結果を実行するタイミング: 条件要件が満たされた場合

+ デフォルト: 以前はマーケティングの一部ではなかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f5ffb87f-54f2-41ab-ac30-9495153ddc47.png)


「マーケティングの一部」の決定結果については、アクションを使用します。具体的には、自動起動フローをサブフローとして参照し、ユーザーにすでに権限セット グループが割り当てられている場合は、その権限セット グループをユーザーから削除する必要があります。

+ サブフロー名: 権限セットグループにユーザーを割り当てまたは削除する
+ 変数を次のように設定し、変数が含まれるように切り替えます。
  + varPermissionSetGroupDeveloperName: Cloudy_PSG (これは権限セット グループの API 名です。)
  + varPermSetGroupAction: Remove (ユーザーから権限セット グループを削除します。)
  + varUserId: {!$Record.Id} (これはレコードトリガフローを起動したレコード ID です。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d2b84df0-ede2-4514-a717-0eb43d0803d8.png)


このレコードトリガーフローを「ユーザーはマーケティングに所属しなくなりました」として保存しましょう。

フロー デバッガーを使用して、予想される結果 (マーケティングから移動した既存のユーザー) とユーザーがエントリ基準を満たさない結果 (マーケティングに所属したことのない既存のユーザー) をテストし、フローをアクティブ化します。

権限セットグループを自動的に割り当てたり削除したりするシナリオが増えてきたら、自動起動フローをサブフローとして呼び出す、レコードトリガーフローを新たに作成できます。一度構築すれば、一度メンテナンスすれば、何度でも活用できます。#WorkSmartNotHard

さあ、あなたの番です。組織内の権限セットグループの割り当てと削除のプロセスを今すぐ自動化しましょう！