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>

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

トラックバック

このページのトラックバックURL: http://bb.lekumo.jp/t/trackback/718613/34255782

「ユーザーまたはグループ フィールド」の初期値にログインユーザー名を表示するようにしたいを参照しているブログ:

コメント

いつもお世話になっております。
(コメントするのははじめまして、
 いつもいつも参考にさせていただいています。
 以前、セミナーにも参加させていただきました)

この要望、結構多いですよね。
以前要望を受けた際には、開き直って、仕様を
「空欄であったらログオンユーザ名を設定する」
として
SharePoint Designerのワークフロー機能で
片付けたことがあります。

最初から入っている方がかっこいいので、今度はこの方法を試してみます。

T.Notsuさん、
初のコメントをありがとうございます。なるほど。やはり、現場でのニーズは多いのですね。参考になれば幸いですhappy01

いつもお世話になっております。
ようやく余裕ができたので、社内サーバにて使わせていただきました。

..とてもいい感じです。
(何でえむえすさんはつけてくれなかったのだろう、という気もしますが)

ところで、その際にちょっと気がついたことがあります。
本ページ上のソースですが
・・・・
'「ようこそ」の部分からユーザー名を取得
var loginNameTags= document.getElementById("zz7_Menu");
・・・・
ここのタグIDも、編集対象のページによって変わっていました。
# zz7_Menuのページと、
# zz8_Menuとなっているページとがありました。
多分、ページのカスタムをやっているうちに、
SharePointDesignerでタグ位置が
動いたか何かしたのだろうと思うのですが
原因までは確認できませんでした。

ご参考までに。
今後とも、よろしくお願いします。

はじめまして。

いつも参考に拝見させていただいております。

突然の質問で申し訳ありませんが、「ユーザーまたはグループ フィールドの初期値にログインユーザー名を表示するようにしたい」の情報にて、「NewForms.aspx」での入力作業の軽減を行いたいと考えております。

ユーザ名、日時フィールド(現在日時を取得)に関しては問題なく登録が行えるようになりました。
しかし、参照フィールドに関しては、選択枝から選択された項目ではないとの事で登録ができません(この状態で一度プルダウン表示を行うと、選択枝から選択した事になるようで登録が行えるようになります)。

具体的には、選択枝が多い為、プルダウンしたリストから選択することが大変なので、ダイアログ表示した別ウィンドウで絞り込みで選択できるように(製品名で絞り込んで型名群を表示、型名を選択するとダイアログを閉じて、戻り値にてinnertextにてフィールドに登録)しています。

何か解決策はあるでしょうか?

ikedaさん、コメントをありがとうございます。1か月近くもお返事できず、すみません。もう解決されたかも知れませんが、念のためお返事しておきます。
本件について、ちょっと考えてみましたが、参照フィールドを使うのは得策ではないように思います。私が良くやるのは、すべて一行フィールドにして、このフィールドはJavaScriptからスタイルシートをいじって非表示にし、代わりにJavaScriptで生成したHTMLの選択肢フィールドを表示させるようなカスタマイズですね。で、この選択肢を選択すると、一行テキストフィールドに入れるようにします。もちろん、これはメンテナンス性に欠けるのでどうしても他に方法がない場合の対処策です。最も良いのは、Visual Studioでカスタム列およびカスタムリスト定義を作成することではないかと思います。これなら、データベース連携もできますし。参考になれば幸いです。

いつもお世話になります。
現在、SharePointの本を読んで勉強しております。
こちらにこういった内容を投稿するもの間違っているかもしれませんが、このページを見ていて参考にしておりましたので、投稿させて頂きました。間違っていたら申し訳ありません。

今、行おうとしているのはSharePointにログインしたアカウント名を取得してPOSTで別のWebアプリへ渡す、ことを実現したいと
考えています。
2つ目のスクリプトの「ユーザ名を表示する」部分を変更すれば
できないか、と考えております。
用途が違うのでしょうか。

よろしくお願いします。

tanoさん、お世話になっております。

SharePointにログインしたアカウントを取得してPOSTで別のアプリに渡すということですが、本記事は.NET言語での開発を行わない場合の苦肉の策でして、実装されるアプリケーションが何か不明ですが、コーディングが可能なのであれば最も良い方法は SharePoint オブジェクト モデルを使用して、カレントのログインユーザー情報を取得することです。これはSPWebクラスのCurrentUserプロパティから取得可能であり、ユーザー表示名、ログイン名、メールアドレスなどが取得できます。

SPWebクラスの詳細はMSDNを参照されるとよいと思います。
http://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.spweb.aspx

参考になれば幸いです。

いつもお世話になります。

ありがとうございます。大変助かります。
全くSharePointでの開発を行ったことがないため、何から行えばよいのか分からないまま、手探りで進めています。
ユーザ情報の取得は教えて頂いたページを参考にさせて頂きながら、C#でカスタムのアプリケーションページを作成し、SharePointに配置しようと考えております。
ご連絡が遅くなってすいませんでした。

今後ともよろしくお願いします。

tanoさん、お世話になっております。その後どうなったかなぁと心配していたのですが、お役に立てたようでよかったです。今後ともよろしくお願いいたします。

こんばんは。
いつもお世話になります。

もし、可能であればアドバイス頂ければと思い、こちらにご質問させていただきました。
前回、アドバイスを頂いたおかげでログイン情報を取得することができました。ありがとうございます。
あとは、別のサーバに取得した情報を投げるのみになりました。
HTMLで次のようなタグを記述し、テストしたところうまくいったのですが、現状どうもうまくいきません。


現在作成しているaspxのファイルをブラウザで開き、ソースを表示させたところ、「USERID」という変数として渡したい部分が、「ctl00_PlaceHolderMain_LinkButton1」というような変数になってしまい、うまく渡せないことがわかりました。
これはaspx上で「」で記述しているためだと思います。そのため、渡したいページは開くのですが、データが渡せないため、必要なデータまで表示できない、というような状態です。

あつかましいお願いかもしれませんが、アドバイス頂ければと思い、質問させて頂きました。

よろしくお願いします。

tanoさん、その後、またうまくいかないところが出てきたのですね。むむむ。
少々込み入っているようですし、こちらのコメントからでは、ちょっと詳細が把握できないので、弊社の有償サービスの範囲でという話になるかもしれませんが、後ほど、いただいているメールアドレスに、直接個別にご連絡させていただきます。よろしくお願いいたします。