blog
ブログ

意外と便利!Chatterの投票で、誰が投票したかをApexで取得してみる

Chatter投票

こんにちは!

Chatterの投票機能ってご存知でしょうか? 投票 | Salesforce この機能では、 Chatter上で、質問選択肢を設けて、それを見たユーザから投票を受け付けることができます。

chatter投票機能イメージ

ただし、上記のへルプにもある通り、 標準のインターフェースからは、 『誰がどの選択肢に投票したのか?』という部分については確認できないようになっています。 そこで今回は、 Apexで、投票機能に関連するオブジェクトから誰がどの選択肢に投票しているか確認してみたいと思います。

・投票機能に関連するオブジェクトを確認する。

投票機能に関連しているオブジェクトは、下記の4オブジェクトになります。 項目についても、参考程度に併せて記載しました。

Chatter投票機能データモデル図

FeedItem には投稿のデータ、 FeedPollChoice には選択肢のデータ、 FeedPollVote には投票のデータ、がそれぞれ格納されています。

・各オブジェクトからレコードを取得する。

まずは、投稿。 投票機能を使用している投稿のみにするため、WHERE句にType=’PollPost’を追加します。

List<FeedItem> FeedItemList = 
    [SELECT Body FROM FeedItem WHERE Type = 'PollPost'];

次に、取得した投稿に関連する選択肢。 Positionに順番を持っているので、ついでにソート。

List<FeedPollChoice> FeedPollChoiceList = 
    [SELECT Id,FeedItemId,ChoiceBody FROM FeedPollChoice WHERE FeedItemId IN :FeedItemList ORDER BY Position];

そして、投稿と選択肢に紐付く投票。 作成者がイコール投票者なので、作成者の名前を取得します。

List<FeedPollVote> FeedPollVoteList = 
    ['SELECT CreatedBy.Name FROM FeedPollVote WHERE FeedItemId IN :FeedItemList AND ChoiceId IN :FeedPollChoiceList];

・実際に動かして確認してみる。

さらっと同様のSOQLを開発者コンソールから実行して、デバッグログで確認してみましょう。

for (FeedItem feed : [SELECT Body FROM FeedItem WHERE Type = 'PollPost']) {
    System.debug('**********');
    System.debug('■アンケート:'+feed.Body);

    for (FeedPollChoice choice : [SELECT Position,ChoiceBody FROM FeedPollChoice WHERE FeedItemId = :feed.Id ORDER BY Position]) {
        System.debug('□選択肢'+choice.Position+':'+choice.ChoiceBody);

        for (FeedPollVote vote : [SELECT CreatedBy.Name FROM FeedPollVote WHERE FeedItemId = :feed.Id AND ChoiceId = :choice.Id]) {
            System.debug(' '+vote.CreatedBy.Name+'さんが投票したよ。');
        }
    }
}

1つアンケートを作って、上のコードを匿名実行すると…

好きな餌のアンケート
キャベツ優勢のアンケート結果

上手く取れました。 権限をお持ちの方はコピペで試してみて下さい! 最後に、余談ですが、IdeaExchangeにも似たようなアイデアが挙がっています。 Summary report of Chatter questionnaire – Chatterアンケートの集計レポートの実装 標準レポートタイプで用意されていると、確かに便利ですねー。

contact

ご相談・ご質問等ございましたら、お気軽にお問い合わせください。

翻訳

SFA/CRMに蓄積されている情報を活用する方法ガイド