皆さんはSharePointリストを活用される際、「日付情報の差分を自動で計算したい」と思ったことはありませんか。例えばプロジェクトの開始日と出荷日を入力すれば、自動で所要日数を算出できると便利ですよね。ところが、計算式にDATEDIFを使うと、なぜか上手くいかないというケースがあります。本記事では、そんな悩みを解決する方法をじっくり解説していきます。
DATEDIF関数がうまく機能しない背景
SharePointリストに計算列を設定するとき、Excelのような感覚でDATEDIF関数を使用したくなります。実際にExcelであれば、以下のような式で2つの日付の差分を求められます。
=DATEDIF([開始日セル],[終了日セル],"d")
ところが、SharePointリストの計算列に同じような式を書いてみると、#Name?
といったエラーが返ってしまう例があります。特に、下記のようにブランクを条件分岐で評価しつつDATEDIF関数を呼び出す式を入れた場合、うまくいかないことが多いのです。
=IF(OR([Confirmed Shipping Date]=" ", [Confirmed Start Date]=" "), "0", DATEDIF([Confirmed Start Date],[Confirmed Shipping Date], "d"))
なぜこのようなことが起きるのでしょうか。Excelでは問題なく機能するDATEDIFも、SharePointの計算列では一部制限や挙動の違いがあるために、認識されない場合があるのです。
ExcelとSharePointの計算列の違い
Excelの関数をそのまま使えると思いがちですが、SharePointの計算列はあくまでSharePoint独自の実装となります。対応している関数や文法が同じではないことが多々あります。特にDATEDIFはExcel固有の関数として扱われがちで、SharePoint上で正式にサポートされていないケースがあります。
空白文字列の扱い
式の中で " "
(半角スペース)を条件にしていると、思わぬ挙動を起こしやすいです。ブランク状態を判定する際、Excelでは空文字列 ""
と半角スペースが明確に区別されますが、SharePointではユーザーインターフェース上の表示や内部的な処理に差異があり、単に " "
と書くと実際にはブランクとして認識されないことがしばしばあります。これによって、条件分岐が誤って動作し、最終的にDATEDIF自体が評価されずにエラーを返すことがあります。
問題解決のポイント
DATEDIFが使えない場合、まずは「本当にDATEDIFが必要なのか?」を考えることが大切です。SharePointの計算列では、日付型同士を直接引き算するだけで、その差異を日数として計算できるケースが非常に多いです。Excelのように多機能な関数に頼らなくても、シンプルな演算子で要件を満たせる可能性が高いのです。
具体的な代替式
DATEDIFの使用をやめて、以下のように書き換えてみましょう。
=IF(
OR([Confirmed Start Date]="", [Confirmed Shipping Date]=""),
"0",
([Confirmed Shipping Date] - [Confirmed Start Date])
)
OR([Confirmed Start Date]="", [Confirmed Shipping Date]="")
:両方の列のいずれかがブランクである場合に「0」を返す- それ以外(つまり、両方日付が入っている場合)には
[Confirmed Shipping Date] - [Confirmed Start Date]
で日数差を直接計算する
このようにシンプルに書き換えることで、多くの場合はエラーが解消され、日付の差分を問題なく算出できます。
計算列のデータ型に注意
計算列の種類を「数値」や「文字列」にしていると、結果の表示が意図しない形になる場合があります。日数を返す場合には、計算列の設定でデータ型を「数値」とするか、必要に応じて「文字列」とするか決めておきましょう。
- 数値:そのまま数値として日数を扱える
- 文字列:数値計算は表示上OKでも、並べ替えや集計が正しく動かない可能性がある
特に集計ビューで使用したい場合や、Power Automateと連携してさらなる自動化を図りたい場合には、数値として扱うほうが扱いやすくなります。
ブランク判定の詳細とエラーの回避
空欄を判定する方法としては、[列名]=""
のほかに、ISBLANK([列名])
を用いることもあります。しかし、SharePointの計算列が許容している関数やシンタックスがバージョンや環境によって異なる場合もあるため、一概にすべての環境でISBLANKが使えるとは限りません。実際は ""
の方が汎用的に動くケースが多いです。
また、前述のように " "
(半角スペース)と ""
(空文字)はプログラムや式の世界では別物です。UI上は同じように「空欄」に見えても、実際には内部にスペースが入力されていると条件判定が食い違ってしまうので要注意です。
ブラウザー環境やキャッシュの問題
計算式を更新しているのに、なぜかSharePointの画面上にエラーが残るという場合、ブラウザーキャッシュの影響があるかもしれません。SharePointに限らず、Webアプリケーション全般で起きやすい現象ですが、特にリストや列の設定を変更した直後に発生することがあります。そのような場合はシークレットウィンドウでSharePointにアクセスしてみたり、ブラウザーのキャッシュをクリアしてみると、正常に反映されることがあります。
シークレットウィンドウでの動作確認
シークレットウィンドウでSharePointにアクセスすると、通常時に保存されているキャッシュやCookieの影響を受けにくい状態になります。もし通常のウィンドウではエラーが発生していたのに、シークレットウィンドウでは問題なく動作するなら、キャッシュ絡みの不具合である可能性が高いです。その際はブラウザー側のキャッシュを削除し、ページを再読み込みすれば解決するケースが多いでしょう。
列名やデータ型の誤表記
SharePointリストで計算式を記述する際、意外とありがちなのが「列名の記述ミス」です。列の名称を変えたのに、計算式を修正し忘れているパターンです。これは初歩的なミスですが、大人数で運用しているリストや複数のバージョンが併存している環境だと起こりやすい問題でもあります。
- 列名の重複:例えば同じ名前の列が2つ存在し、内部的には「列名」、「列名1」となっている場合
- 表示名と内部名の違い:日本語で表示していても、内部名が英語になっている場合がある
列設定画面から「列の内部名」を確認し、式に使用している列名が正しく内部名と対応しているかをチェックしましょう。特に、カスタム列を追加・編集するときに注意が必要です。
SharePointの計算列でよくある日付計算の例
ここでは、日数差以外にも使われることのある日付計算の例をいくつか紹介します。状況によってはDATEDIF以外の関数や演算子で十分に要件をカバーできるため、目的に応じて使い分けてみてください。
実稼働日数の計算(祝日を除く)
SharePoint標準では、土日祝を除いた稼働日数を計算する機能は提供されていません。もし必要であれば、外部データソース(ExcelやPower Automateで管理している祝日リストなど)を活用し、JavaScriptコードやPower Automateのフローで計算する方法を検討する必要があります。計算列だけで実稼働日数を正確に出すのは難易度が高いです。
特定時点からの経過日数カウント
例えば「チケット登録日」から現在まで何日経過したかを自動で表示したいことがあるかもしれません。その場合はToday(今日)の日付を参照したいところですが、SharePointリストの計算列では直接Todayを参照するような式を指定することはできません。代替策として、ルックアップ列やワークフロー、Power Automateなどを駆使して「今日の日付」を自動更新し、別の列に取り込んだ上で引き算する方法が広く知られています。
実運用で役立つテクニック
SharePointで計算列を活用して日付を扱う上で、知っておくと便利なテクニックをまとめました。
タイムゾーンに気をつける
SharePoint上の日時は、そのサイトが設定しているタイムゾーンやユーザー個別の地域設定に影響を受けます。とくに複数地域で同じリストを使う場合、時差の影響で想定外の1日ズレが発生するケースがあります。計算列で単に差分を取るだけなら大きな誤差は生じませんが、日付の境界付近での処理には要注意です。
対策例
- サイトコレクションレベルで標準となるタイムゾーンを統一する
- 必要に応じて、Power AutomateのフローやカスタムコードでUTC基準に変換して管理する
リストの大規模化に備えた運用
SharePointリストが数万行、数十万行と大規模化すると、計算列のパフォーマンスが気になることがあります。特に列ごとに複雑な式を設定していると、リスト全体のパフォーマンスに影響を与える可能性があります。
- 列は必要最低限に:むやみに計算列を増やさない
- 計算を外部化:複雑なロジックはPower AutomateやAzure Functionsなどで実行する
- インデックス設定:大量データでも絞り込みやソートができるよう、列インデックスを適切に設定する
Power Automateとの組み合わせ
SharePointリストの計算列よりも柔軟な処理をしたいのであれば、Power Automateを活用する手があります。レコードの作成や更新時にフローをトリガーとして起動し、必要な計算を実行してSharePointリストの別列に保存するのです。
- メリット:Excelの関数ではできない複雑なロジックも可能。外部サービスのデータとも連携しやすい
- デメリット:フローの管理・メンテナンスが必要。実行回数やライセンスに制限がある場合もある
小規模であれば計算列だけで済ませ、大規模になったり拡張が必要になった時にPower Automateを視野に入れると、運用効率が高まるでしょう。
まとめと今後の運用ポイント
SharePointのリストで日付の差分を求めたいときに、エラーが出て頭を悩ませるケースは少なくありません。特にDATEDIFを使おうとして#Name?
エラーに遭遇する場合は、以下の点をチェックしてみてください。
- DATEDIF関数の代わりに日付の直接引き算を試す
- 例:
([Confirmed Shipping Date] - [Confirmed Start Date])
- 空欄チェックに半角スペース
" "
ではなく""
を用いる
- 例:
IF(OR([日付1]="", [日付2]=""), "0", … )
- ブラウザーのキャッシュをクリアする、またはシークレットウィンドウで再度試す
- 列名や内部名が間違っていないか再確認
- データ型を適切に設定する(数値として扱うか文字列として扱うか)
これらを順番に試してみると、大抵の場合はエラーを回避できるはずです。また、SharePointリストはExcelと完全に同じ機能を提供しているわけではありません。Excelでおなじみの関数が使用できない場合があるという点を、あらためて意識しておきましょう。
実際のプロジェクトでは、簡単な日付計算なら計算列で十分に対応できますが、処理が複雑になるようなら早めにPower Automateやカスタムソリューションを検討するのがおすすめです。
今後もSharePoint Onlineは進化を続け、さまざまな新機能や連携が登場してきます。自社の環境や運用方針に合わせて、柔軟に組み合わせて利用することで、業務効率を大幅に改善できるはずです。
最後に
SharePointリストでの日付差計算において、DATEDIFを避けて直接引き算を用いることは、実装やメンテナンスの手間を減らし、エラーを回避するうえでも有効な選択肢です。また、ブラウザーキャッシュのクリアやシークレットウィンドウによる動作確認は、思わぬ場面でトラブルを解消してくれます。
日々の業務でリスト運用のトラブルを減らし、生産性を向上させるために、ぜひ本記事でご紹介したポイントを押さえておいてください。
コメント