抓出 Queue 裡面所有的 User / Get All Users in a Queue

想抓出 Queue 裡面所有的 User?

在最簡單的情況下,queue 裡面裝的如果全是 user ,那就只要用 SOQL 去撈即可。
但是有一點超乎直覺的是,當我們要從 Group 裡抓出 GroupMember,只要

SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE GroupId = '00Gxxxxxxxxxxxxxxx'

可是 Salesforce 裡不但沒有 QueueMember 這個 object,甚至也沒有 Queue 這個 object。不知道要去哪裡查 queue Id。

蛤?為什麼 queue 沒有 object?

因為所謂的 queue,其實就是一種特別的 group。
所以上面那行 SOQL 是完全通用的。

SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE GroupId = '00Gxxxxxxxxxxxxxxx'

此處 criteria 的 GroupId,其實代表的也是 queue 的 Id。
queue 的 Id,的確也是 00G 開頭的,是貨真價實的 Group 無誤。


那如果想撈的目標 group 裡面不單只有 user 怎麼辦?

如果 group 裡全都是直接裝著 user record,那上面的 SOQL 就很夠用了。但是 Group 裡面除了直接裝 user,還有可能也裝著別的 sub group。
這時候你就需要往下挖一層,再做一次:

SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE GroupId = 'sub_group_id'

(視情況需要,你可能要不斷地挖上好幾層,直到沒有 sub group 為止)

更複雜一點的情況是: group 裡還可以裝 UserRole。
而且 UserRole 還會有一個對應 00G 開頭的 Id,以致於它躲在 GroupMember 裡的時候,看起來就是一個普通的 Group。結果你嘗試用 UserRole 的 00G Id 一撈,

SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE GroupId = '00Gxxxxxxxxxxxxxxx'

才發現 GroupMember 裡面根本沒有屬於這個 00G Id 對應的 user。

若想撈出屬於 UserRole 之下的 user,請乖乖地去 user object:
SELECT Id,UserRoleId FROM User WHERE UserRoleId = '00Exxxxxxxxxxxxxxx'

啊,我從 GroupMember 出發的,沒有看到什麼 00E 的 Id 啊?
這個要去 Group object 查 RelatedId :
SELECT RelatedId FROM Group WHERE Id = '(你從GroupMember抄來的UserRole的00G Id)'



未完待續

此篇僅先說明一下重點觀念。
預計下一篇文章會提供一份 sample code,讓你可以用 Apex code 去抓取這些 user。

留言

這個網誌中的熱門文章

ISC2 CC (Certified in Cybersecurity Certification) 考試心得

Salesforce證照考試心得 (Administrator and Advanced Administrator)