今回はApexを使用してChatter自動投稿機能を実装してみます。
Chatterの自動投稿はフローでもできるのですが、メンション先や投稿文の決定に複雑なロジックを組み込みたい場合は、Apexがベターかと思います。
どんな感じになるのか検証してみます。
ApexでのChatter投稿
ApexでのChatter投稿には[ConnectApi]を使用します。
Salesforceのソーシャル機能やコラボレーション機能にアクセスするためのクラスやメソッドを提供するAPIの一部です。このAPIを使用することで、Salesforce内でのコミュニケーションやコラボレーションに関連する機能をプログラムから利用することができます。
次のコードは商談のフィードにChatter投稿をするコードです。
メンション先としてユーザとグループをIdで指定しています。
public class ChatterPost {
public void executeChatterPost(){
Id SubjectId = '0065h00000MUaqLAAT';
List<Id> mentionIdList = new List<Id>{'0055h000002SNBlAAO', '0F95h000000hSB7CAM'};
ConnectApi.FeedItemInput feedItemInput = new ConnectApi.FeedItemInput();
ConnectApi.MessageBodyInput messageBodyInput = new ConnectApi.MessageBodyInput();
ConnectApi.TextSegmentInput textSegmentInput = new ConnectApi.TextSegmentInput();
messageBodyInput.messageSegments = new List<ConnectApi.MessageSegmentInput>();
// メンション先を指定
for(Id mentionId : mentionIdList){
ConnectApi.MentionSegmentInput mentionSegmentInput = new ConnectApi.MentionSegmentInput();
mentionSegmentInput.id = mentionId;
messageBodyInput.messageSegments.add(mentionSegmentInput);
}
//本文を格納
textSegmentInput.text = '\n' + 'お疲れ様です。'+ '\n' + 'Chatter投稿テストです。';
messageBodyInput.messageSegments.add(textSegmentInput);
feedItemInput.body = messageBodyInput;
feedItemInput.feedElementType = ConnectApi.FeedElementType.FeedItem;
// フィード先
feedItemInput.subjectId = SubjectId;
ConnectApi.FeedElement feedElement = ConnectApi.ChatterFeeds.postFeedElement(Network.getNetworkId(), feedItemInput);
}
}
細かく解説すると、
5行目の[SubjectId]にChatterの投稿先Idを指定します。
- ユーザId → ユーザのフィードに投稿
- ChatterグループId → グループのフィードに投稿
- レコードId → レコードのフィードに投稿

上記コードでは商談に投稿するので商談のレコードIdを設定しています。
6行目の[mentionIdList]にはメンション対象のユーザ、もしくはグループのIdを設定します。
21行目で投稿文を作成します。
[‘\n’]で改行可能です。
ちなみに手動で投稿する場合と同じく、最大投稿可能文字数は10,000文字です。
検証
さきほどのコードを実行してみます。
開発者コンソールの[Anonymous Window]で匿名実行してみます。





[Anonymous Window]での匿名実行は、チョー簡単に言うと作成したApexクラスを試しに実行できる機能です。


指定した商談に対して、指定したユーザとグループをメンション先としChatterが投稿されました。
完成です。
ConnectApi使用時のテストクラスの注意点
さて、ApexによるChatter投稿機能は実装できました。
次はテストクラスを作成する必要がありますね。
ただ、ConnectApiを使用したApexコードのテストクラス作成には注意点が1点あります。
それは
Connect in Apex メソッドには、実際の組織データへのアクセス権が必要であり、@IsTest(SeeAllData=true) のマークが付けられたテストメソッドを使用する必要がある
参考:ConnectApi コードのテスト
ということです。



getFeedElementsFromFeed などの一部の Connect in Apex メソッドは対象外のようです。
ということなので、以下のようにテストメソッド(もしくはテストクラス)の@isTestの後ろに、
実データへのアクセスを許可する(SeeAllData=true) を記述します。
@isTest
private class ChatterPostTest {
@IsTest(SeeAllData=true)
static void doTest() {
}
}
ちなみに、IsTest(SeeAllData=true) アノテーションはデータクエリに適用されますが、レコードの作成または変更 (削除を含む) には適用されません。
アノテーションを使用する場合でも、新規レコードおよび変更されたレコードは Apex テストでロールバックされます。



実データへの影響がないのは安心ですね。
参考:isTest(SeeAllData=True) アノテーションの使用
おわりに
今回は[ConnectApi]を使用してApexでのChatter投稿機能を作ってみました。
ConnectApiそのものはオブジェクト構造など少し複雑な印象を受けました。
Chatter投稿の際はこのフォーマット、というように決まった型で使用していくのもありかもしれませんね。
以上です。


コメント