2008年1月25日 (金)

MSDN フォーラムに同タイトルの質問がありました。手軽に実装できないかと考えていたところふと、SharePoint Designer 2007でJavaScript を用いてコーディングできないかと思い、試してみました。なんとかなりそうです。MSDN フォーラムには返信していますが、こちらのブログにもエントリをポストしておこうと思います。

検証環境ではカスタムリストを作成し、そのNewForm.aspx を編集しました。

まず、JavaScript を用いて「ユーザーまたはグループフィールド」のオブジェクトをどうやって取得するかがポイントです。他の列の種類とは異なり、「ユーザーまたはグループフィールド」列のオブジェクトの取得はコツが必要です。なぜかというと、他のフィールドは "input" タグなどが生成されるのですが、これは 複雑なテーブル内に含まれるDivタグが生成されるからです。このあたりは IE Developer Toolbar を活用して調査しました。IE Developer Toolbar は IE 6.0 以降にインストールできる無償のアドインです。これを使うと、画面上に表示されるテーブルやセル構造、CSS などを GUI で確認できます。ツールは次のURLからダウンロードできます。

次のようにコードを記述しました。

  1. 1. NewForms.aspx のContentPlaceHolderId属性が"PlaceHolderMain"となっているコンテンツ コントロール("asp:Content "で始まるタグ) を見つけます。
  2. 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>

  3. "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>

ちなみに、この方法では必要となるページごとにコーディングが必要となります。もう少し簡単に再利用させたいのであれば、カスタムフィールドを開発するのがよいと思います。