[salesforce][chatter]Chatter Cheat Sheetについて

By |10月 19, 2011|chatter, salesforce, |2 comments


Chatter Cheat Sheetを一通り検証し日本語に翻訳をしました。
※翻訳に誤ってる箇所がありましたらコメントにて指摘を頂けると助かります。
「Chatterで使用している標準オブジェクト」と一緒にご覧ください。


Chatter Data Model
Chatterで使用する主なモデルは下記となります。
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

FeedItem fItem = new FeedItem();
fItem.Type = 'TextPost';
fItem.ParentId = <Id of User or Record>;
fItem.Body = 'The mice will see you now';
insert fItem;

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

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
    ];

Record Detail Page Query

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
    ];

この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

List <NewsFeed> aNewsFeed = [
    SELECT Id, Type, CreatedBy.Name, Parent.Name, Body
    FROM NewsFeed
    ORDER BY CreatedDate DESC, Id DESC LIMIT 20
    ];


下記の例は使用中のChatterタブに表示されているフィードから省略したデータを戻します。
CreatedBy.Nameはフィードを作成したユーザを表示するため指定します。
Parent.Nameは使用ユーザ名またはフォローしているアイテム名が設定されます。
また対象フィードのTypeがTrackedChangeでない限り、nullとなる事はありません。

Chatter Tab Query

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 
    ]; 


UserProfileFeed

このオブジェクトは自分の投稿、プロフィールの変更情報および@を使用したダイレクトメッセージ情報が格納されています。
またこのフィード情報はSalesforce Chatterアプリケーションのプロファイルタブに表示されています。
UserProfileFeedのフィード情報では作成ユーザの情報を閲覧する事も可能です。

注意:UserProfileFeedを参照する場合、条件にUserIDが必須となります。

UserProfileFeed Feed Items indicating Posts a User has Made

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
    ];

このクエリでは指定したユーザに関連する直近10件の投稿情報を戻しています。
WITHを使用してどのユーザのプロファイル情報を取得するか指定します。
上記の例でWHERE句を省略した場合はType=trackedchangesを含んだレコードが戻ります。
ParentIdには更新したオブジェクトのIDがセットされています。

Profile Tab Query

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
];

このクエリではプロファイルタブの表示データを取得しています。
フィードに対して、コメントや「いいね」が紐付いてる場合には、1レコードに対して複数のリスト型のデータが戻ってきます。
またフィードのTypeがtrackedchangesの場合には、FeedTrackedChangeオブジェクトに関連するデータが格納され、プロファイル情報の更新ごとのレコードが作成されています。
なので、プロファイルを変更するユーザはFeedTrackedChangeオブジェクトを更新する権限が必要となります。


FeedTrackedChange

各フィードの変更情報が格納されています。このオブジェクトを参照する場合にはUserProfileFeed、NewsFeed、record feedを通じて行ってください。

Tracked Changes to a Record

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
];

上記の例は商談オブジェクトの変更情報を抽出しています。


FeedComment

このオブジェクトにはコメント情報が格納されています。
コメントは各フィードの子オブジェクトとなっており、UserProfileFeedやNewsFeedと紐付けての取得のみ可能となっています。

また投稿データのIDはユーザの変更により変わる可能性があるため、ParentIDを使用してどのオブジェクトに紐付いてるか確認することができます。

Create a Comment

FeedComment fcomment = new FeedComment();
fcomment.FeedItemId = <feedItemId>;
fcomment.CommentBody = 'This is a profound comment.';
insert fcomment;

上記の例を行うには、コメントを付加するFeedのItemIDが必要となります。


EntitySubscription

このオブジェクトでは、ユーザ/データのフォロー/フォロワーの関係が格納されています。

Followers of a User or Record

ID uid = <Id of User or Record>;
List<EntitySubscription> followers = [
    SELECT Id, SubscriberId, Subscriber.Name
    FROM EntitySubscription WHERE ParentId = :uid
    ];

List the Users and Records I Follow

ID uid = <Id of User>;
EntitySubscription[] followingES = [
    SELECT Id, ParentId, SubscriberId, Parent.Name
    FROM EntitySubscription WHERE SubscriberId = :uid
    ];

WHERE句にParent.Type=’User’を付加することでユーザのみ表示することが可能です。

List Subscriptions to Records

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)
    ];

上記の例は、従業員が10人以上取引先企業でフォローしているデータが取得できます。


CollaborationGroup

このオブジェクトにはChatterのグループ情報が格納されています。

