[salesforce][chatter]Chatter Cheat Sheetについて
Chatter Cheat Sheetを一通り検証し日本語に翻訳をしました。
※翻訳に誤ってる箇所がありましたらコメントにて指摘を頂けると助かります。
※「Chatterで使用している標準オブジェクト」と一緒にご覧ください。
Chatter Data Model
Chatterで使用する主なモデルは下記となります。
これら上記モデルがChatterデータの大部分を占めています。
- UserProfileFeedは、ユーザのプロフィール、ユーザのフィード変更情報が格納されています。
- NewsFeedはユーザのフォローしているユーザのフィード情報および所属しているグループのフィード情報が格納されます。
- CollaborationGroupFeedは所属しているグループのユーザの情報が格納されます。
- Record feedsは共有された各オブジェクトの情報が格納されます。
これらを総称してfeed itemsと呼びます。
ですがfeed itemsに全てのChatterデータが格納されるわけではありません。
コメントはFeedComment、フィードの詳細についてはFeedTrackedChangeに格納されます。
またこれらはUserProfile、NewsFeedから必要情報を取得して参照可能となります。
Feed Items
このオブジェクトはNewsFeed、UserProfileFeed、record feedsからできています。
Type項目は、何の情報であるかを意味します。(TextPost, LinkPost,ContentPost, TrackedChangeなど)
TrackedChangeの場合にはFeedTrackedChangeに詳細情報が格納されていいます。
これら以外のTypeの場合にはAccountFeed,CollaborationGroupFeed,NewsFeedのいずれかにデータが格納されています。
またフィードの情報はそれぞれ何によって作成されたかといった情報を持っています。
例えば自分のプロフィールを変更した際に作成されるプロフィール変更のフィードには自分のUserIDがParentIDとしてセットされます。
項目 | 説明 |
---|---|
Type | UserStatusのいずれかがセットされる。(TextPost, LinkPost, ContentPost,TrackedChange) |
CreatedDate | feedの作成日 |
CreatedById | feedを作成したユーザのID |
InsertById | 基本的には作成したユーザIDだが、API等を経由して作成した場合は異なるIDがセットされる。 |
ParentId | feedに関連するID |
Record Feeds
Record Feedsは基本的に殆どのfeed情報が格納されています。
全てのfeed情報にFeedItemIDがあり、このIDを使用してUserProfileFeed、NewsFeedを取得することができます。
項目 | 説明 |
---|---|
FeedItemId | feedのID |
Body | 投稿内容やユーザのプロフィール変更の情報がセット |
LinkURL | リンクを指定した際にセットされるリンクのURL |
Title | リンクやコンテンツのタイトル |
ContentType | コンテンツのMIME-TYPE |
ContentSize | コンテンツのファイルサイズ |
ContentFileName | コンテンツのファイル名 |
ContentDescription | コンテンツの詳細説明 |
ContentData | コンテンツの実態(Base64-encoded) |
CommentCount | フィードに対するコメントの件数 |
LikeCount | フィードに対する「いいね」の件数 |
Create a new Text Post
[php]
FeedItem fItem = new FeedItem();
fItem.Type = ‘TextPost’;
fItem.ParentId = <Id of User or Record>;
fItem.Body = ‘The mice will see you now’;
insert fItem;
[/php]
Typeについては変更できません。詳細はCurrentStatusを参照してください。
追加したデータは下記のページで確認できます。
- ホームタブ
- 投稿したデータの特定ページ
- プロフィールタブ
Record Feeds – FeedTrackedChanges
フィードの変更があったオブジェクト(ユーザやデータ)については、変更情報をrecord feedsに保持しています。
Record Feedsは標準オブジェクト用の名前が付与されます。例えばAccountはrecord feedを表すAccountFeedオブジェクトがあります。
カスタムオブジェクトについては、Foo__cが持ってるrecord feedsはFoo__Feedといった形になります。
項目が変更された等の詳細についてはFeedTrackedChangeに格納されます。
OpportunityFeed Feed Items on a Record
[php]
ID OpportunityId = <Id of an opportunity>;
List<OpportunityFeed> oRFeed = [
SELECT Id, Type, CreatedBy.Name, Parent.Name, Body
FROM OpportunityFeed WHERE ParentId = :OpportunityId
ORDER BY CreatedDate DESC, Id DESC LIMIT 20
];
[/php]
Record Detail Page Query
[php]
ID accountId = <Id of an Account>;
List<AccountFeed> aRFeed = [
SELECT Id, Type, CreatedDate, CreatedById, CreatedBy.Name,
ParentId, Parent.Name, FeedItemId, Body,
Title, LinkUrl,
(SELECT Id, FieldName, OldValue, NewValue
FROM FeedTrackedChanges),
(SELECT Id, CreatedDate, CreatedById,
CreatedBy.Name, CommentBody
FROM FeedComments ORDER BY CreatedDate DESC)
FROM AccountFeed WHERE ParentId = :accountId
ORDER BY CreatedDate DESC, Id DESC LIMIT 10
];
[/php]
このQueryはAccountレコードの詳細を表示するために使用します。
このクエリを少々変えることで、AccontFeedと異なるrecord feedを一緒に表示することも可能です。
結果についてはProfile Tab Queryでも記述しています。
NewsFeed
このオブジェクトは自分の投稿、フォローしているユーザの投稿、所属しているグループの投稿情報が格納されています。このオブジェクトはChatterタブに表示されています。
feedのParentIdにはユーザのID、フォローしているユーザのID、所属グループのIDがセットされます。
NewsFeedは自分自身の情報の閲覧可能です。
項目 | 説明 |
---|---|
FeedItemId | feedのID |
ParentId | feedに関連するID |
Type | UserStatusのいずれかがセットされる。 |
注意:
もしAcmeが私をフォローしたfeedを、私をフォローしているJACKが見た場合、ParentIDにはAcmeが設定されています。
誰による投稿か確認する場合はCreatedBy(システム項目)を使用します。
NewsFeed Feed Items on Users and Records I Follow
[php]
List <NewsFeed> aNewsFeed = [
SELECT Id, Type, CreatedBy.Name, Parent.Name, Body
FROM NewsFeed
ORDER BY CreatedDate DESC, Id DESC LIMIT 20
];
[/php]
下記の例は使用中のChatterタブに表示されているフィードから省略したデータを戻します。
CreatedBy.Nameはフィードを作成したユーザを表示するため指定します。
Parent.Nameは使用ユーザ名またはフォローしているアイテム名が設定されます。
また対象フィードのTypeがTrackedChangeでない限り、nullとなる事はありません。
Chatter Tab Query
[php]
List <NewsFeed> aNewsFeed = [
SELECT Id Type CreatedDate
ParentId Parent.Name FeedItemId
Title LinkUrl
(SELECT Id FieldName OldValue
FROM FeedTrackedChanges)
(SELECT Id CreatedDate CreatedById
CreatedBy.Name CommentBody
FROM FeedComments ORDER BY CreatedDate DESC)
FROM NewsFeed ORDER BY CreatedDate DESC Id DESC LIMIT 10
];
[/php]
UserProfileFeed
このオブジェクトは自分の投稿、プロフィールの変更情報および@を使用したダイレクトメッセージ情報が格納されています。
またこのフィード情報はSalesforce Chatterアプリケーションのプロファイルタブに表示されています。
UserProfileFeedのフィード情報では作成ユーザの情報を閲覧する事も可能です。
注意:UserProfileFeedを参照する場合、条件にUserIDが必須となります。
UserProfileFeed Feed Items indicating Posts a User has Made
[php]
ID userID = <id of User>;
List <UserProfileFeed> uposts = [
SELECT Id
FROM UserProfileFeed WHERE Type = ‘TextPost’
WITH UserId=:userId
ORDER BY CreatedDate DESC, Id DESC LIMIT 10
];
[/php]
このクエリでは指定したユーザに関連する直近10件の投稿情報を戻しています。
WITHを使用してどのユーザのプロファイル情報を取得するか指定します。
上記の例でWHERE句を省略した場合はType=trackedchangesを含んだレコードが戻ります。
ParentIdには更新したオブジェクトのIDがセットされています。
Profile Tab Query
[php]
ID userID = <id of User>;
List <UserProfileFeed> = [
SELECT Id Type CreatedDate
ParentId Parent.Name FeedItemId
Title LinkUrl LikeCount
(SELECT Id FieldName OldValue
FROM FeedTrackedChanges)
(SELECT Id CreatedDate CreatedById
CreatedBy.Name CommentBody
FROM FeedComments ORDER BY CreatedDate DESC)
FROM UserProfileFeed WITH UserId = :userId
ORDER BY CreatedDate DESC Id DESC LIMIT 10
];
[/php]
このクエリではプロファイルタブの表示データを取得しています。
フィードに対して、コメントや「いいね」が紐付いてる場合には、1レコードに対して複数のリスト型のデータが戻ってきます。
またフィードのTypeがtrackedchangesの場合には、FeedTrackedChangeオブジェクトに関連するデータが格納され、プロファイル情報の更新ごとのレコードが作成されています。
なので、プロファイルを変更するユーザはFeedTrackedChangeオブジェクトを更新する権限が必要となります。
FeedTrackedChange
各フィードの変更情報が格納されています。このオブジェクトを参照する場合にはUserProfileFeed、NewsFeed、record feedを通じて行ってください。
Tracked Changes to a Record
[php]
ID OpportunityId = <Id of an opportunity>;
List<OpportunityFeed> oEFeedT = [
SELECT Id Type CreatedBy.Name
(SELECT OldValue NewValue FROM FeedTrackedChanges)
FROM OpportunityFeed
WHERE ParentId = :OpportunityId AND Type = ‘TrackedChange’
ORDER BY CreatedDate DESC Id DESC LIMIT 20
];
[/php]
上記の例は商談オブジェクトの変更情報を抽出しています。
FeedComment
このオブジェクトにはコメント情報が格納されています。
コメントは各フィードの子オブジェクトとなっており、UserProfileFeedやNewsFeedと紐付けての取得のみ可能となっています。
また投稿データのIDはユーザの変更により変わる可能性があるため、ParentIDを使用してどのオブジェクトに紐付いてるか確認することができます。
Create a Comment
[php]
FeedComment fcomment = new FeedComment();
fcomment.FeedItemId = <feedItemId>;
fcomment.CommentBody = ‘This is a profound comment.’;
insert fcomment;
[/php]
上記の例を行うには、コメントを付加するFeedのItemIDが必要となります。
EntitySubscription
このオブジェクトでは、ユーザ/データのフォロー/フォロワーの関係が格納されています。
Followers of a User or Record
[php]
ID uid = <Id of User or Record>;
List<EntitySubscription> followers = [
SELECT Id, SubscriberId, Subscriber.Name
FROM EntitySubscription WHERE ParentId = :uid
];
[/php]
List the Users and Records I Follow
[php]
ID uid = <Id of User>;
EntitySubscription[] followingES = [
SELECT Id, ParentId, SubscriberId, Parent.Name
FROM EntitySubscription WHERE SubscriberId = :uid
];
[/php]
WHERE句にParent.Type=’User’を付加することでユーザのみ表示することが可能です。
List Subscriptions to Records
[php]
ID uid = <Id of User>;
List<EntitySubscription> les = [
SELECT Id, Parent.Name FROM EntitySubscription
WHERE SubscriberId = :uid AND ParentId IN
(SELECT Id FROM Account WHERE NumberOfEmployees >= 10)
];
[/php]
上記の例は、従業員が10人以上取引先企業でフォローしているデータが取得できます。
CollaborationGroup
このオブジェクトにはChatterのグループ情報が格納されています。
CollaborationGroupにはCollaborationGroupFeedと呼ばれるGroup内のフィード情報を格納したデータを持っており、グループに所属するフィードを取得する際に使用します。
List Groups
[php]
List<CollaborationGroup> oG = [SELECT Name, Description,
CollaborationType, OwnerId from CollaborationGroup];
[/php]
上記の例では、組織内全てのChatterグループを取得しています。CollaborationTypeにはPublicかPrivateのいずれかが設定されています。
List a Group’s Feed
[php]
ID cgid = <Id of a group>;
List<CollaborationGroupFeed> ic = [
SELECT Id, Type, ParentId, Parent.Name, FeedItem.Id,
FeedItem.Type , FeedItem.Body, FeedItem.Title,
(SELECT Id, FieldName, OldValue, NewValue
FROM FeedTrackedChanges ORDER BY Id DESC),
(SELECT Id, CommentBody, CreatedDate, CreatedById,
CreatedBy.FirstName, CreatedBy.LastName
FROM FeedComments
ORDER BY CreatedDate DESC, Id DESC LIMIT 4)
FROM CollaborationGroupFeed WHERE ParentId = :cgid
ORDER BY CreatedDate DESC, Id DESC LIMIT 20
];
[/php]
グループの名前や説明を変更した際には、変更情報が表示されます。
上記の例ではグループのフィード・変更情報および付随するコメントを取得しています。
CollaborationGroupMember
このオブジェクトにはChatterグループのメンバー情報が格納されています。
List Members of a Group
[php]
ID cg = <Id of a Chatter group>;
List<CollaborationGroupMember> oM = [
SELECT MemberId, CollaborationGroup.Name
FROM CollaborationGroupMember WHERE CollaborationGroupId = :cg
];
[/php]
上記の例では、指定したグループのメンバーIDと名称を取得します。
Add a User to a Group
[php]
ID uid = <Id of a user>;
ID cgid = <Id of a group>;
CollaborationGroupMember cgm = new CollaborationGroupMember(
memberid = uid, collaborationgroupid = cgid);
insert cgm;
[/php]
CollaborationGroupMemberRequest
このオブジェクトでは、非公開グループにおけるユーザの申請情報が格納されています。
また自分が管理者となっているグループにおいては、承認・却下の操作も可能です。
create()を使用することで、グループの管理者に対して申請メールを送る事ができます。
グループの管理者による承認・却下を行った際に、申請者にメールで通知されます。
また却下の場合は理由を通知する事が可能です。
CurrentStatus
ユーザがChatterで投稿を行った際には、UserオブジェクトのCurrentStatusが更新されます。
またUserProfileFeedにおいても更新が行われます。
Update a User’s Status
[php]
ID uid = <Id of User>;
User user = [SELECT Id, CurrentStatus FROM User WHERE Id = :uid];
user.CurrentStatus = ‘new and exciting status message’;
update u;
[/php]
上記の例ではユーザ投稿の更新を行います。
注意:ユーザ投稿を削除した場合、CurrentStatusの値はクリアされません。
Chatter Triggers
FeedItem、FeedCommentではApexTriggerを作成する事ができます。
record feedにおいては作成できませんが、ユーザの行動のrecord feedにおいては作成可能です。
Triggerは追加・削除のみ対応しています。FeedItemのTypeがTextPost,LinkPost,ContentPostの追加時に行うことができます。
ユーザのステータス情報更新ではTriggerは動作しません。
Apex CodeではChatterコンテキスト内の処理のみ追記可能です。
トリガーを使用して非公開グループに対して投稿を行う際には、グループに所属しているメンバーでなければなりません。
グループに所属していないメンバーの場合は、CreatedByIdにメンバーのIDがセットされFeedItemが作成されます。
下記の例では、誰かが投稿を行った時に動作するTriggerです。
例えば特定の文字に基づいて処理を実施することもできます。
(例:商談がクローズとなった場合に処理を行う。)
[php]
Trigger CheckChatterPostsOnOpportunity on FeedItem (before insert)
{
// Get the key prefix for the Opportunity object
// using a describe call.
String oppKeyPrefix = Opportunity.sObjectType.getDescribe().
getKeyPrefix();
for (FeedItem f: trigger.new)
{
String parentId = f.parentId;
// Compare the start of the ‘parentID’ field
// to the Opportunity key prefix to
// restrict the trigger to act on posts made to the
// Opportunity object.
if (parentId.startsWith(oppKeyPrefix) &&
f.Body == ‘!close’)
{
// Add your business logic here
}
}
}
[/php]
Writing Efficient Chatter Triggers
- 組織内のトリガーはすべて把握しておく
- isEmptyを使用して、ロジックの制限を行う
- トリガー処理の共通化
※殆どのトリガーはFeedItemまたはFeedCommentで起動 - UserStatusはUser上にある事に注意する
- FeedItemは絞り込んで処理を行う。
※トリガーでのフィードTypeの種類は、TextPost, LinkPost, ContentPost
※トリガーで、オブジェクトのTypeを識別するのは下記の形式を使用する
ContentDocumentLink
ContentDocumentLinkではSalesForceCRMやChatterにアップされたファイルが、Chatterで共有された情報が格納されます。
ファイルは他のユーザ、Chatterグループ、SalesForceCRMと共有する事ができます。
例えばChatterでアップロードを行ったファイルのタイトル、説明を検索する事ができます。
[php]
SELECT ContentDocument.LatestPublishedVersion.Title,
ContentDocument.LatestPublishedVersion.Description
FROM ContentDocumentLink
WHERE LinkedEntityid = ‘<entity-id>’
[/php]
CollaborationInvite
このオブジェクトを使用する事でChatterに招待/削除ができます。
招待ではChatter(グループなし)またはChatter内グループのいずれかとなります。
Chatter内グループに招待する事でChatter(グループなし)の閲覧も可能となります。
招待されたユーザはグループ内のプロファイルやフィードの閲覧は可能ですが、他のデータについては閲覧できません。
Writing Efficient SOQL Queries
- フィードを抽出する際はLIMITを使用して、1回20件程度とする
- 抽出条件は(ParentId、Id、ParentType、CreatedById)を使用する
- records feedの取得ではParentID =
を使用する - ORDER BY CreateDate DESC, ID DESCで抽出を行う
※直近のデータを抽出