MSDN フォーラムに同タイトルの質問がありました。手軽に実装できないかと考えていたところふと、SharePoint Designer 2007でJavaScript を用いてコーディングできないかと思い、試してみました。なんとかなりそうです。MSDN フォーラムには返信していますが、こちらのブログにもエントリをポストしておこうと思います。
検証環境ではカスタムリストを作成し、そのNewForm.aspx を編集しました。
まず、JavaScript を用いて「ユーザーまたはグループフィールド」のオブジェクトをどうやって取得するかがポイントです。他の列の種類とは異なり、「ユーザーまたはグループフィールド」列のオブジェクトの取得はコツが必要です。なぜかというと、他のフィールドは "input" タグなどが生成されるのですが、これは 複雑なテーブル内に含まれるDivタグが生成されるからです。このあたりは IE Developer Toolbar を活用して調査しました。IE Developer Toolbar は IE 6.0 以降にインストールできる無償のアドインです。これを使うと、画面上に表示されるテーブルやセル構造、CSS などを GUI で確認できます。ツールは次のURLからダウンロードできます。
次のようにコードを記述しました。
- 1. NewForms.aspx のContentPlaceHolderId属性が"PlaceHolderMain"となっているコンテンツ コントロール("asp:Content "で始まるタグ) を見つけます。
- 1のコンテンツ コントロール タグの直後に以下のスクリプトコードを追加します。
<script type="text/jscript">
_spBodyOnLoadFunctionNames.push("getUserName");
function getUserName()
{
'「ユーザーとグループ フィールド」のオブジェクトを取得
var nameTags=document.getElementById("ctl00_m_g_3405cb6d_6769_4048_a928_
ec0098015995_ctl00_ctl04_ctl01_ctl00_ctl00_ctl04_
ctl00_ctl00_UserField_upLevelDiv");
'既定値を指定
nameTags.innerText="<loginUserName>";
}
</script> - "ctl00_m_g_3405cb6d_6769_4048_a928_ec0098015995_ctl00_ctl04_
ctl01_ctl00_ctl00_ctl04_ctl00_ctl00_UserField_upLevelDiv"の部分はご自身の環境に合わせて変更してください。この id は NewForm.aspx をブラウザ表示してソースを確認してください。「ユーザーまたはグループフィールド」はソース内では "Divタグ" になっています。この Div タグの id を取得して設定してください。とはいえ、ソースの確認は大変ですから、IE Developer Toolbar を使用して探すのが一番です。
残る課題はユーザーのログイン名の取得ですが、とりあえずてっとり早く実装したかったので「ようこそ○○さん」の表示部分から取得してみました。完成版のコードは以下の通りです。
<script type="text/jscript">
_spBodyOnLoadFunctionNames.push("getUserName");
function getUserName()
{
'「ようこそ」の部分からユーザー名を取得
var loginNameTags= document.getElementById("zz7_Menu");
var loginDisplayName=loginNameTags.innerText;
var loginName=loginDisplayName.substring(
4,loginDisplayName.lastIndexOf("さ",loginDisplayName.length));
'「ユーザーまたはグループ 」フィールドにユーザー名を表示
var nameTags=document.getElementById("ctl00_m_g_3405cb6d_6769_4048_a928_ec0098015995_ctl00
_ctl04_ctl01_ctl00_ctl00_ctl04_ctl00_ctl00
_UserField_upLevelDiv");
nameTags.innerText=loginName;
}
</script>
ちなみに、この方法では必要となるページごとにコーディングが必要となります。もう少し簡単に再利用させたいのであれば、カスタムフィールドを開発するのがよいと思います。
