データローダーを使って、キューと公開グループに所属するロールを出してみた

# このドキュメントは何
SalesforceのロールとロールメンバーとグループをデータローダでExportして、
Excelでこねこねしてキューや公開グループに所属するロール一覧を作成しました。備忘として手順を記載しておきます。

# 背景
ロール変更の影響調査のため、どのキューや公開グループにどのロールが所属しているか知りたかった。

# 調査
以下のhelpを見てみると、どうやらキューはグループオブジェクト、キューメンバーはグループメンバーオブジェクトで管理されているらしい。

 [レポートを使用したキューメンバーの監視](https://help.salesforce.com/s/articleView?id=service.queues_membership_reporting.htm&type=5)
 
 help通りにレポートタイプ、レポートも作ってみたが、キューが正しく表示されない。そのため、データローダでデータをExportして、リストを突合してキューや公開グループに所属するロール一覧を作成してみることにした。

# 手順
- データローダーでExport
   - グループ（Group）オブジェクトの全項目、全レコードをExport
   - 同様にグループメンバー（GroupMember）、ロール（Role）オブジェクトの全項目、全レコードをExport
- Exportしたデータを加工してキューや公開グループに所属するロール一覧を作成
     作成するリストに必要な列は以下の通りです。

| 項目 | 説明 | 記述例 |
| ---- | ---- | ---- |
| GroupMember.Id | グループメンバーオブジェクトのId | 「011」から始まる18桁の文字列 |
| GroupId | グループオブジェクトの参照項目 | 「00G」から始まる18桁の文字列 |
| **Group.Name** | グループのName項目。Group.TypeがRegularかQueueの場合には値が入る | 公開グループやキューの表示ラベル |
| **Group.Type** | グループの種別項目。公開グループ、キューなど。Regularが公開グループのこと。 | Regular, Queue, RoleAndSubordinatesInternalなど |
| **Group.種別** | 英語のままだと分かりずらかったのでGroup.Type列を日本語に置き換えました。Regularは公開グループ、Queueはキュー | レギュラー、キューなど |
| GroupMember.UserOrGroupId | ユーザーかグループオブジェクトの参照項目 | 「00G」（公開グループ）または「005」（ユーザー）から始まる18桁の文字列 |
| **Role.Name** | ロールオブジェクトのName項目 | ロールの表示ラベル |

- グループメンバーオブジェクトのExportデータをもとにして、必要な列を他オブジェクトのシートからVLOOKUPなどで引っ張って追加します。上表の太字の項目が追加する列です。
    1.  Group.Name
        1.  GroupMember.GroupIdとGroup.Idが一致するグループオブジェクトのName項目の値を持ってきます。
    2.  Group.Type
        1.  GroupMember.GroupIdとGroup.Idが一致するグループオブジェクトのType項目の値を持ってきます。
    3.  Group.種別
        1.  個人的に英語のままだと分かりずらかったのでGroup.Type列を日本語に置き換えました。Regularは公開グループ、Queueはキューに置き換えました。
    4.  Role.Name
       1.  ちょっとややこしく、二段階加工が必要になります。
       2.  前段階として、グループオブジェクトにRole.Nameという列を追加します。
              グループオブジェクトのName項目には、ロールの表示ラベルが入らないようです。Type項目の値がRoleから始まる文字列の場合はNameが空欄でした。（ちなみにType=Queue、RegularのNameには値が入っていました。）
              Group.RelatedIdとRole.Idが一致するロールオブジェクトのName項目を持ってきます。
       3.  続いて、これまで作成してきたリストに戻り、Role.Name列にGroupMember.UserOrGroupIdとGroup.Idが一致するRole.Name項目の値を持ってきます。
- これで、キューや公開グループに所属するロール一覧を出すことができました。
  - 今回はロールの確認さえできればOKだったのでこれで終わりですが、ロール以外にキューや公開グループに所属するロール以外のメンバー（ユーザーやキュー、公開グループ）を出したい場合は、UserOrGroupIdをキーにユーザーオブジェクトやグループオブジェクトから必要な情報を追加すればよさそうです。

# 知見
- キューはGroupオブジェクトで管理しているようでした。
- ロールもGroupオブジェクトで管理しているようでした。（グループオブジェクトのTypeを分けて管理している様子）
- Groupオブジェクトは公開グループ以外にも広めのものを管理するオブジェクトのようです。
    グループのメンバーとしてキューやロールなどいろいろなものを選べるので、そうしておかないと構造として難しいのかな。
- GroupMemberオブジェクトはGroupと所属するユーザーやロールをつなぐ中間オブジェクト。GroupIdがグループの参照関係で、UserOrGroupIdがユーザーやロールの参照関係となっている
- 公開グループはGroupオブジェクトで管理していて、ChatterグループはCollaborationGroupオブジェクトらしい
- キュー（Queue）オブジェクトはないようだった。キューの sObject（QueueSobject）というオブジェクトがある。
  結局使わなかったのでなんなのかよく分かっていないです。

# リファレンス
- [レポートを使用したキューメンバーの監視](https://help.salesforce.com/s/articleView?id=service.queues_membership_reporting.htm&type=5)
- [データローダでの公開グループメンバーシップの管理](https://help.salesforce.com/s/articleView?id=000385341&type=1)
- [データローダによる公開グループの一括作成手順](https://help.salesforce.com/s/articleView?id=000382133&type=1)
- [Group | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_group.htm)