コードなしのソリューション:リスト アイテムが最後に変更された日数を表示する
Applies To
Microsoft 365 の SharePoint Microsoft 365 Small Business の SharePoint作成者: Justin Joyce、LANtek
注: この記事は、SharePoint のエンド ユーザーを対象とする Get the Point ブログ (英語) で 4 年間にわたって集めた投稿の一部です。
概要:コードを使用しないカスタム エージング レポート
SharePoint サイトでよく要求される機能部分の 1 つは、タスクまたはリスト アイテムのいずれかのエージング レポートです。 つまり、リスト アイテムの最終更新日以降どれだけの日数または月数が経過したかということです。
この問題は表面的には非常に単純に見えます。 結局、アイテムの作成日および修正日があり、イベント レシーバーを介してアイテムに特定の変更が行われたときそのカスタム日付を格納する機能があります。 Excel のような数式を含めて情報に対して動作させることができる、計算列があります。 これは、非常に簡単な問題のように見えます。 日付フィールドを選択し、計算列を作成し、[DateField] – [Today] に似た数式の計算を行うことです。 でも、そんなに簡単にはいきません。 この “単純な” 作業を行ったことがあるすべてのユーザーがおわかりのように、計算列に [Today] のようなものを使用しようとすると問題が発生します。 計算列の数式ボックスに [Today ] を挿入すると、次のようなエラー メッセージが表示されます。
それはなぜか。 集計列の計算方法を、演算する方法についても説明します。
簡単な式を例にしてみましょう。
= IF( [Column1]<=[Column2], "OK", "Not OK")
これは、Column1 が Column2 以下の場合は OK を表示し、それ以外の場合は Not OK を表示するのが問題です。 これは、集計列の一般的な基本的な数式で、これらの列を含むリスト アイテムに関する基本的な前の前の例を示しています。リスト アイテムの更新イベントを使わずに、Column1 と Column2 の値は変更できません。
計算する情報は、アイテム自体に含まれていると想定されているので、当然、計算列はリストの更新時 (または作成時) にしか再計算されません。 これは、今日の日付など、アイテムのフィールドとは別に変更されるものを使用しようとするときに問題を起こします。
ここでは、計算列がどのように機能するのかを決定した会議ではないので、そこで説明した教育になった場合、この方法でそれらがパフォーマンスのために機能することを想定していました。 数桁のアイテムのリストがあり、それぞれに "ライブ" の更新が必要な計算列が含まれている場合は、次のとおりです。 つまり、タイマー ジョブなど、一部のメカニズムは、頻度に値を更新して更新する必要があります。 このジョブの実行や変更を行う場合は、パフォーマンスの規定に大きな負をかけることができます。 これは私たちの成功ですが、それについて検査した方が、かなり簡単に説明します。
最初に Today という名前の列を作成し、それを数式に追加し、次いで削除して、Today の値を受け入れるように SharePoint をだます同様のソリューションの提案がいくつかあります。 これらはすべて問題ありませんが、計算列が更新されることについて私が説明したことを思い出してください。 この値は、アイテムの更新時にしか変更されず、これはつまり、値 (特に日にちにの計算) がすぐに不正になることを意味します。
巧妙な JavaScript を使用して、値をページに書き込んでいるユーザーを見たことがあります。 これでも機能しますが、私は使用しないで済むのであればクライアント スクリプトは使用しない方がよいと考えています。
実装:
それではどうすればよいのでしょうか。 Today 関数などのいわゆる “可変” な関数には、計算列は論外です。 計算列、タイマー ジョブ、スケジュール済みの処理などのカスタム コードを開発して、この計算を行う必要のあるすべてのアイテムを完全に更新させることも可能です。 その場合、前のパラグラフで触れたパフォーマンスの問題にまた戻ってきてしまい、加え、これは問題のサイト、リスト、列に固有なものとなってしまうため、もろいソリューションでもあります。 これらの 2 つの懸念に加え、私などのようなコードを作成できるオタクを見つけてきて、このソリューションを開発してくれるよう説得する必要もあります。 しかし、別の簡単な方法もあります。
サイトにフィールドを作成しページを編集する権限があり、XSLT とビューの作成に関する知識が少しある場合、リスト ビューに含めることができる XSL テンプレートを組み合わせて、ページの要求があるたびに値をきちんと計算させることができます。 このシナリオはパフォーマンスの懸念をなくし、カスタム コードを開発したり、ソリューションを介して展開する必要がありません。
完璧です。 では、これはどのようにすればよいのでしょうか。
-
ソースとして動作するフィールドを作成または選択します。 これは Date 型である必要があります。
-
計算する値のプレースホルダーの役割を果たすフィールドを作成します。
-
これらの 2 つのフィールドをコンテンツ タイプに追加し、そのコンテンツ タイプをリストに追加します。
-
ソースとプレースホルダー列の両方を含むそのリストのビューを作成します。
-
XSL テンプレートをスタイル ライブラリにアップロードします。
-
UI を使用してリスト ビュー Web パーツの “XSL Link” プロパティを設定します。
-
成功です。
ここでは、使用例を見て、実装について説明しましょう。 お客様から、メイン リストのビューを見て、特定のリスト アイテムが状態でどれだけ表示されているかを示すようにしたいとしました。 このリストには、アイテム タイプから取得してリストに追加されたカスタム サイト コンテンツ タイプが含まれています。 リスト アイテムの状態フィールドが変更され、その日付を "日付の状態が変更されました" という列に保存された場所に既にイベント レシーバーが存在していました。 この無線はすべて必須であり、任意の日付フィールドを使用して実行できます (実装は実装ですが、試してみてください)。 必要な最小の目的は、一覧に計算 (次の段落での詳細) を保持するソース日付フィールドとプレースホルダー フィールドですが、サイトの別の場所でこのソリューションを再利用したい場合は、サイトの列やサイト コンテンツ タイプを使用することをおすすめします。
したがって、今日の日付に対して使用できるソース日付が計算にあるわけです。 これで、計算値のコンテナーとして使用できるカスタム サイト列を作成できます。 この場合、ユーザーにこの列に任意の値を入れてほしくないので、新しいまたはアイテム編集フォームでは変更できない、しかしビューに表示するために選択することはできる計算列を使用することを選択しました。 ビューに表示されないなど理由がわからなくなる可能性があります。
これでサイト列があるので、リストで使用するコンテンツ タイプに追加できます。 次に、XSLT で後でカスタマイズするビューを作成する必要があります。 ソース日付列と計算値のプレースホルダーとして機能する新しい計算列を含む標準のビューは必ず作成してください。
これでカスタム エイジング レポートをサポートするために必要なすべての準備が整いました。 後は、XSL テンプレートを作成し、それをサイトのスタイル ライブラリにアップロードし、リスト ビューにリンクを行うのみです。 使用する XSL テンプレートは、SharePoint で生成されるビューを生成するいくつかの標準のマークアップと、その一部をオーバーライドして希望する値を計算してくれる独自のカスタム マークアップを含むことになります。
クレジットが期限切れの場合、MSDN フォーラムで使用中の実際の計算を実行する XSL テンプレートが拡大して http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
次の場所から、私が作成した XSL スタイル シート (aging.zip) をダウンロードしてください。https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9! 104
お気に入りのテキスト エディターでこれを開くと、ビューをレンダリングする SharePoint XSL マークアップが表示されます。 357 までスクロールして 357 行までスクロールすると、マークアップに追加したカスタム テンプレートの開始が表示されます。最初のテンプレートの "計算日" テンプレートの後に "計算日が計算日" と "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_At_x0020_Status" と表示されます。 これらは 3 つのテンプレートで、このビューに計算を行い、表示します。 この記事の前のバージョンとは異なるフィールド名を使用する場合は、これらのテンプレートを使用して、他の名前への参照を置き換える必要があります。 この場合、表示名ではないフィールドの内部名を使用するのにご使用ください。
テンプレートの準備ができたら、スタイル ライブラリに移動し、“XSL Style Sheets” フォルダーにアップロードし、ファイルにリンクをコピーします。 これにより、後で楽に変更したり、お好みでサイトの別の部分に追加することができます。
次いで、リストに移動し、この記事で既に作成したビューを選択します。 [サイトの操作] メニューの [ページの編集] をクリックします。
ページでリスト ビュー Web パーツを探し、右上隅の小さい下向き矢印をクリックして、Web パーツ メニューを開きます。 このメニューから [Web パーツの編集] を選択します。
これにより、ブラウザー ウィンドウの右側に Web パーツのメニューが表示されます。
+ をクリックして[その他] セクションを表示し、[XSL リンク] プロパティを見つけます。
前にコピーしたスタイル ライブラリ内の XSL ファイルへのリンクを貼り付けます (相対または絶対リンクが可能です)。
[OK] をクリックして変更内容を保存し、ページ上部の [ページ] リボン上の [編集の終了] ボタンをクリックします。
すべてが正しく設定されたら、“Days At Status” 列に数値が表示されます。
最後に、さまざまな日付のいくつかのテスト データがどのように示されるかの例を次に示します。
概要:
このようにすれば、コードを実装せずに、きちんとフォーマットされた、堅固で、よりよく機能する SharePoint の完全なエージング レポートを作成することができます。 これには、ここでのユース ケース以外に可能なアプリケーションがいくつかあります。 この種のレポートによくあるもう 1 つのシナリオは、タスクが作成されてからどれくらいの期間がたったか一目でわかるようにするためのタスク リストへの接続です。
最新機能をご利用ください。
--Justin
Justin Joyce、LANtek
コメント
手順が表示されない
2012/08/08/23:51 AM 手順を実行しましたが、何か欠けている必要があります。XSL はどのように使用するか、または日後に日数を追加するフィールドですか? 手順が見つからないときに通知します。コードなし、集計しました。
2012/08/30 同じエージェント - これが 「コードなし」と考えないでしまいます。 SharePoint のいくつかのスクリプトを通して、Today を使って計算列があります。...しかし、再び入手できないのはなぜですか、それでも問題はありませんが、それでもそこで操作しています。"Days At Status" 計算列の数式
5/2/2012 7:39 AM Justin - "Days At Status" 計算サイト列 (プレースホルダー列) に使用した数式は何ですか? "=today" でしたか?SharePoint 2007
2011/12/2 2 11:29 AM 現在、このソリューションを SharePoint 2007 に適用していませんが、考え方が確認しています。 残念ながら、UI の Web パーツに XslLink プロパティが表示されません。すばらしい投稿
2011/11/30:53 AM こういう すばらしい投稿。 SharePoint 2007 を使用しています。 上で説明したように Misc セクションがない。 SP2007 の設定手順をお持らずですか? ありがとう。Re: コードなしのソリューション:SharePoint リスト アイテムが最後に変更された日数を表示する
2011/10/11 8:24 AM こんにちは すばらしいこと。 今日、私は今日、ちょうどどどに投稿した内容を見て、このソリューションをより役ににかけないか確認します。 投稿を気にしたとこら、日本語の日付形式のソリューションを見つけることは、たずねました。 :) -Justin 2011/10/11 6:45 AM もう一度 Justin なお、このページで前述した問題の解決策が見つかりました。日本語の日付形式
2011/0 7/2011 3:59 AM こんにちは これは、とても良い解決策で、最後の 2 日間を探しているのです。 しかし、私は問題が発生し、私は役に立ちました。 "DateDiff" 関数の最後の行で変数を切り替えることで、何日か問題が解決するまで、コードが少しずつ計算されるまでコードを少しずつ計算しました。 <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of> ただし、その時間の下に相違点を正しく評価できるだけです。 したがって、この日付を使う場合 (dd/MM/yyyy); 2011/30/12 正しく計算されますが、この日付 (同じ形式) を使用して計算します。 2011/12/10 2011 年 10 月 12 日より 10 月 10 日のように計算されます。 次のように"JulianStartDate" 変数の日と月の値の位置を切り替えるだけです。 <xsl:with-param name="substring(ddwrt:FormatDateTime($StartDate), 1033, 'yyyyMMdd'),7,2)"/> <xsl:with-param name="Day" select="substring(ddwrt:FormatDateTime($StartDate), 1033, 'yyyyMMdd'),5,2)"/> この問題は、2 番目の日付で問題を修正しましたが、次に最初の日付に間正しくない問題が修正されました。 また、FormatDateTime 呼び出しを変更し、EUDS とさまざまな変更を使用し、成功せずにサブ文字列の位置パラメーター (ddMMyyy、MMdyy など) の最後のパラメーター (ddMMyyy、MMdyy など) の最後のパラメーターに移動するような修正を試みました。 私は、あなたが利用できるあらかじめ、大きな承認を必要としています。 ありがとうごです。 Chrisコードなし
2011/09/21 4:27 AM XSL は、すべてのユーザーに対して XSL 言語を理解するというわけではないものであると考えはいけませんが、プログラマリングは関わりません。 その他にも、よく読むのです。