CollaborationGroupにはCollaborationGroupFeedと呼ばれるGroup内のフィード情報を格納したデータを持っており、グループに所属するフィードを取得する際に使用します。

List Groups

List<CollaborationGroup> oG = [SELECT Name, Description,
CollaborationType, OwnerId from CollaborationGroup];

上記の例では、組織内全てのChatterグループを取得しています。CollaborationTypeにはPublicかPrivateのいずれかが設定されています。

List a Group’s Feed

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
    ];

グループの名前や説明を変更した際には、変更情報が表示されます。
上記の例ではグループのフィード・変更情報および付随するコメントを取得しています。


CollaborationGroupMember

このオブジェクトにはChatterグループのメンバー情報が格納されています。

List Members of a Group

ID cg = <Id of a Chatter group>;
List<CollaborationGroupMember> oM = [
    SELECT MemberId, CollaborationGroup.Name
    FROM CollaborationGroupMember WHERE CollaborationGroupId = :cg
    ];

上記の例では、指定したグループのメンバーIDと名称を取得します。

Add a User to a Group

ID uid = <Id of a user>;
ID cgid = <Id of a group>;
CollaborationGroupMember cgm = new CollaborationGroupMember(
memberid = uid, collaborationgroupid = cgid);
insert cgm;


CollaborationGroupMemberRequest

このオブジェクトでは、非公開グループにおけるユーザの申請情報が格納されています。
また自分が管理者となっているグループにおいては、承認・却下の操作も可能です。
create()を使用することで、グループの管理者に対して申請メールを送る事ができます。
グループの管理者による承認・却下を行った際に、申請者にメールで通知されます。
また却下の場合は理由を通知する事が可能です。


CurrentStatus

ユーザがChatterで投稿を行った際には、UserオブジェクトのCurrentStatusが更新されます。
またUserProfileFeedにおいても更新が行われます。

Update a User’s Status

ID uid = <Id of User>;
User user = [SELECT Id, CurrentStatus FROM User WHERE Id = :uid];
user.CurrentStatus = 'new and exciting status message';
update u;

上記の例ではユーザ投稿の更新を行います。
注意:ユーザ投稿を削除した場合、CurrentStatusの値はクリアされません。


Chatter Triggers

FeedItem、FeedCommentではApexTriggerを作成する事ができます。
record feedにおいては作成できませんが、ユーザの行動のrecord feedにおいては作成可能です。
Triggerは追加・削除のみ対応しています。FeedItemのTypeがTextPost,LinkPost,ContentPostの追加時に行うことができます。
ユーザのステータス情報更新ではTriggerは動作しません。

Apex CodeではChatterコンテキスト内の処理のみ追記可能です。

トリガーを使用して非公開グループに対して投稿を行う際には、グループに所属しているメンバーでなければなりません。
グループに所属していないメンバーの場合は、CreatedByIdにメンバーのIDがセットされFeedItemが作成されます。

下記の例では、誰かが投稿を行った時に動作するTriggerです。
例えば特定の文字に基づいて処理を実施することもできます。
(例:商談がクローズとなった場合に処理を行う。)

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
        }
    }
}


Writing Efficient Chatter Triggers

  • 組織内のトリガーはすべて把握しておく
  • isEmptyを使用して、ロジックの制限を行う
  • トリガー処理の共通化
    ※殆どのトリガーはFeedItemまたはFeedCommentで起動
  • UserStatusはUser上にある事に注意する
  • FeedItemは絞り込んで処理を行う。
    ※トリガーでのフィードTypeの種類は、TextPost, LinkPost, ContentPost
    ※トリガーで、オブジェクトのTypeを識別するのは下記の形式を使用する
  • .sObjectType.getDescribe().getKeyPrefix();


ContentDocumentLink

ContentDocumentLinkではSalesForceCRMやChatterにアップされたファイルが、Chatterで共有された情報が格納されます。
ファイルは他のユーザ、Chatterグループ、SalesForceCRMと共有する事ができます。
例えばChatterでアップロードを行ったファイルのタイトル、説明を検索する事ができます。

SELECT ContentDocument.LatestPublishedVersion.Title,
    ContentDocument.LatestPublishedVersion.Description
    FROM ContentDocumentLink
    WHERE LinkedEntityid = '<entity-id>'


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で抽出を行う
    ※直近のデータを抽出


2 thoughts on “[salesforce][chatter]Chatter Cheat Sheetについて

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です