SharePoint
SharePoint2013
SharePointOnline

JavascriptでSharePointのユーザプロファイルから自分の組織メンバーのPresence取得

やりたいこと

  • SharePointにログインしているユーザ(自分)の所属組織にいるメンバーのPresenceリストを表示する。 (チームサイトとかでメンバー一覧とPresenceだしたいという要望から)
  • なおmasterページはいじらない前提。なのでscript editorのみ利用する

やること

  • SharePointのUserProfileからPeerとManagerをとってきてリスト表示
  • Lync Presenceの取得を参考に、リストの左側にPresenceアイコンを出す

コード

ここではPeerと自分の情報表示について記載します。

snipet
<script type='text/javascript' src="/Style%20Library/JS/jquery.min.js">
</script> //ここにはSharePoint上のjquerypathを記載
<script type='text/javascript'>
function setImnrc(){
var peerList = document.getElementsByClassName("ms-imnSpan");
for(var i =0; i<peerList.length; i++){
 var targetId ="imn_" + i +",type=smtp";
 var temp = document.getElementById(targetId);
 var mail = temp.getAttribute("sip");
 IMNRC(mail,temp);
};
}
    var workEmail = ""; 
    var EmployeeID = "";  
    var Title = "";  
    var userDisplayName = "";  
    var AccountName = "";  
    var peers ={};

    $.ajax({  

        url:  "/_api/SP.UserProfiles.PeopleManager/GetMyProperties",  
        headers: { Accept: "application/json;odata=verbose" },  
        success: function (data) {  
                //Get properties from user profile Json response  
                userDisplayName = data.d.DisplayName;  
                AccountName = data.d.AccountName;
                peers =data.d.Peers.results;

                for (var j =0; j < peers.length; j++){
                 var peerName = peers[j].split("\\");
                 var pres = "<span class='ms-imnSpan'><a class='ms-imnlink ms-spimn-presenceLink' href='#' onclick='IMNImageOnClick(event);return false;'><span class='ms-spimn-presenceWrapper ms-imnImg ms-spimn-imgSize-10x10'><img name='imnmark' title='' class='ms-spimn-img ms-spimn-presence-online-10x10x32' id='imn_"+ j +",type=smtp' alt='presence' src='/_layouts/15/images/spimn.png' sip='" + peerName[1] + "@xxx.com' showofflinepawn='1'></span></a></span>";
                 var inhtml= pres + "<span>"+ peerName[1] + "</span></br>";
                 $('#peers').append(inhtml);
                 inhtml="";
                 peerName ="";
                 pres="";
                 };
                var properties = data.d.UserProfileProperties.results;  
                for (var i = 0; i < properties.length; i++) {  

                    if (properties[i].Key == "WorkEmail") {  
                        workEmail = properties[i].Value; 
                    }  

                    if (properties[i].Key == "EmployeeID") {  
                        EmployeeID = properties[i].Value;
                    }  
                    if (properties[i].Key == "Title") {  
                        Title = properties[i].Value;
                    }  

                }  
                $('#AccountName').text(AccountName);  
                $('#userDisplayName').text(userDisplayName);  
                $('#Title').text(Title);  
                $('#workEmail').text(workEmail);
                setImnrc;
        },  
        error: function (jQxhr, errorCode, errorThrown) {  
            alert(errorThrown);  
        }  
    });  
</script>  

<h2><strong>Employee Details</strong></h2>  
<br />  
AccountName:   <span id="AccountName"></span> </br>
DisplayName:   <span id="userDisplayName"></span> </br>  
Title:    <span id="Title"></span> </br>  
Email Address: <span id="workEmail"></span> </br>
<h2><strong>Peers</strong></h2>
<div id="peers"/>
<br />

もう少し綺麗な書き方がありそうですが。。。
やっているのは、
SP.UserProfiles.PeopleManager/GetMyProperties APIをつかって、自分のPropertyをとってきて、そこに含まれるPeerをリストにして、さらにそのリストをもとに、Lync Presenceをだしている。
peerName[1] + "@xxx.com'のところは、とれるPeer listがDOMAIN\NAME形式だったので、
書き換えたという感じです。
企業によって、組織構造(データ構造)がちょっと違うので、まずはGetMyPropertiesの結果を見てみて、欲しい情報がどこにはいっているかを解析する必要があります。

以上寄せ集め情報からでした。

[9/19追記]
バグっていたので修正しました。
Ref:https://sharepoint.stackexchange.com/questions/157721/lync-presence-indicators-not-working-when-dynamically-added

Reference