こんにちは SharePoint サポートの森 健吾 (kenmori) です。
SharePoint Server 2013 / SharePoint Online では分散キャッシュが導入されました。
比較的身近な部分でも使用されており、その 1 つにビューステート キャッシュ (ViewStateCache) があります。詳細は後ほど記載しますが、ビュー ステートは ASPX ページにおいて、すべてのページにおいて基盤として使用されています。SharePoint 2013 / SharePoint Online からは、このビュー ステートがサーバー側でキャッシュされるということで、様々な影響があります。今回の投稿では、特に開発者向けとして、このビューステートの動作がどのように変更されたかなどを説明し、注意点についてご説明します。
現象
まずは例を用いてご説明いたします。
1. 下記のようなページを表示して、31 分以上置いておきます。
2. その後、ボタンクリックなどを実施します。
3. 上記のようなページとなります。
DropDown の選択肢や、ラベルに累積的に追加していた文字列が消失しました。
SharePoint Server 2013 に Web ソリューションを展開した場合、ほとんどの状況において、この影響を受けることになります。開発者は、このような状況が発生する原因について正確に理解をしておく必要があります。
実装コード
上記例にして使用したコードを記載します。
Visual Studio 2013 にて、空の SharePoint プロジェクトを作成し、新しい項目の追加でアプリケーション ページを追加します。そして、下記のようなコードを実装します。
public partial class ViewStateTest : LayoutsPageBase
{
protected void Page_Load(object sender, EventArgs e)
if (!this.IsPostBack)
DropDownList1.Items.Add("AAA");
DropDownList1.Items.Add("BBB");
DropDownList1.Items.Add("CCC");
DropDownList1.Items.Add("DDD");
}
Label1.Text += "<BR>" + DateTime.Now.ToString();
protected void Button1_Click1(object sender, EventArgs e)
Label1.Text += " " + DropDownList1.SelectedValue;
ドロップダウン リストの選択肢項目は、初回ロード時 (!this.IsPostBack) のみに描画されます。また、ラベルに表示されるテキスト情報は、これまでの累積的な操作の結果 (Label1.Text += ...) が格納される動作として実装されています。
今回の現象は、これまで格納されたビュー上に反映された情報がサーバー側でクリアされてしまうことに起因します。クリアされたビュー ステートの上で、POST 要求が処理されている状況となります。
原因
SharePoint Server 2013 からは、分散キャッシュが導入されました。この機構を使用して、ビュー ステートに格納されていた情報を、サーバー側分散キャッシュ内に ビュー ステート キャッシュ (ViewStateCache) として格納される動作となり、その代わりに HTML フォーム内のビュー ステートに格納されなくなりました。
この ViewState キャッシュは、既定で 31 分を上限とし、それ以上ユーザー アクセスがなく経過したものはサーバー側のキャッシュから自動的に削除されます。そのため、ページを操作するまでに 31 分程時間を空けてしまった場合、サーバー上のキャッシュ上からビュー ステートが消失しており、クライアントからはビュー ステートが送信されないため、これらの状態がない前提で処理が動作します。結果的に、上記画面キャプチャにて紹介した通り、ビュー上に表示された項目が消失してしまいます。
<診断ログ>
ViewState キャッシュが消失した場合、サーバー側には下記のログが記録されます。
08/15/2014 23:54:46.55 w3wp.exe (0x4AF4) 0x43B8 SharePoint Foundation General ajb4t Monitorable ViewStateLog: Failed to find entry in cache: http://kenmori4-52/_layouts/15/SPAppPage/ViewStateTest.aspx, 2fd6b501-061d-4166-9f70-a91c37945d07 6cc5ae9c-4644-d0e4-46ae-6594c5d843c9
補足 1 : ASP.NET におけるビュー ステートについて
ASP.NET は、Web アプリケーション上で Windows フォーム アプリケーション同様 RAD 開発を実施するために、様々なテクノロジーを導入しました。
Windows フォームと HTML Web フォームの一般的な相違点としては、HTML Web フォームは HTTP 要求と応答のやりとりからページを生成するため、これまでの累積的な状態を管理することができない点があります。
例えば、今回のコード例のように初回表示時に追加したドロップダウン リストの項目や、前回ラベルに追記した文字列を、その後 2 回、 3 回とポストバックした際にも以前の状態を保持する必要があります。
これらの情報を保持するために、ASP.NET はこれまでにビュー ステートと呼ばれる領域を用意して、状態を管理してきました。
このビュー ステートは、Web フォーム上の HTML hidden データに _VIEWSTATE という名前の隠しデータを保持し、ボタンクリックなどの操作時 (すなわち POST バックする際) において毎回送信し、サーバーからもこの内容を返し続けることにより状態を保持している機構となります。
Web は逐次 HTTP の要求と応答の内容で描画されますため、継続的な状態の管理を実施する仕組みは本来ありません。これを _VIEWSTATE というデータを毎回送受信する機構によって実現しているのが、ビューステートとなります。下記図を参考にしてください。
下記のページに詳細が記載されておりますので、ご参考にしてください。
タイトル : ASP.NET のビュー ステートの理解
アドレス : http://msdn.microsoft.com/ja-jp/library/ms972976.aspx
補足 2 : 分散キャッシュ ビュー ステート キャッシュについて
ASP.NET は上記の機構を実装することで、Web フォームに状態管理を実施できる基盤を提供しました。しかし、その弊害として毎回追記格納される _VIEWSTATE 値によって HTTP パケット容量が増え、性能等への問題に及ぶこともこれまで発生してきました。この状況を防ぐために、用意された機構が AppFabric Caching Service、分散キャッシュ サービスにおける ViewState キャッシュとなります。
ViewState キャッシュは、AppFabric Caching Service の機構から下記のような設定とされています。
PS:> Get-AFCache | % {Get-AFCacheConfiguration -CacheName $_.CacheName}
ただし、SharePoint はいくつかの設定値については独自設定を実装しております。
例えば、ViewState キャッシュの TTL は、セキュリティ検証のタイムアウト値 (SPWebApplication.FormDigestSettings.Timeout + 1 分) を既定値としております。そのため、既定では 31 分でタイムアウトする設定となっております。
対処策
上記の問題を対処するための一般的な対処策は下記のいずれかとなります。
1. Timer コントロールを使用して定期的な通信を実施する。
ASPX ページ上に下記コントロールを配置して、定期的な (例. 5 分に 1 回など) ポーリングを実現する。
<asp:Timer ID="Timer1" runat="server"></asp:Timer>
タイトル : Timer クラスアドレス : http://msdn.microsoft.com/ja-jp/library/system.web.ui.timer(v=vs.110).aspx
2. ViewState キャッシュを無効にする。
SharePoint 管理シェルを起動して、下記のコマンドレットを実行します。
$contentService = [Microsoft.SharePoint.Administration.SPWebService]::ContentService
$contentService.ViewStateOnServer = $false
$contentService.Update()
注意
ファーム上のすべてのページの ViewState キャッシュが無効化されるため、パフォーマンスに多大な影響を与えます。そのため、十分なテストを実施した上で適用ください。
3. セキュリティ検証のタイムアウトを延ばす。
SharePoint サーバーの全体管理画面から Web アプリケーションの管理画面に遷移し、全般設定 をクリックします。下記赤枠の設定値に指定した値を延長して [OK] をクリックします。
PowerShell で実行する場合は以下となります。
$webApp = Get-SPWebApplication http://sharepoint
$webApp.FormDigestSettings.Timeout = "0:30"
$webApp.Update()
Web アプリケーション配下すべてのページの ViewState キャッシュの期限が延長されるため、全体のキャッシュ サイズに影響を与えます。そのため、十分なテストを実施した上で適用ください。
参考情報
以下の情報は、今回ご紹介した現象に関連した情報となりますので、ご参考にしていただけますと幸いです。
タイトル : AppFabric Caching and SharePoint: Concepts and Examples (Part 1)アドレス : http://blogs.msdn.com/b/besidethepoint/archive/2013/03/27/appfabric-caching-and-sharepoint-1.aspx
タイトル : AppFabric Caching (and SharePoint): Configuration and Deployment (Part 2)アドレス : http://blogs.msdn.com/b/besidethepoint/archive/2013/03/27/appfabric-caching-and-sharepoint-2.aspx
AppFabric には下記のような問題が報告されております。状況を問わず、もし何か問題に直面した場合は、下記の修正プログラムを適用することをご検討ください。
タイトル : Microsoft AppFabric 1.1 for Windows Server 累積的更新プログラム 5 (KB2932678)アドレス : http://www.microsoft.com/ja-JP/download/details.aspx?id=42281
補足となりますが SharePoint Server 2013 のリッチテキスト コントロールについては、ユーザーの編集時間が 30 分を超えることは通常想定されます。
そのため、Serivce Pack1 にてリッチテキストが配置されているページに限定して ViewState キャッシュを使用せず、これまで通り _VIEWSTATE を経由してビューの状態を管理するように修正されました。
今回の投稿は以上になります。
こんにちは、SharePoint サポートの佐伯です。今回の投稿では、検索ナビゲーションについてご紹介します。検索ナビゲーションについて検索ナビゲーション Web パーツは検索系の Web パーツのひとつで、検索ページに配置して使用します。既定では、「すべて」、「ひと」、「会話」、「ビデオ」のリンクが用意されており、それぞれ対象のコンテンツを絞って検索することができます。例えば、検索時に「会話」を選択すると、検索結果として会話のアイテムが取得されます。このように、検索ナビゲーションを使用して特定のコンテンツを対象としたバーティカル検索を実現します。今回は検索ナビゲーションの概要について説明し、実際に例をあげて検索ナビゲーションの編集方法をご紹介します。※なお、エンター プライズ検索センター サイトでは、既定で検索ナビゲーション Web パーツを含んだ検索ページが用意され、検索ナビゲーションの構成も行われていますので、本投稿ではこのサイトを使って説明します。検索ナビゲーションの設定検索ナビゲーションの設定について見ていきましょう。1. エンター プライズ検索センター サイトにアクセスします。2. [サイトの設定] – [検索] - [検索の設定] を開きます。3. 検索の設定ページで “検索ナビゲーションの構成” を確認します。ここに、検索ナビゲーションのリンクが設定されています。新しいリンクを追加する場合は [リンクの追加] ボタンで追加、リンクを削除する場合は該当のリンクを選択して [削除] ボタンで削除します。なお、それぞれのリンクには検索ページの指定が必要です。既定では以下のページが設定されています。これらの検索ページは “ページ” ライブラリに格納されています。- 検索ページの内容について検索ページでは、検索ボックス Web パーツや検索結果 Web パーツなどが配置され、検索結果 Web パーツには目的の検索結果アイテムが取得されるよう設定が行われています。例として、「会話」の conversationresults.aspx ページを見てみましょう。以下の画像から確認できるように、検索ボックス Web パーツ、検索ナビゲーション Web パーツ、検索結果 Web パーツ、絞り込み Web パーツが配置されています。検索結果 Web パーツでは、会話のアイテムを対象とした検索結果が取得されるよう、以下のようにクエリが設定されています。このように、検索ナビゲーションに新たにリンクを追加する際は、目的の検索が行えるような検索ページを作成し、このページに移動するようリンクを設定します。例) 検索ナビゲーションに「画像」を追加する今回は、画像のアイテムを対象として検索を行うリンクを検索ナビゲーションに追加してみましょう。以下の手順で作成します。1) 検索ページの作成2) リンクの作成1) 検索ページの作成1. エンタープライズ検索センター サイトにアクセスします。2. [サイト コンテンツ] で “ページ” ライブラリをクリックし、移動します。3. [新しいドキュメント] – [ページ] をクリックします。4. 以下を入力して、[作成] をクリックします。タイトル : imageresultsURL 名 : imageresultsページ レイアウト : (ページ) SearchResults.aspx5. 検索ページが追加されたので、一覧から imageresults をクリックします。6. 次に、imageresults.aspx ページ内の編集を行っていきます。[歯車] – [ページの編集] をクリックします。7. 検索結果 Web パーツの [Web パーツの編集] をクリックします。8. [クエリの変更] をクリックします。9. 画像のアイテムが検索結果として取得されるよう、[クエリ テキスト] を編集します。例 : {SearchBoxQuery} (ContentTypeId:0x0101009148F5A04DDD49cbA7127AADA5FB792B00AADE34325A8B49cdA8BB4DB53328F214* OR ContentTypeId:0x010102*)10. Web パーツを保存し、ページを保存します。11. imageresults.aspx ページをチェックインし、発行します。2) リンクの作成1. [サイトの設定] – [検索] - [検索の設定] を開きます。2. “検索ナビゲーションの構成” で [リンクの追加] をクリックします。3. タイトルと URL を入力して [OK] をクリックします。補足 : imageresults.aspx のパスが分からない場合は、右の [参照] ボタンをクリックし、”ページ” ライブラリから対象のページを選択します。4. 検索の設定ページに戻り、[OK] をクリックします。検索ナビゲーションに「画像」が追加されました!キーワードを入力して検索すると、このように画像のアイテムの検索結果が表示されます。いかがでしたか。今回の投稿は以上です。検索のカスタマイズや設定に関する過去の投稿もご参考にしていただけますと幸いです。SharePoint 2013 フィルター表示テンプレートをカスタマイズして絞り込み条件数を表示するSharePoint 2013 絞り込み Web パーツの表示を制御する表示テンプレートSharePoint 2013 表示テンプレートを編集して検索結果アイテムをグリッド テーブルで表示するSharePoint 2013 検索結果が何件目または何ページ目のアイテムであるかを表示するSharePoint 2013 検索結果のホバー パネルにカスタムのアクションを追加するSharePoint 2013 コントロール表示テンプレートを使用して検索結果アイテムの一覧表示のデザインを変更するSharePoint 2013 クエリ テキストを編集してドキュメントを対象とした検索を行うSharePoint 2013 検索ボックスの初期値を変更するSharePoint 2013 検索結果のファイルをクライアント アプリケーションで開くSharePoint 2013 検索結果で検索語句を強調するカスタマイズSharePoint 2013 コンテンツ検索 Web パーツでカスタムの管理プロパティを表示するSharePoint 2013 お知らせアイテムを新着順に表示するコンテンツ検索 Web パーツを作成するSharePoint 2013 サイトの表示言語に合わせて検索結果にプロパティ名を表示するSharePoint 2013 検索結果のホバー パネルをカスタマイズするSharePoint 2013 すべての検索結果の種類に共通する表示をカスタマイズするSharePoint 2013 アイテム表示テンプレートを使用して検索結果の表示をカスタマイズするSharePoint 2013 検索結果の表示を制御する表示テンプレート
SharePoint サポートチームの江口です。今回は、SharePoint Online/SharePoint Server 2013 (オンプレミス) で、ワークフローで HTTP Web サービスを利用する方法についてご案内します。
はじめに
SharePoint Designer 2013 では、SharePoint 2013 プラットフォーム ワークフローを作成することができます。
SharePoint 2013 プラットフォーム ワークフローには、新しく追加された "HTTP Web サービスを呼び出す" アクションを使用することができます。
このアクションを使用することで、例えば SharePoint REST サービスのような HTTP Web サービスをワークフロー内で利用できます。
以下の手順では、例として ��じ SharePoint サイト内のリストに含まれたリスト アイテムの数を取得する方法について手順を記載します。
- 目次
手順 1) SPD ワークフローの作成
手順 2) "辞書を作成 アクション" の追加
手順 3) "アクション : HTTP Web サービスを呼び出す" の追加
手順 4) "アクション : 辞書からアイテムを取得する" の追加
1-1) SharePoint Designer 2013 を起動し、SharePoint サイトを開きます。
1-2) [リスト ワークフロー] - [<<任意のリスト>>] を選択します。
1-3) [リスト ワークフローの作成] ダイアログで以下のように設定し [OK]をクリックします。
名前: 任意
説明: 任意
プラットフォームの種類: SharePoint 2013 ワークフロー
2) "辞書を作成 アクション" の追加
2-1) [アクション] - [辞書を作成] をクリックします。
追加される文字列: "この" 辞書を作成する ("変数: 辞書"へ出力)
2-2) "この" をクリックし、"辞書の構築" ダイアログで以下の項目を追加します。
名前 : Accept
種類 : 文字列
値 : application/json;odata=verbose
2-3) "変数: 辞書" をクリックし、任意の変数 (以下、RequestHeaders1 (種類:辞書)) を指定します。
3-1) [アクション] - [HTTP Web サービスを呼び出す] を追加します。
追加される文字列: 次に "要求" で "この" HTTP Web サービスを呼び出す (ResponseContent は "応答" | ResponseHeaders は "応答ヘッダー" | ResponseStatusCode は "変数: 応答コード")
3-2) 追加される文字列にカーソルを合わせ、[下矢印] - [プロパティ] をクリックします。
3-3) "HTTP Web サービスを呼び出す プロパティ" ダイアログで、[RequestHeaders] に、上記手順 2-3) で指定した RequestHeaders1 を指定し [OK] をクリックします。
3-4) 追加される文字列の "この" をクリックし、"HTTP Web サービスを呼び出す" ダイアログで、以下の項目を入力します。
HTTP Web サービスの URL を入力 : http://server/sites/site/_api/lists/getbytitle('<<リスト名>>')/ItemCount
例 ) http://server/sites/site/_api/lists/getbytitle('ListName')/ItemCount
HTTP メソッドの指定 : HTTP GET
補足: 指定した URL は SharePoint REST エンドポイントです。REST サービスの詳細については、後述の参考情報を確認してください。
3-5) "応答" をクリックし、任意の変数 (以下、ResponseContent1 (種類:辞書)) を指定します。
4-1) [アクション ] - [辞書からアイテムを取得する] を追加します。
追加される文字列:次に "辞書" から "名前またはパスに基づいて取得したアイテム" を取得する ("アイテム" に出力)
4-2) "辞書" をクリックし、上記手順 3-5) で指定した ResponseContent1 を指定します。
4-3) "名前またはパスに基づいて取得したアイテム" をクリックし、"d/ItemCount" と入力します。
4-4) "アイテム" をクリックし、任意の変数 (以下、ItemCount1 (種類:整数)) を指定します。
上記手順で、変数 ItemCount1 に ListName のリストアイテム数が格納されます。
補足: 手順 4-3) について
上記手順で設定した "HTTP Web サービスを呼び出す" アクションの ResponseContent1 には、JSON 形式のデータが返されます。
http://server/sites/site/_api/lists/getbytitle('<<リスト名>>')/ItemCount のような HTTP 要求をした場合、以下のような形式で応答を返します。
そのため、手順 4-3) のように、JSON 形式のパスに基づき "d/ItemCount" とパスを指定して辞書からアイテムを取得します。
なお、SharePoint REST サービスでは、Accept ヘッダーに "application/json;odata=verbose" を設定することで JSON 形式で結果を取得できます。(上記手順 2-3) で設定)
設定しない場合は以下のような Atom 形式で結果が返されます。
SharePoint の REST サービスに関しては、以下の技術情報を合わせて参照してください。
SharePoint 2013 REST サービスの概要
[方法] SharePoint 2013 REST エンドポイントを使用して基本的な操作を完了する
"HTTP Web サービスを呼び出す" アクションについては、以下の技術情報を合わせて参照してください。
ワークフロー アクション クイック リファレンス (SharePoint 2013 ワークフロー プラットフォーム)
SharePoint Designer 2013 の辞書アクションを理解する
既知の不具合として、SharePoint ワークフローから SharePoint HTTP (REST) Web サービス以外のサービスを呼び出すと、HTTP Web サービスの呼び出しが失敗する場合があることが報告されています。
問題の詳細と回避策については以下の公開情報を参照してください。
SharePoint Server 2013 の既知の問題
こんにちは。SharePoint サポートの多田です。今回はユーザーソリューションにおいてログを記録することの重要性についてご案内します。
SharePoint 2010 以降から、SPDiagnosticsService クラスを使用することによって、診断ログへの書き込みが容易になりました。以下の通り、一行で診断ログに書き込むことが可能です。
try{
...
} catch (Exception ex) {
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("UserCode", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
ログを記録することの重要性について
SharePoint 製品では既定で診断ログは記録されるようになっており、エラーが発生した場合のトラブルシューティングに使用します。
また、診断ログの設定にてログの出力レベルを詳細に変更することで、エラー発生時だけではなく、正常時のデバッグログを記録することでエラーの発生しない現象 (例. パフォーマンスの問題) などを追跡できます。特にエンタープライズにおけるシステムは、問題が発生した際の報告が不可欠となりますため、これらのログを残す動作は導入後のトラブルシューティングには必須のものになります。
お客様が作成した SharePoint のユーザーソリューションについても同じことが言えます。エラー発生時のログ、および正常時のデバッグログが記録されていない場合、ユーザーソリューション内で発生した問題を特定するのが困難になります。また、場合によっては現象が発生した後にトラブルシューティングを実施するため、ログを記録するコードを追記し、再ビルド & 展開する必要がございます。サービスインした後にこれらの作業を実施する場合は多大かつ緊急な労力とコストがかかることが予想されます。このため、ユーザーソリューション開発時に可能な限り発生し得る問題を予測し、ログを記録するよう計画いただくことを推奨いたします。
また、ユーザーソリューションのログを、テキストファイルなどの診断ログ以外の場所に出力することは、複数プロセスまたはスレッドからの競合を考慮する必要があります。診断ログという機構を使って、安全かつ効率的なロギング メカニズムをユーザーが使用できることはメリットが大きいと考えられます。
診断ログのレベル
診断ログのレベルは数種類ございます。その中で代表的なものを以下にご案内いたします。
Unexpected : 既定の設定で出力されます。予期しないエラーが発生した際に使用されるレベルになります。try ~ catch 句の catch の中で使用されることが多いです。
Medium : 既定の設定で出力されます。正常時において、特定の処理の開始や終了など、各処理の節目をログする際に使用されるレベルになります。
Verbose : 既定の設定では出力されません。出力する場合は診断ログの出力レベルを詳細にする必要があります。正常時のデバッグログを記録する目的で使用されます。
診断ログのエリアとカテゴリを指定する方法
診断ログには複数のエリアおよびそのエリアに含まれるカテゴリがあります。
例えば、以下の画像では "SharePoint Foundation" がエリア、"通知" がカテゴリになります。各エリア内に複数のカテゴリが存在する形になります。
上記にて紹介したログを記録するサンプルコードでは、ログを出力するための最小構成のコードとなります。
しかし、診断ログのエリアとカテゴリを指定していないため、エリアが "Unknown" で出力されます。この場合、診断ログのレベル設定ができないため、Vorbose レベルを含め、すべてのログが出力される形になります。診断ログのレベルに応じて、ログ出力の有無を変更する場合は、エリアとカテゴリを指定して、ログを記録する必要があります。
以下の例では、エリア "SharePoint Foundation"、カテゴリ "通知" のログを出力しています。
SPDiagnosticsService diagnosticsService = SPDiagnosticsService.Local;
SPDiagnosticsCategory cat = diagnosticsService.Areas["SharePoint Foundation"].Categories["Alerts"];
string format = "Test trace logging for category {0} in area {1} : {2}";
diagnosticsService.WriteTrace(1, cat, TraceSeverity.Unexpected, format, cat.Name, cat.Area.Name, "Unexpected");
diagnosticsService.WriteTrace(1, cat, TraceSeverity.Medium, format, cat.Name, cat.Area.Name, "Medium");
diagnosticsService.WriteTrace(1, cat, TraceSeverity.Verbose, format, cat.Name, cat.Area.Name, "Verbose");
※ エリア "SharePoint Foundation"、カテゴリ "通知" のトレースレベルは既定で "中" になっているため、上記の最後の行の Vorbose レベルのログは出力されません。出力する場合は、トレースレベルを "詳細" に変更する必要がございます。
独自のエリアとカテゴリを指定する方法
上記で紹介した方法は、既定のエリアとカテゴリを指定して、ログを出力する方法でしたが、ユーザーソリューション独自のエリアとカテゴリを作成することも可能でございます。
独自のエリアとカテゴリを作成すると、上記の画像のカテゴリ一覧に表示され、出力レベルを変更することが可能になります。方法は以下のブログ資料に記載されております。
タイトル : ULS ログのヒント パート 2
アドレス : http://blogs.msdn.com/b/sharepoint_jp/archive/2011/03/21/uls-2.aspx
参考資料
タイトル : SPDiagnosticsServiceBase.WriteTrace method
アドレス : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spdiagnosticsservicebase.writetrace(v=office.15).aspx
タイトル : SPDiagnosticsCategory class
アドレス : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spdiagnosticscategory(v=office.15).aspx
タイトル : SharePoint 2010 のデバッグ機能とログ機能
アドレス : http://msdn.microsoft.com/ja-jp/library/office/gg512103(v=office.14).aspx
タイトル : TraceSeverity enumeration
アドレス : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.traceseverity(v=office.15).aspx
こんにちは、SharePoint サポートの森 健吾 (kenmori) です。今回の投稿では、SharePoint のページ上で CSS (スタイル シート) を使用し、特定のページ領域を非表示にするテクニックについてご紹介します。
導入 1: スタイルシートを使用する背景
SharePoint でユーザーに操作させたくないコンテンツを非表示にする方法は様々なものがあります。Web ページなので、CSS を組み込むことは最も簡単な方法として思いつくことでしょう。
実際にスタイル シートを選択する判断としては下記があります。
1) 要望を実現したいが Visual Studio を使用してまで実施したくない場合
2) SharePoint Designer などのツールを使ってもコンポーネント レベルの制御しかできないため、その部品として描画されるコンテンツを非表示にするといった場合
SharePoint で CSS を使用して一部のページ領域を非表示にすることは、製品として想定している形式ではないため完全に動作保障しているカスタマイズ形式ではありません。カスタマイズを実施した際には、他への影響がないかを十分にテストしていただく必要があります。ただし、画面上の一部のコンテンツを非表示にするカスタマイズは他への影響も極めて低いため、広く一般的に実施されている手法となります。
導入 2: ページ領域を非表示にするスタイル シートの適用方法
今回は、下記の赤枠部分を非表示にする方法を例にします。
1. 非表示にするスタイルの作成方法
1. 最初に IE11 で [F12] を押して開発者ツールを起動し、下図のような手順で非表示にしたい領域を選びます。
2. 上記 ctl00_ctl146_ShellSites を非表示にする場合、下記のようなスタイル指定となります。
<style type="text/css">
#ctl00_ctl46_ShellSites { display:none; }
</style>
今回は ID 属性が指定されていた要素でしたので、最初に # を付けてスタイルをつけて指定することができました。
しかし、HTML 要素を特定する場合、このように簡単であるとは限りません。ここで指定する黄色でハイライトした部分を指定するテクニックが、今回の投稿のメイン トピックです。下記の「抑えておきたい基本テクニック」にて紹介します。
2. スタイルの組み込み方法 (1) コンテンツ エディタ Web パーツ について
1. [*] – [ページの編集] をクリックした後、コンテンツ エディタ Web パーツを貼り付けます。
2. コンテンツ エディタ Web パーツにて [Web パーツの編集…] をクリックします。
3. コンテンツ エディタ Web パーツの表示領域にカーソルを当て、リボン メニューより [ソースの編集] をクリックします。
4. 下記のスタイルを指定し、[OK] をクリックします。
5. リボン メニューから [保存] や [編集の終了] をクリックして確定します。
6. [サイト] メニューが非表示になりました。
2. スタイルの組み込み方法 (2) マスタ ページについて
スタイルをサイト全体に適用したい場合は、サイトが使用している既定のマスターページを編集することで、広範囲にスタイルを適用できます。
1. SharePoint Designer を起動し、サイトを開きます。
2. [サイトのページ] を開きます。
3. Home.aspx などをポイントし、右クリック メニューより [詳細モードでファイルを編集] をクリックします。
4. リボン メニューより [スタイル] - [開く] をクリックして、適用されているマスタ ページを開きます。
5. 手順 3. で開いていた Home.aspx は保存せずにタブを右クリックしてすぐに閉じます。
6. 手順 4. で開いたマスタ ページのどこか (</head> タグのすぐ上など) にスタイルを指定します。
#ctl00_ctl46_ShellSites
display:none;
</head>
7. 上書き保存して、動作を確認します。
本題 : 押さえておきたい基本テクニック
今回の投稿はここからが本題です。今回は、CSS を使用して描画された後に SharePoint UI のカスタマイズを実施するにあたり、特によく使用する方法として抑えておきたい 3 つのテクニックを紹介します。
先ほどの例では、下記のスタイルを使用しました。display: none を指定する対象の領域をセレクター (黄色の部分) で指定します。
この部分には意外とたくさんの指定方法があります。下記は 頻繁に使うと思われる内容です。
目次
1. 要素セレクター (ID、クラス、Type)
2. 属性セレクター (=, |=)
3. 連結子 (>, [Space])
1-(1) ID セレクター (#)
ID セレクターは、頭に # シャープを指定して要素を取得します。特定の ID 属性を指定して要素を取得する方法です。冒頭の例でもこの方法で要素を抽出しています。
<DIV ID=”TEST”>
aaa
</DIV>
例.
#TEST { display:none; }
1-(2) クラス (.) セレクター
クラス セレクターは、頭に . (ドット)を指定して要素を取得します。特定の class 属性を指定して要素を取得する方法です。
<DIV class=”TEST”>
.TEST { display:none; }
1-(3) タイプ セレクター
クラス セレクターは、要素の型名を指定して要素を取得します。
<DIV>
DIV { display:none; }
属性セレクターは、属性の値を指定して要素を取得します。
<DIV attr=”Value”>
[attr=”Value”]
{ display:none; }
下記の様に異なる演算子を使用することで、例えば SharePoint のリボン メニューを非表示にすることもできます。
下記の例では id 属性を使用していて一見 # でもできそうですが、属性セレクタだと前方一致ができる例を記載しています。リボン メニューのアイコン ID には、 末尾に Large, Medium, Small などのサイズ指定が追記されます。それらの ID の変化を吸収するよう演算子 (|=) を使用し、 前方一致させてスタイルを一元指定することができます。
A[id|='Ribbon.List.ViewFormat.Datasheet'] {
DISPLAY: none
A[id|='Ribbon.List.Actions.ExportToSpreadsheet'] {
連結子は、複数のセレクターを親子で組み合わせて使用する際に効果的です。
親要素に ID 属性は指定されているが、子要素には指定されていない場合、親要素を ID で絞ってさらに子要素を別の属性で絞ることは多くの場合有効です。
連結子のうち > は直属の子要素、[Space] は子孫全般を意味します。
<SPAN>これは連結子に >, [Space] を指定した際にいずれも非表示になります</SPAN>
<DIV><SPAN>これは連結子に [Space] を指定した時非表示になります</SPAN></DIV>
</DIV >
<SPAN>これは表示されます</SPAN>
ID が TEST の要素を絞り、その子要素の SPAN 要素をすべて非表示にします。
#TEST SPAN
#TEST>SPAN
冒頭でお伝えした通り、ここに記載した方法は頻繁に使用されると考えられる方法だけです。他にも CSS ではたくさんの指定方法があります。詳細は下記のページをご参考にしていただけますと幸いです。
タイトル : CSS に関する互換性と Internet Explorer
アドレス : http://msdn.microsoft.com/ja-jp/library/cc351024(v=vs.85).aspx
こんにちは、SharePoint サポートの大関です。
SharePoint のバージョンを問わず、よくいただくお問い合わせの一つとして、通知メールがあります。
今日は、最近確認された通知メールの問題について取り上げたいと思います。
現在、本問題の修正に向けて鋭意取り組んでおりますが、今回の投稿を参考の上、現段階における現象の発生抑制にお役立ていただければ幸いです。
1. 発生現象
SharePoint 2010、SharePoint 2013 において、通知メール本文全体に取り消し線が入る現象が報告されています。
以下のようなイメージです。
本来であれば、以下のように表示されることが期待されます。
2. 発生条件
本現象は以下の条件を満たす場合に発生します。
・リスト (リスト アイテム) に対して、通知を設定している
・対象のリストにリッチ テキストまたは、拡張リッチ テキスト形式の複数行テキスト列が含まれる
・通知メール本文のデータが 255 バイトを超える
以下に、現象が発生する理由について詳細をご説明します。
通知メールの本文には、変更される前のデータのセクション (OldValue) と、変更後のデータのセクション (NewValue) が含まれており、通常 OldValue のセクションの本文にのみ取り消し線が引かれる動作となっています。
通知される本文のデータは、通知の処理が完了するまでの間、コンテンツ データベースの EventCache というテーブルの EventData カラムにバイナリとして保存されています。
これを確認しますと、 <DIV> タグを使用して、取り消し線付の OldValue と、取り消し線なしの NewValue をセクション分けしていることがわかります。
この <DIV> タグが、通知メール本文のデータ サイズが 255 バイトを超えると、正常に定義されなくなるために、本現象は発生します。
具体的には、 OldValue のセクションの終わりには </DIV> という形でセクションの終わりが定義されるべきなのですが、この </DIV> が、NewValue セクションの終わりに定義されているために、取り消し線のスタイルが定義された OldValue セクションのスタイルが NewValue セクションにまで適用されてしまい、本文全体に取り消し線が引かれるという状態になります。
3. 回避策
現時点で本現象を回避する方法は、以下の 2 パターンです。
1) 本文が 255 バイト以下になるようにする
2) 複数行テキストの形式を「書式なしテキスト」とする
1) については、運用方法によっては情報量を調整することは難しいと認識しております。
また、255 バイトとは単純に文字数や行数ではなく、フォントのスタイルや、改行といった書式に関するデータ (上述の <BR> や <P> など) も踏まえての数字であるため、ユーザーの方にとって明確な行数や、文字数といった条件を提示することが出来ない部分となります。
上記を踏まえますと、もっとも確実に現象を回避できる方法は 2) の書式なしテキストの利用となります。
リッチ テキスト形式には、画像や表、ハイパーリンクといった情報を含めることが出来たり、フォントの装飾が出来たりといった利点がありますが、これらを利用していないリストである場合には、複数行テキストの形式を書式なしテキストとすることをご検討いただけますと幸いです。
なお、既に運用中のリストにおいて、複数行テキスト列の形式を "書式なしテキスト" に変更いたしますと、投稿済みアイテムから画像、表、ハイパーリンクといった情報が欠落いたしますので、ご注意ください。
4. 今後の修正予定
現在弊社では、可能な限り迅速に本現象が修正できるよう、鋭意取り組んでおります。
状況にアップデートがあり次第、またブログでもご案内したいと思います。
こんにちは。SharePoint サポートの大竹です。今回は、SharePoint Server 2010 および 2013 にて、Excel のドキュメント プロパティとドキュメント ライブラリの列を連携させる方法についてご案内します。
以下の記事と記載内容が一部重複いたしますが、本記事では、SharePoint 2010 についても記載させていただいております。また、間違いやすい設定項目として “すべてのコンテンツ タイプに追加” チェックボックスを使用した設定方法についてご説明させていただきます。 タイトル : Excel 2013 セルと SharePoint ドキュメント ライブラリ列の連携方法アドレス : http://blogs.technet.com/b/sharepoint_support/archive/2014/06/27/excel-2013-sharepoint.aspx <目次>-----------1. Excel のドキュメント プロパティの設定2. SharePoint ドキュメント ライブラリの設定3. 確認方法-----------
1. Excel のドキュメント プロパティの設定本手順では、Excel 2013 での操作方法についてご案内いたします。 1) Excel 2013 を起動します。2) [ファイル] タブ - [プロパティ] - [詳細プロパティ] をクリックします。3) “プロパティ” ダイアログで、[ユーザー設定] タブをクリックします。4) [プロパティ名] に名前 (例 : Book プロパティ) を入力し、値を設定して、[追加] ボタンをクリックします。
5) 上記設定をした Excel ファイルを、[ファイル] - [名前を付けて保存] をクリックし、ローカルコンピュータ内に保存します。
2. SharePoint ドキュメント ライブラリの設定 1) 新しい SharePoint ドキュメント ライブラリを作成します。2) ライブラリの設定ページで、[詳細設定] をクリックします。3) 詳細設定ページ “コンテンツ タイプの管理を許可する” に [はい] を選択します。 [SharePoint 2010]
[SharePoint 2013]
4) ドキュメント ライブラリのページ (AllItems.aspx) に戻り [ライブラリ] タブ [列の作成] をクリックします。5) 上記手順で作成したプロパティ名と同じ名前 (例 : Book プロパティ) で列名を設定します。6) “列の作成” 画面で “すべてのコンテンツ タイプに追加” チェックボックスのチェックを外して [OK] をクリックします。 [SharePoint 2010]
3. 確認方法 上記手順 1 にてドキュメント プロパティを設定した Excel ファイルを、手順 2 にて列を追加したドキュメント ライブラリにアップロードします。Excel ファイルのプロパティ値に設定した値 (例 : Sample Data) が、追加いただいた列の値として反映されることをご確認ください。 [SharePoint 2010] [SharePoint 2013]
補足情報-------------“すべてのコンテンツ タイプに追加” チェックボックスのチェックを外さなかった場合、作成した列は、ドキュメント情報パネルで表示されるサーバー プロパティと連携する列となります。この場合対象のドキュメント プロパティがドキュメント情報パネルの管理対象になってしまうため、Office ファイルでユーザーが設定したカスタムプロパティの値を自動的に取得して同じ名前のフィールドに格納する機能が働きません。Office 2007 以降、ドキュメント情報パネルという新しい機能が作られたため、基本的にはこちらの情報を優先的にサーバープロパティに書き込むようになりました。ドキュメントプロパティ名を一致させる先述の方法は、以下の限定的な列に対してのみ有効となります。 リストでコンテンツタイプの管理を有効にしている場合は “すべてのコンテンツ タイプに追加” チェックボックスのチェックを外して追加されたカスタム列 なお、ドキュメントライブラリでコンテンツタイプの管理を有効にせずに作成されたリストのカスタム列については自動的に既定の「ドキュメント」コンテンツタイプに紐づいた列とし���登録されてしまうため、ドキュメント情報パネルの管理対象となります。ドキュメント情報パネルについては、以下の技術情報にも記載がございます。 タイトル : ドキュメント情報パネルとドキュメント プロパティアドレス : http://msdn.microsoft.com/ja-jp/library/office/bb447589(v=office.14).aspx タイトル : ドキュメント プロパティとコンテンツ タイプアドレス : http://msdn.microsoft.com/ja-jp/library/office/bb447539(v=office.14).aspx