SharePoint で JavaScript オブジェクト モデルを使用して投稿の作成と削除、およびソーシャル フィードの取得を行うHow to: Create and delete posts and retrieve the social feed by using the JavaScript object model in SharePoint

SharePoint JavaScript オブジェクト モデルを使用して、ミニブログの投稿を作成および削除する方法と、ソーシャル フィードを取得する方法について説明します。Learn how to create and delete microblog posts and retrieve social feeds by using the SharePoint JavaScript object model.

SharePoint のソーシャル フィードとはWhat are social feeds in SharePoint?

SharePoint の場合、ソーシャル フィードは、会話、1 つのマイクロブログの投稿、または通知のコレクションを表します。In SharePoint, a social feed is a collection of threads that represent conversations, single microblog posts, or notifications. スレッドには、最初の投稿と返信投稿のコレクションが含まれています。Threads contain a root post and a collection of reply posts. JavaScript オブジェクト モデルでは、フィードが SocialFeed オブジェクトで表され、スレッドが SocialThread オブジェクトで表され、投稿と返信が SocialPost オブジェクトで表されます。In the JavaScript object model, feeds are represented by SocialFeed objects, threads are represented by SocialThread objects, and post and replies are represented by SocialPost objects. フィード関連のコア タスクを実行するには、SocialFeedManager オブジェクトを使用します。To perform core feed-related tasks, you use the SocialFeedManager object. この記事では、JavaScript オブジェクト モデルを使用してソーシャル フィードを操作するアプリケーション ページの作成方法について説明します。In this article, we'll show you how to create an application page that uses the JavaScript object model to work with social feeds.

SocialFeedManager の操作や、他の API を使用したソーシャル フィードの操作の詳細については、「 SharePoint でのソーシャル フィードの操作」を参照してください。For more information about working with SocialFeedManager or for information about using other APIs to work with social feeds, see Work with social feeds in SharePoint.

SharePoint JavaScript オブジェクト モデルでソーシャル フィードを操作する開発環境をセットアップするための前提条件Prerequisites for setting up your development environment to work with social feeds in the SharePoint JavaScript object model

JavaScript オブジェクト モデルを使用してソーシャル フィードを操作するアプリケーション ページを作成するには、次のものが必要になります。To create an application page that uses the JavaScript object model to work with social feeds, you'll need:

  • 個人用サイトが公開するように構成済みで、現在のユーザー用の個人サイトとターゲット ユーザー用の個人サイトを作成済みであり、ターゲット ユーザーを現在のユーザーがフォローしていて、ターゲット ユーザーによる投稿がいくつかある SharePointSharePoint with My Site configured as public, with personal sites created for the current user and a target user, with the current user following the target user, and with a few posts written by the target user

  • Office Developer Tools for Visual Studio 2013 を持つ Visual Studio 2012 または Visual Studio 2013Visual Studio 2012 or Visual Studio 2013 with Office Developer Tools for Visual Studio 2013

  • ログオン ユーザーに対する User Profile Service アプリケーションへの フル コントロールのアクセス許可とファーム ソリューションを展開するためのアクセス許可Full Control access permissions to the User Profile service application and permissions to deploy a farm solution for the logged-on user

  • 個人用サイト Web アプリケーションのコンテンツ データベースにアクセスするためのアプリケーション プール アカウントに対する十分な権限Sufficient permissions for the application pool account to access the content database of the My Sites web application

