SharePointリストの計算列で今日の日付を使用して、たとえば、タスクが期限切れかどうかを判断できるようにしたいと思います。 「Today」という名前のダミー列を作成し、それを数式で使用してから削除し、SharePointを「だまして」Today関数を使用するという、十分に文書化されたトリックがあります。
問題は、この方法が確実に機能しないことです。計算は動的ではありません。アイテムが保存されたときにのみ作成されるため、今日の「列」は事実上変更日になります。 (これが、SharePointでToday関数を簡単な方法で使用できない理由です。)
誰かがうまくいく解決策を見つけましたか? javascriptを使用してクライアント側で実際の日付を取得し、色やフラグなどを表示できることはわかっていますが、「サーバー側」のソリューションを探しています。
参考までに、Todayコラムのトリックとその問題は、次の2つの投稿と関連するコメントでかなりよく説明されています。 http://blogs.msdn.com/cjohnson/archive/2006/03/16/552314.aspx および http://pathtosharepoint.wordpress.com/2008/08/14/calculated-columns-the-useless-today-trick/
これを回避する方法はありません。リストの値はデータベースに保存され、検索クローラーなどの他の機能に「そのまま」返されるため、動的フィールドを作成することはできません。
計算に今日の日付を使用して、値をdisplayにするカスタムフィールドを作成することができます。
Christophe(PathToSharePoint)の記事に加えて、Todayのトリックとそれが機能しない理由についても説明します。
いくつかのファッジがありますが、おそらく最も良いのはDessieのコンソールアプリ(MNMが前述)です。
その良いですが、完璧ではありません。たとえば、さまざまなタイムゾーンについて心配する必要があるかもしれません。
このルートを進む前に、本当に本当にこれを行う必要があるかどうかを自問する必要があります。例えば :-
カウントダウン(タスクを完了するための延滞日数/残り日数) が必要な場合は、SPDおよびXLSTデータビューWebパーツを使用できます
期限切れのアイテムまたは過去X日間に作成されたアイテムをビューに表示する場合は、ビューフィルターで[今日]を使用できます 2
Today列を作成する場合は、更新する必要があります。これは、タイマージョブを使用するか、ユーザーがヒットしたページにjqueryスクリプトを配置することで実行できます。スクリプトは、SPServices.SPUpdateMultipleListItemsを呼び出して更新を行うことができます。 CAML句を渡して、Today値を更新する必要があるリストアイテムのみを更新するようにします。 1日1回。
私は非常に大まかな、しかしコーディングをしなくてもこの問題の実用的な解決策を思いついた。今日のコラムをどのように作成したか、そしてそれを期限切れのコラムにどのように組み込んだかについて説明します。そのコラムも同様に行う方法を見つけるのが面倒だったからです。
まず、「today」(gasp!)という名前のコラムを作成しました。次に、「DaysOverdue」という名前のコラムを作成しました。次に、SharePoint Designerを開き、新しいワークフローを作成しました。アイテムが編集/更新されるたびに実行するように設定しました(このリストのバージョン管理をオフにしたことに注意してください。そうしないと、サーバー上に大量の無駄なデータが蓄積されないようにコーディングに頼らざるを得ませんでした)。変更された日付をワークフロー変数に格納するだけのアクションを設定してから、today列の値をその変数に変更します。変更された列は日付/時刻であり、今日の列は単なる日付ですが、問題なく転送されます。次に、ワークフローを2時間一時停止するように設定しました。これは、明らかに必要な時間に設定できます。今日の列が更新される可能性のある最新の時刻(私の場合は午前2時)が変更されるだけです。
延滞日数の列に移ります。これはその人のためのコードです-
=IF([Due Date]>Today,"None",IF([Date Closed]=0,Today-[Due Date],IF([Due Date]>[Date Closed],"None",IF(Today>=[Date Closed],[Date Closed]-[Due Date],IF([Due Date]<Today,Today-[Due Date])))))
これは、延滞日数を日数で示します。延滞していない場合は、「なし」と表示されます。数値形式または文字列形式のいずれかを使用できますが、日付形式は使用できません。さて、これがこの問題に直面していて、コーディングを掘り下げたくない人に役立つことを願っています。
編集:上記の「延滞日数」列のコードで、今日が締め切り日を過ぎている場合は、今日から期日を引いたものではなく、締め切り日から期日を引いたものを使用して、計算を確実にすることを忘れましたアイテムが閉じられた後は発生し続けません。あなたはおそらくコードでそれに気づいたでしょうが、念のためにそれを指摘する必要があると感じました。
編集2:計算列の2回目の編集の前に持っていたコードは、問題が「クローズ」とマークされた後、期限切れの日数を適切に計算しませんでした。更新したコードを入れました。コードの最後の部分は最初と同じロジックであるため意味がありませんが、機能したので、チャンスを逃したくありませんでした。 :)
平和。
私も解決策を探していましたが、まだ運がありません。今日のコラムのトリックには、動的ではないという制限があります。
ただし、提案が1つあります。毎日午前12時に、特定の列を現在の日付で更新するタイマージョブを作成してみませんか。皆さんの中には頭上だと思う人もいるかもしれません。ただ私の提案:D !!
以下を使用しましたが、問題ありませんでした。
フィールド名:期限切れ
フィールドタイプ:計算済み
返されるデータ型:はい/いいえ
式:=AND([Due Date]<NOW(),Status<>"Completed",[Due Date]<>"")
私のアドバイスは、この計算を行うonフィールドを作成し、SharePointリストで参照することです。単純な実装ではありませんが、機能します。