JavaScriptを利用して、列に既定値を設定する(3)

前回、ユーザとグループ列に、現在のユーザアカウントを挿入する方法をご紹介しましたが、後から、この方法はちょっと駄目だったことに気がつきました(汗)

サイト右上の「ようこそ○○さん」からユーザ名を取得している訳ですが。このときキーとなる、id の値が、実は、アクセスするユーザーにより「zz7_Menu」だったり「zz8_Menu」だったりと、異なってしまうようです。

それだけであれば、まだスクリプトで工夫の余地があったのですが、そもそも、この方法は、表示上で同姓同名なユーザーが居ると正しく動きません。
うちの会社にも、やはり同姓同名の方がいらっしゃいます。
ADのアカウントなら一意なのですが…。

という訳で、前回と同じ内容を、異なるアプローチで実現してみます。

基本的な手順は前回同様です。NewForm.aspxを編集モードで開き、コンテンツエディタWebパーツを挿入。そこにスクリプトを記述します。

[code]<script type="text/javascript">
_spBodyOnLoadFunctionNames.push( "setDefault" );

function getNodeValue( nodeInst, name )
{
return ( nodeInst.selectSingleNode( name ) != null )
? nodeInst.selectSingleNode( name ).text : ”;
}

function setDefault()
{
var httpInst = window.XMLHttpRequest ? new XMLHttpRequest() : ( function() {
try { return new ActiveXObject( "Msxml2.XMLHTTP" ); }
catch( e ) { return new ActiveXObject( "Microsoft.XMLHTTP" ); }
})();

var AccountFld =”;
var DepFld=”;

//userprofileservice.asmxに空クエリを送信し現在のユーザー情報を取得
httpInst.open( "POST", "http://server/_vti_bin/userprofileservice.asmx", false );
httpInst.setRequestHeader( ‘Content&#45;Type’,’text/xml; charset=utf&#45;8′ );
httpInst.setRequestHeader( ‘SOAPAction’,’http://microsoft.com/webservices/SharePointPortalServer/UserProfileService/GetUserProfileByName’ );
var usrProfile = ‘<?xml version="1.0" encoding="utf&#45;8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema&#45;instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetUserProfileByName xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService"></GetUserProfileByName></soap:Body></soap:Envelope>';
httpInst.onreadystatechange = function()
{
if ( httpInst.readyState == 4 ){
xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
xmlDoc.async = false;
xmlDoc.loadXML( httpInst.responseText );

//XMLから指定したName(プロパティの内部名)の値を取得(AccuntName)して変数AccountFldに出力
rowsProfName = xmlDoc.selectSingleNode( "/soap:Envelope/soap:Body/GetUserProfileByNameResponse/GetUserProfileByNameResult/PropertyData[Name = ‘AccountName’]");
AccountFld = getNodeValue( rowsProfName, "Values/ValueData/Value" );

//XMLから指定したName(プロパティの内部名)の値を取得(Department)して変数DepFldに出力
rowsProfDepFld = xmlDoc.selectSingleNode( "/soap:Envelope/soap:Body/GetUserProfileByNameResponse/GetUserProfileByNameResult/PropertyData[Name = ‘Department’]");
DepFld = getNodeValue( rowsProfDepFld, "Values/ValueData/Value" );

}
}
httpInst.send( usrProfile );

//列に変数AccountFldの値を入力
document.getElementById( "ctl00_m_g_9d58ea13_8111_4bd6_aa0d_c2905fded564_ctl00_ctl04_ctl02_ctl00_ctl00_ctl04_ctl00_ctl00_UserField_upLevelDiv" ).innerText = AccountFld;

}
</script>[/code]

仕組みとしては、まず、標準WebサービスであるUserProfileServiceのGetUserProfileByNameメソッドに、空のクエリを送信します。
GetUserProfileByNameの仕様で、空クエリには、現在のユーザーの情報が返されます。
この情報には、ユーザープロファイルにある全プロパティが含まれていますので、そこから、特定のプロパティを内部名を指定して取得し、列に値として挿入します。

Webサービスのアドレスと、列の id はお手元の環境に応じて修正して下さい。
id はページのHTMLソースから拾いますが、この時、列名直後の input タグではなく、そのかなり後にある div タグの id を取得して下さい。末尾が「_UserField_upLevelDiv」の id です。

この方法のメリットは、ユーザープロファイルに存在するプロパティであれば、全て取得することが出来る点です。
デフォルトのプロパティは、こちらのエントリでご確認下さい
なお、独自プロパティを設定している場合、内部名さえ正確でれあれば、その値も拾うことが出来ます。

JavaScriptを利用して、列に既定値を設定する(1)
JavaScriptを利用して、列に既定値を設定する(2)
Infopath 2003 + SharePoint でコードを使わず現在のユーザ情報を表示する


Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9