SharePoint JavaScript オブジェクト モデルを使用した、ソーシャル フィードを操作するアプリケーション ページの作成Create an application page that works with social feeds by using the SharePoint JavaScript object model

  1. Visual Studio を開き、[ ファイル]、[ [新規]、[ プロジェクト] を選択します。Open Visual Studio and choose File, New, Project.

  2. [ 新しいプロジェクト] ダイアログ ボックスの上部にあるドロップダウン リストから [ .NET Framework 4.5] を選択します。In the New Project dialog box, choose .NET Framework 4.5 from the drop-down list at the top of the dialog box.

  3. [ テンプレート] リストの [ Office SharePoint] を展開し、[ SharePoint ソリューション] カテゴリを選択して、[ SharePoint Project] テンプレートを選択します。In the Templates list, expand Office SharePoint, choose the SharePoint Solutions category, and then choose the SharePoint Project template.

  4. プロジェクト名に 「SocialFeedJSOM」という名前を付け、[ OK] をクリックします。Name the project SocialFeedJSOM, and then choose the OK button.

  5. [ SharePoint カスタマイズ ウィザード] ダイアログ ボックスで、[ ファーム ソリューションとして配置する] を選択して、[ 完了] をクリックします。In the SharePoint Customization Wizard dialog box, choose Deploy as a farm solution, and then choose the Finish button.

  6. Solution Explorer で、SocialFeedJSOM プロジェクトのショートカット メニューを開き、SharePoint のマップされた "Layouts" フォルダーを追加します。In Solution Explorer, open the shortcut menu for the SocialFeedJSOM project, and then add a SharePoint "Layouts" mapped folder.

  7. レイアウト フォルダーで、SocialFeedJSOM フォルダーのショートカット メニューを開いて、SocialFeed.aspx という名前の新しい SharePoint アプリケーション ページを追加します。In the Layouts folder, open the shortcut menu for theSocialFeedJSOM folder, and then add a new SharePoint application page namedSocialFeed.aspx.

    注: この記事のコード例では、ページ マークアップにカスタム コードを定義していますが、Visual Studio によって作成されるページの分離コードは使用しません。Note: The code examples in this article define custom code in the page markup but do not use the code-behind class that Visual Studio creates for the page.

  8. SocialFeed.aspx ページのショートカット メニューを開いて、[スタートアップ アイテムとして設定] を選択します。Open the shortcut menu for the SocialFeed.aspx page, and then choose Set as Startup Item.

  9. SocialFeed.aspx ページのマーク アップで、次のコードに示すように、"Main" の asp:Content タグの内側でコントロールを定義します。In the markup for the SocialFeed.aspx page, define controls inside the "Main" asp:Content tags, as shown in the following code.

<table width="100%" id="tblPosts"></table><br/>
<button id="btnDelete" type="button"></button><br />
<span id="spanMessage" style="color: #FF0000;"></span>

注: これらのコントロールは、すべてのシナリオで使用されるわけではありません。Note: These controls may not be used in every scenario. たとえば、"投稿と返信の公開" シナリオは、span コントロールのみを使用します。For example, the "Publish posts and replies" scenario only uses the span control.

  1. 次のコードに示されているように、 span の終了タグの後に SharePoint:ScriptLink コントロール、 SharePoint:FormDigest コントロール、および script タグを追加します。 SharePoint:ScriptLink タグは、JavaScript オブジェクト モデルを定義するクラスを参照します。このモデルは 個人用サイト ソーシャル 開発に使用できます。 SharePoint:FormDigest タグは、サーバーのコンテンツを更新する操作によってセキュリティの検証が必要とされたときに、メッセージ ダイジェストを生成します。After the closing span tag, add SharePoint:ScriptLink controls, a SharePoint:FormDigest control, and script tags, as shown in the following code. The SharePoint:ScriptLink tags reference the class library files that define the JavaScript object model that you can use for My Site Social development. The SharePoint:FormDigest tag generates a message digest for security validation when required by operations that update server content.
<SharePoint:ScriptLink ID="ScriptLink1" name="SP.js" runat="server" ondemand="false" localizable="false" loadafterui="true" />
<SharePoint:ScriptLink ID="ScriptLink2" name="SP.UserProfiles.js" runat="server" ondemand="false" localizable="false" loadafterui="true" />
<SharePoint:FormDigest id="FormDigest" runat="server"/>
<script type="text/javascript">
    // Replace this comment with the code for your scenario.
</script>
  1. フィードとやり取りするロジックを追加するには、 script タグで囲まれたコメントの内容を、次のいずれかのシナリオのコード例で置き換えます。To add the logic to work with feeds, replace the comment between the script tags with the code example from one of the following scenarios:

  2. アプリケーション ページをテストするには、[ デバッグ] メニューの [ デバッグ開始] をクリックします。web.config ファイルの変更を確認するメッセージが表示されたら、[ OK] をクリックします。To test the application page, on the menu bar, choose Debug, Start Debugging. If you are prompted to modify the web.config file, choose the OK button.

    応答が失敗のコールバック メソッドを呼び出す場合、メソッドにブレークポイントを設定し、 args オブジェクトにウォッチを追加するか、詳細について ULS ログおよびイベント ビューアーを確認します。If the response calls the failure callback method, set a breakpoint in the method and add a watch on the args object or check the ULS logs and the event viewer for more information.

コード例: SharePoint JavaScript オブジェクト モデルを使用した、ソーシャル フィードへの投稿と返信の公開Code example: Publish posts and replies to the social feed by using the SharePoint JavaScript object model

次のコードは、投稿と返信を公開する例です。以下の操作方法が記述されています。The following code example publishes a post and a reply. It shows how to:

  • 投稿内容を定義する。この例では、投稿にリンクが含まれています。Define post content. This example includes a link in the post.

  • createPost メソッドを使用し、 nulltargetId パラメーターとして渡すことで、現在のユーザーのフィードに投稿を公開する。Publish a post to the current user's feed by using the createPost method and passing null as the targetId parameter.

  • createPost メソッドを使用して、targetId パラメーターとしてスレッド ID を渡すことで投稿に返信する。Reply to a post by using the createPost method and passing the thread identifier as the targetId parameter.

注意

アプリケーション ページの作成」の手順で追加した script タグの間に次のコードを貼り付けます。Paste the following code between the script tags that you added in the Create the application page procedure.

// Ensure that the SP.UserProfiles.js file is loaded before the custom code runs.
SP.SOD.executeOrDelayUntilScriptLoaded(PublishPost, 'SP.UserProfiles.js');

// Declare global variables.
var clientContext;
var feedManager;
var resultThread;

function PublishPost() {

    // Initialize the current client context and the SocialFeedManager instance.
    clientContext = SP.ClientContext.get_current();
    feedManager = new SP.Social.SocialFeedManager(clientContext);

    // Create a link to include in the post.
    var linkDataItem = new SP.Social.SocialDataItem();
    linkDataItem.set_itemType(SP.Social.SocialDataItemType.link);
    linkDataItem.set_text('link');
    linkDataItem.set_uri('http://bing.com');
    var socialDataItems = [ linkDataItem ];

    // Create the post content.
    var postCreationData = new SP.Social.SocialPostCreationData();
    postCreationData.set_contentText('The text for the post, which contains a {0}.');
    postCreationData.set_contentItems(socialDataItems);

    // Publish the post. Pass null for the "targetId" parameter because this is a root post.
    resultThread = feedManager.createPost(null, postCreationData);
    clientContext.executeQueryAsync(PublishReply, PostFailed);
    }
function PublishReply(sender, args) {

    // Create the reply content.
    var postCreationData = new SP.Social.SocialPostCreationData();
    postCreationData.set_contentText('The text for the reply.');

    // Publish the reply.
    resultThread = feedManager.createPost(resultThread.get_id(), postCreationData);
    clientContext.executeQueryAsync(PostSucceeded, PostFailed);
}
function PostSucceeded(sender, args) {
    $get("spanMessage").innerText = 'The post and reply were published.';
}
function PostFailed(sender, args) {
    $get("spanMessage").innerText = 'Request failed: ' + args.get_message();
}

コード例: JavaScript オブジェクト モデルを使用してソーシャル フィードを取得するCode example: Retrieve social feeds by using the SharePoint JavaScript object model

次のコード例では、現在のユーザーとターゲット ユーザーのフィードを取得します。以下の操作方法が記述されています。The following code example retrieves feeds for the current user and a target user. It shows how to:

  • getFeed メソッドを使用して、現在のユーザーの PersonalNews、および Timeline のフィード タイプを取得する。Get the Personal, News, and Timeline feed types for the current user by using the getFeed method.

  • getFeedFor メソッドを使用して、ターゲット ユーザーの Personal フィード タイプを取得する。Get the Personal feed type for a target user by using the getFeedFor method.

  • フィードを反復処理して非参照スレッドをすべて検出し、それらのスレッドと投稿に関する情報を取得する。参照スレッドは、別のスレッドに関する情報を含む通知を表します。たとえば、誰かに関するユーザーのメンションが投稿内にあると、元の投稿へのリンクと投稿についての他のメタデータを含む MentionReference 型のスレッドがサーバーによって生成されます。Iterate through the feeds to find all non-reference threads and to get information about threads and posts. Reference threads represent notifications that contain information about another thread. For example, if a user mentions someone in a post, the server generates a MentionReference-type thread that contains the link to the original post and other metadata about the post.

フィード タイプの詳細については、「個人用サイト ソーシャル API のフィード タイプの概要」を参照してください。For more information about feed types, see Overview of feed types in the My Site Social API. 参照スレッドの詳細については、「SharePoint ソーシャル フィードでの参照スレッドおよびダイジェスト スレッド」を参照してください。For more information about reference threads, see Reference threads and digest threads in SharePoint social feeds.

注意

アプリケーション ページの作成」の手順で追加した script タグの間に次のコードを貼り付けます。Paste the following code between the script tags that you added in the Create the application page procedure. その後で、targetUser 変数のプレースホルダーの値を変更してからコードを実行します。Then, change the placeholder value for the targetUser variable before you run the code.

// Replace the placeholder value with the account name of the target user.
var targetUser = 'domainName\\\\userName';

// Ensure that the SP.UserProfiles.js file is loaded before the custom code runs.
SP.SOD.executeOrDelayUntilScriptLoaded(GetFeeds, 'SP.UserProfiles.js');

// Declare global variables.
var clientContext;
var feedManager;
var personalFeed;
var newsFeed;
var timelineFeed;
var targetUserFeed;

function GetFeeds() {

    // Initialize the current client context and the SocialFeedManager instance.
    clientContext = SP.ClientContext.get_current();
    feedManager = new SP.Social.SocialFeedManager(clientContext);

    // Set parameters for the feed content that you want to retrieve.
    var feedOptions = new SP.Social.SocialFeedOptions();
    feedOptions.set_maxThreadCount(10); // default is 20

    // Get all feed types for current user and get the Personal feed
    // for the target user.
    personalFeed = feedManager.getFeed(SP.Social.SocialFeedType.personal, feedOptions);
    newsFeed = feedManager.getFeed(SP.Social.SocialFeedType.news, feedOptions);
    targetUserFeed = feedManager.getFeedFor(targetUser, feedOptions);

    // Change the sort order to optimize the Timeline feed results.
    feedOptions.set_sortOrder(SP.Social.SocialFeedSortOrder.byCreatedTime); 
    timelineFeed = feedManager.getFeed(SP.Social.SocialFeedType.timeline, feedOptions);

    clientContext.load(feedManager);
    clientContext.executeQueryAsync(CallIterateFunctionForFeeds, RequestFailed);
}
function CallIterateFunctionForFeeds() {
    IterateThroughFeed(personalFeed, "Personal", true);
    IterateThroughFeed(newsFeed, "News", true);
    IterateThroughFeed(timelineFeed, "Timeline", true); 
    IterateThroughFeed(targetUserFeed, "Personal", false);
}
function IterateThroughFeed(feed, feedType, isCurrentUser) {
    tblPosts.insertRow().insertCell();
    var feedHeaderRow = tblPosts.insertRow();
    var feedOwner = feedManager.get_owner().get_name();

    // Iterate through the array of threads in the feed.
    var threads = feed.get_threads();
    for (var i = 0; i < threads.length ; i++) {
        var thread = threads[i];
        var actors = thread.get_actors();

        if (i == 0) {

            // Get the name of the target user for the feed header row. Users are 
            // owners of all threads in their Personal feed.
            if (!isCurrentUser) {
                feedOwner = actors[thread.get_ownerIndex()].get_name();
            }
            feedHeaderRow.insertCell().innerText = feedType.toUpperCase() + ' FEED FOR '
                + feedOwner.toUpperCase();
        }

        // Use only Normal-type threads and ignore reference-type threads. (SocialThreadType.Normal = 0)
        if (thread.get_threadType() == 0) {

            // Get the root post's author, content, and number of replies.
            var post = thread.get_rootPost();
            var authorName = actors[post.get_authorIndex()].get_name();
            var postContent = post.get_text();
            var totalReplies = thread.get_totalReplyCount();

            var postRow = tblPosts.insertRow();
            postRow.insertCell().innerText = authorName + ' posted \\"' + postContent
                + '\\" (' + totalReplies + ' replies)';

            // If there are any replies, iterate through the array and
            // get the author and content. 
            // If a thread contains more than two replies, the server
            // returns a thread digest that contains only the two most
            // recent replies. To get all replies, call the 
            // SocialFeedManager.getFullThread method.
            if (totalReplies > 0) {
                var replies = thread.get_replies();

                for (var j = 0; j < replies.length; j++) {
                    var replyRow = tblPosts.insertRow();

                    var reply = replies[j];
                    replyRow.insertCell().innerText = '  - ' + actors[reply.get_authorIndex()].get_name()
                        + ' replied \\"' + reply.get_text() + '\\"';
                }
            }
        }
    }
}
function RequestFailed(sender, args) {
    $get("spanMessage").innerText = 'Request failed: ' + args.get_message();
}

コード例: JavaScript オブジェクト モデルを使用してソーシャル フィードから投稿と返信を削除するCode example: Delete posts and replies from the social feed by using the SharePoint JavaScript object model

次のコード例では、投稿または返信を削除します。以下の操作方法が記述されています。The following code example deletes a post or a reply. It shows how to:

  • getFeed メソッドを使用して、現在のユーザーの News フィード タイプを取得する。Get the News feed type for the current user by using the getFeed method.

  • フィード内で投稿と返信を繰り返し処理して、投稿または返信を削除するために使用する id プロパティを取得する。Iterate through the posts and replies in the feed to get the id property that you use to delete the post or reply.

  • deletePost メソッドを使用して、最初の投稿または返信を削除する (最初の投稿を削除すると、スレッド全体が削除されます)。Delete a root post or reply by using the deletePost method (deleting a root post deletes the whole thread).

注意

アプリケーション ページの作成」の手順で追加した script タグの間に次のコードを貼り付けます。Paste the following code between the script tags that you added in the Create the application page procedure. この例は、現在のユーザーのニュースフィードに少なくとも 1 つの投稿があることを前提としています。This example assumes that the current user's newsfeed contains at least one post.

// Ensure that the SP.UserProfiles.js file is loaded before the custom code runs.
SP.SOD.executeOrDelayUntilScriptLoaded(GetFeeds, 'SP.UserProfiles.js');

// Declare global variables.
var clientContext;
var feedManager;
var feed;
var postOrReplyToDelete;

function GetFeeds() {

    // Initialize the current client context and the SocialFeedManager instance.
    clientContext = SP.ClientContext.get_current();
    feedManager = new SP.Social.SocialFeedManager(clientContext);

    // Set parameters for the feed content that you want to retrieve.
    var feedOptions = new SP.Social.SocialFeedOptions();
    feedOptions.set_maxThreadCount(10); // default is 20

    // Get all the News feed type for current user.
    feed = feedManager.getFeed(SP.Social.SocialFeedType.news, feedOptions);
    clientContext.executeQueryAsync(IterateThroughFeed, RequestFailed);
}
function IterateThroughFeed() {

    // Iterate through the array of threads in the feed.
    var threads = feed.get_threads();
    for (var i = 0; i < threads.length ; i++) {
        var thread = threads[i];
        var actors = thread.get_actors();

        // Get the root post's author, content, and number of replies.
        var post = thread.get_rootPost();

        var authorName = actors[post.get_authorIndex()].get_name();
        var postContent = post.get_text();
        var totalReplies = thread.get_totalReplyCount();

        var postRow = tblPosts.insertRow();
        postRow.insertCell().innerText = authorName + ' posted \\"' + postContent
            + '\\" (' + totalReplies + ' replies)';
        postOrReplyToDelete = post.get_id();

        // If there are any replies, iterate through the array and
        // get the author and content.
            // If a thread contains more than two replies, the server
            // returns a thread digest that contains only the two most
            // recent replies. To get all replies, call the 
            // SocialFeedManager.getFullThread method.
        if (totalReplies > 0) {
            var replies = thread.get_replies();
            for (var j = 0; j < replies.length; j++) {
                var replyRow = tblPosts.insertRow();

                var reply = replies[j];
                replyRow.insertCell().innerText = '  - ' + actors[reply.get_authorIndex()].get_name()
                    + ' replied \\"' + reply.get_text() + '\\"';
                postOrReplyToDelete = reply.get_id();
            }
        }

        // Initialize button properties.
        $get("btnDelete").onclick = function () { DeletePostOrReply(); };
        $get("btnDelete").innerText = 'Click to delete the last post or reply';
    }
}

// Delete the last post or reply listed on the page.
function DeletePostOrReply() {
    feedManager.deletePost(postOrReplyToDelete);
    clientContext.executeQueryAsync(DeleteSucceeded, RequestFailed);
}
function DeleteSucceeded(sender, args) {
    $get("spanMessage").innerText = 'The post or reply was deleted. Refresh the page to see your changes.';
}
function RequestFailed(sender, args) {
    $get("spanMessage").innerText = 'Request failed: ' + args.get_message();
}

関連項目See also