Salesforce「権限セット」を柔軟に一括編集する

# はじめに

Salesforceのシステム管理者であれば必ずと言うほど作業することになるのが権限セットの設定だと思います。

各オブジェクトや項目に対する「参照」「編集」といった権限を画面上でチェックボックスをポチポチすることで設定できる機能ですが、この作業がなかなかに面倒なことが多いです。
既存のものを少しイジるくらいの変更であればいいですが、ド新規での環境構築や、管理者並みに多くの権限を設定する際などに権限セットをイチから作るとなると、ポチポチ作業ではとてつもなく時間を要してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683328/b8aa6dfa-1ff6-89c3-e65f-5e269edbdd71.png)
そこで権限セットを画面上ではなく、メタデータで操作することで柔軟に編集できないかやってみました。
最近ではアドオンなどを使っても出来そうな気もしますが、今回は汎用性があればいいなと思い、権限の設定書（スプレッドシート）を基にメタデータを生成⇒VSCodeでデプロイするという方法を考えました。

# メタデータの取得

「マスタ管理者権限(SampleMasterAdmin)」という権限セットを予め新規で作成し、VSCodeでメタデータを取得してみます。
「package.xml」のtypes内に対象の権限セットを指定します。

```xml:package.xml
～略～
    <types>
        <members>SampleMasterAdmin</members> <!-- 権限セットのAPI参照名 -->
        <name>permissionset</name>
    </types>
```
「SFDX:マニフェストファイルのソースを組織から取得」を実行すると「permissionsets」ディレクトリにメタデータが格納されます。
まだ何も設定していないためメタデータの中身も空であることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683328/04dabf0c-8d3e-41e4-defe-517a67415608.png)

# スプレッドシートによるメタデータの生成

今回は例として、取引先オブジェクトの全てのアクセス権の有効化と項目に対する「参照」「編集」の権限を設定します。
まずオブジェクトに対する各アクセス権の有効化について、メタデータのソース内ではそれぞれ以下の通り記述されます。

```xml
    <objectPermissions>
        <object>Account</object> <!-- 対象オブジェクト -->
        <allowRead>true</allowRead>     <!-- 参照権限 -->
        <allowCreate>true</allowCreate> <!-- 作成権限 -->
        <allowEdit>true</allowEdit>     <!-- 編集権限 -->
        <allowDelete>true</allowDelete> <!-- 削除権限 -->
        <viewAllRecords>true</viewAllRecords>     <!-- すべて表示権限 -->
        <modifyAllRecords>true</modifyAllRecords> <!-- すべて変更権限 -->
    </objectPermissions>
```
続いて1つの項目に対する「参照」「編集」の権限は以下の通りです。

```xml
    <fieldPermissions>
        <field>Account.AccountNumber</field> <!-- 対象項目 -->
        <readable>true</readable> <!-- 参照権限 -->
        <editable>true</editable> <!-- 編集権限 -->
    </fieldPermissions>
```
これを踏まえて、以下のように権限の設定書からメタデータのソースが生成されるように関数を用いたスプレッドシートを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683328/b73f6172-9a4d-fafa-171c-c37052d26010.png)
関数について、文字を結合するだけの簡単なものですが以下の通りになっています。
__セルF3：オブジェクトに対する設定__
```="<objectPermissions><object>"&B2&"</object><allowRead>"&C2&"</allowRead><allowCreate>"&D2&"</allowCreate><allowEdit>"&E2&"</allowEdit><allowDelete>"&F2&"</allowDelete><viewAllRecords>"&G2&"</viewAllRecords><modifyAllRecords>"&H2&"</modifyAllRecords></objectPermissions>"
```
__セルF5：各項目に対する設定__
```=ARRAYFORMULA(IF(E5:E<>"","","<fieldPermissions><field>"&$B$2&"."&B5:B&"</field><readable>"&C5:C&"</readable><editable>"&D5:D&"</editable></fieldPermissions>"))
```
上記関数により各権限のチェックボックスに応じて青部分にソースが生成されます。
E列「対象外」では、そもそも変更できないような権限などデプロイ時に弾かれてしまう項目について予めソースから除外されるように設定しています。

# メタデータのデプロイ

生成したソースをVSCodeのメタデータ内に貼り付ければ準備完了です。
「SFDX:組織へソースをデプロイ」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683328/864b659f-1ec6-08fe-606d-ff8933f697a7.png)

仮に変更できない権限が含まれる場合は以下のようにエラーとなるため、スプレッドシートのE列「対象外」にて除外する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683328/e9f1887b-82cb-ef95-8d83-6cad291176bb.png)

デプロイ完了後、実際の画面上で全ての権限が設定されたことを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683328/b269c831-8dd2-351d-e7fc-4fed2b36c2dc.png)

# 終わりに

今回は取引先オブジェクトの設定のみでしたが、他のオブジェクトについても同様にシートを作成することでソースを生成⇒デプロイが可能となったので、設定書から柔軟にそして一括で権限セットを設定できるようになりました。
また、応用してプロファイルの権限設定についても一括編集が可能だと考えられるので、今後試してみようと思います。

権限セットについては、データローダを使ってユーザへの割り当てを一括で行う方法がよく紹介されますが、編集自体を一括で行う方法というのはあまり見かけないなと思い今回紹介してみました。
少しでも参考になれば幸いです。