SharePoint 列書式設定(JSON)で列A+列Bを列Cに反映する方法|表示と保存の使い分け

SharePoint リストで「列Aと列Bを足した結果を列Cに入れたい」と考えたとき、まず迷うのが列書式設定(JSON)でできる範囲です。本記事では“表示だけ”と“値として保存”の違いを整理し、目的別に最短の実装手順とサンプルをまとめます。

目次

まず押さえるべき結論:列書式設定(JSON)は“見た目”を変える機能

SharePoint の列書式設定(Column formatting)は、リストやライブラリのビュー上での表示をカスタマイズするための仕組みです。ここが一番大事なポイントで、列書式設定の JSON では列の値そのものを保存・更新することはできません。

そのため、「列Cに A+B(または A−B)を統合したい」という要望は、次の2パターンに分けて考えると迷いません。

目的やりたいこと向いている方法
表示だけビューで列Cに合計・差分を見せたい列書式設定(JSON)
保存したい列Cを“実データ”として後続の計算・検索・フローで使いたい計算列(Calculated Column)または Power Automate

以降では、まず「表示だけならどう書くか」、次に「保存が必要ならどう設計するか」を、実務でハマりやすい点も含めて具体的に解説します。

表示だけでよい場合:列書式設定(JSON)で A+B / A−B を表示する

列Cに列書式設定を設定し、列A・列Bを参照して計算結果を表示できます。ここでの「列C」は、数値列でもテキスト列でも構いません(ただし見た目が変わるだけで、保存される値は変わらない点は同じです)。

最小構成:合計をそのまま表示する

列A・列Bが数値列で、空欄が入らない前提なら、最小構成はこれで十分です。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "div",
  "txtContent": "=Number([$ColumnA]) + Number([$ColumnB])"
}

ポイントは次のとおりです。

  • ColumnA / ColumnB は列の内部名に置き換えます(後述)。
  • 差分(A−B)にしたい場合は、+ を - に変えるだけです。
  • 列A・列Bが「数値」列なら Number() は省略できますが、テキスト列が混ざる可能性があるなら変換しておくと安全です。

空欄に強い構成:未入力なら空欄、入力済みなら計算

実運用では「片方だけ未入力」がよく起きます。未入力を 0 とみなすか、計算結果自体を空欄にするかは業務要件次第ですが、ここでは“未入力なら空欄”の例を示します。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "span",
  "txtContent": "=if([$ColumnA] == '' || [$ColumnB] == '', '', toString(Number([$ColumnA]) + Number([$ColumnB])))"
}

この書き方にしておくと、未入力時に NaN のような表示になりにくく、利用者が混乱しません。

差分を見せたい:マイナスは赤、プラスは緑などの視覚化

列書式設定の強みは、計算結果をその場で“見やすく”できることです。例えば差分(A−B)を表示し、マイナスなら赤、プラスなら緑で強調できます。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "span",
  "style": {
    "font-weight": "bold",
    "color": "=if(Number([$ColumnA]) - Number([$ColumnB]) < 0, '#d13438', '#107c10')"
  },
  "txtContent": "=toString(Number([$ColumnA]) - Number([$ColumnB]))"
}

業務でよくある「在庫差分」「予算差分」「工数の超過」などは、マイナスを赤にするだけでも一気に見落としが減ります。

通貨・桁区切りを付けて読みやすくする

合計が大きくなる運用(請求、見積、購買)では、桁区切りや単位があるだけで現場のストレスが大きく変わります。例えば“円”表記にしたいなら次のようにします。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "span",
  "txtContent": "=if([$ColumnA] == '' || [$ColumnB] == '', '', '¥' + toLocaleString(Number([$ColumnA]) + Number([$ColumnB])))"
}

表示目的だけなら、こうした「現場が見てすぐ分かる」工夫を JSON で小さく積み重ねるのが効果的です。

列の内部名(Internal Name)を確認する方法

列書式設定の JSON では、列を参照するときに内部名が必要です。見た目の列名を変更していると、内部名と表示名が一致しないことがあります。内部名の確認は次の方法が確実です。

手順:列設定ページの URL を見る

  1. 対象のリストを開き、右上の歯車(設定)からリストの設定へ移動します。
  2. 列から対象の列(列A/列B)をクリックします。
  3. ブラウザの URL に Field= のようなパラメータが含まれる場合、その値が内部名です(環境により表示のされ方は異なります)。

運用現場では、列名を後から何度も変えることが珍しくありません。列書式設定のトラブルの多くは「内部名の指定ミス」なので、最初にここを押さえるだけで修正が一気に楽になります。

保存が必要な場合:なぜ列書式設定だけでは足りないのか

列書式設定で合計・差分を表示できると、「これで列Cに保存もできたはず」と勘違いしがちです。しかし JSON で変えたのはビューの見た目だけなので、次のような場面で困ります。

  • 検索やフィルタ、並べ替えを「計算後の値」でやりたい(表示だけだと計算結果でソートできません)。
  • Power Automate や Power BI などで列Cの値として参照したい(取得できるのは元の列Cの値です)。
  • Excel にエクスポートした際に計算結果も一緒に出したい(書式設定はエクスポートに反映されません)。
  • 監査や履歴の観点で計算結果を確定値として残したい(表示は常に最新計算なので、過去の確定値にはなりません)。

これらの要件が1つでもあるなら、列Cを「計算列」または「Power Automate による書き込み」で“保存する設計”に切り替えるのが安全です。

方法の比較:JSON / 計算列 / Power Automate

要件が混ざると判断がブレるため、まずは特徴を表で整理します。

方法列Cに保存される?計算の自由度運用コスト向いているケース
列書式設定(JSON)保存されない(表示のみ)中(表示ロジック中心)低ビューで合計・差分を見せたい/強調表示したい
計算列(Calculated Column)実質的に計算結果を列として扱える中(関数・参照に制約あり)低〜中単純な加減算を“列として”使いたい/並べ替えやフィルタに使いたい
Power Automate保存できる(書き込み)高(条件分岐・外部連携も可)中〜高複雑なロジック/例外処理/確定値として残したい/後続フローで利用したい

迷ったときの目安は、「合計・差分をソート/集計/連携に使うなら保存」「人が見るだけなら JSON」です。

方法1:計算列(Calculated Column)で A+B / A−B を作る

加減算が主目的で、かつ SharePoint 標準の範囲で完結させたいなら、計算列が最短ルートです。計算列は“列として”扱えるため、ビューの並べ替えやフィルタ、集計にも使いやすくなります。

設定手順(概要)

  1. リストの設定を開き、列の作成を選択します。
  2. 列名を「列C(合計)」など分かりやすい名前にします。
  3. 種類で計算(他の列に基づく計算)を選択します。
  4. 数式に =[列A]+[列B](差分なら -)を入力します。
  5. 返すデータ型は、用途に合わせて「数値」や「通貨」などを選択します。

空欄があるときの扱いを決める

計算列でも、未入力時の扱いを決めておくと運用が安定します。未入力なら空欄にしたい場合は、例えば次のような考え方になります。

=IF(OR(ISBLANK([列A]),ISBLANK([列B])),"",[列A]+[列B])

「未入力は 0 とみなして足す」運用なら、式はもっとシンプルにできます。現場の入力ルールに合わせて、曖昧さが残らない式にするのがコツです。

計算列を選ぶときの注意点

  • 参照できる列の種類や関数に制約があります。単純な加減算には強い一方、例外だらけのロジックには不向きです。
  • 「確定値として固定したい」用途には向きません。計算列は元の列A/列Bが変われば結果も変わります(過去の確定値を残す要件なら Power Automate が向きます)。
  • 列A/列Bがテキスト列だと、意図しない結果になりやすいです。できるだけ数値列として設計するのが安全です。

方法2:Power Automate で列Cに計算結果を書き込む

「列Cに保存して、後続のフローや集計で使いたい」「例外処理や条件分岐が多い」「他のリストや外部データも絡む」といった要件では、Power Automate で“作成/更新時に列Cへ書き込む”のが現実的です。

事前準備:列の型を揃える

フローで計算しやすいように、列A・列B・列Cは基本的に数値(Number)で揃えるのがおすすめです。列A/列Bがテキストだと、変換ミスで計算が止まる原因になります。

最小構成のフロー(合計を保存)

  1. Power Automate で新しいクラウド フローを作成します。
  2. トリガーをSharePoint:項目が作成または変更されたときにします。
  3. アクションに作成(Compose)を追加し、合計を計算します。
  4. アクションに項目の更新(Update item)を追加し、列Cへ書き込みます。

Compose の式例(空欄は 0 扱い、整数として計算):

add(
  coalesce(int(triggerOutputs()?['body/ColumnA']), 0),
  coalesce(int(triggerOutputs()?['body/ColumnB']), 0)
)

差分(A−B)の式例:

sub(
  coalesce(int(triggerOutputs()?['body/ColumnA']), 0),
  coalesce(int(triggerOutputs()?['body/ColumnB']), 0)
)

Update item では、列Cに上記 Compose の出力を設定します。これで列Cに計算結果が保存され、検索・ソート・集計・連携に使えるようになります。

“更新ループ”を避ける設計(実務で必須)

同じリストの項目を Update item で更新すると、トリガーが再度発火し、フローがループすることがあります。簡単な検証では気づきにくいので、最初から対策を入れておくのが安全です。

代表的な対策は次の3つです。

対策概要おすすめ度
変更検知(Get changes)列A/列Bが変わったときだけ計算・更新する高(堅実)
トリガー条件列Cの更新だけでは動かない条件を設定する中(設定ミスに注意)
フラグ列「計算済み」などの列で制御する中(列が増える)

特におすすめなのは「変更検知」です。フロー内で列Aまたは列Bが変更されたときだけ計算し、列Cだけが変更された再実行は即終了させます。これにより、列Cを書き込んだ自分自身の更新でループする問題を現実的に抑えられます。

運用に強い設計例:入力途中は空欄、確定時だけ計算して保存

現場では「入力途中の項目を勝手に更新されたくない」「確定ボタン(ステータス変更)で初めて金額を確定したい」といった要件も出ます。その場合は、列A/列Bに加えて、例えば「ステータス」列(下書き/確定)を作り、確定になったタイミングで列Cへ書き込む設計にすると運用がブレません。

  • ステータスが「下書き」:列Cは空欄(もしくは 0)
  • ステータスが「確定」:列Cに A+B を保存し、以後は編集を制限する(権限やルールで担保)

このように、Power Automate は“保存できる”だけでなく、業務フローに合わせた確定タイミングまで設計できるのが強みです。

現場でよくある設計パターン:列Cを二段構えにする

要件が「見やすさ」も「保存」も両方ある場合は、列Cを二段構えにするとトラブルが減ります。

列役割実装
列C(保存用)後続の集計・連携に使う“実データ”計算列 または Power Automate で書き込み
列C(表示用)利用者が一目で分かる表現(色、単位、アイコンなど)列書式設定(JSON)

つまり、データとして正しい値は保存用列に持ち、表示用列で見た目を最適化する形です。最初は列が増えるデメリットがありますが、運用が大きくなったときの保守性は圧倒的に上がります。

トラブルシューティング:列書式設定でよく起きる症状と対処

NaN(Not a Number)が表示される

  • 原因:列A/列Bが空欄、またはテキストで数字以外が入っている
  • 対処:if で空欄を弾く、数値列で設計する、Number() で明示変換する

JSON を入れたのに列A/列Bを参照できない

  • 原因:列名ではなく内部名が必要なのに、表示名を書いている
  • 対処:列設定ページの URL などで内部名を確認し、[$InternalName] に置き換える

列Cでソートしたいのに順番が合わない

  • 原因:列書式設定は見た目だけで、ソートは元の列Cの値で行われる
  • 対処:ソートしたいなら、計算列や Power Automate で列Cに保存する設計へ切り替える

Excel へ出したら計算結果が出ない

  • 原因:列書式設定はビュー上の表示に限定され、エクスポート対象は列の実データ
  • 対処:エクスポートでも必要なら、計算列/Power Automate で値を持つ

よくある質問

列書式設定(JSON)だけで“列Cに書き込む”ことは本当にできない?

できません。列書式設定はあくまで表示のカスタマイズで、保存される値の更新は行いません。「列として保持したい」要件があるなら、計算列か Power Automate のどちらかに寄せるのが安全です。

計算列と Power Automate、どちらを選ぶべき?

加減算が中心で、SharePoint 標準の範囲で完結できるなら計算列がシンプルです。条件分岐が多い、確定値として残したい、外部データや承認など業務フローに組み込みたい場合は Power Automate が向いています。

列A/列Bが文字列(テキスト)列でも計算できる?

表示だけなら JSON で Number() 変換して計算できることがありますが、入力ブレがあると壊れやすいです。保存する前提なら、列A/列Bは数値列へ作り直すか、Power Automate 側で厳密に変換・バリデーションする設計を推奨します。

差分がマイナスになったら警告アイコンを出したい

列書式設定(JSON)なら、差分の条件でアイコンや背景色を出せます。運用上の“見落とし防止”には特に効果が高いので、保存と表示を分けた二段構えにすると堅いです。

Power Automate の計算結果を入力者が上書きできないようにしたい

列Cを読み取り専用に見せるだけならフォームのカスタムなど選択肢はありますが、確実なのは権限やルールで編集を制限することです。例えば「確定後は編集できない」運用にし、フローと合わせて設計するとトラブルが減ります。

まとめ:目的が“表示”か“保存”かで最短ルートが変わる

SharePoint の列書式設定(JSON)で、列Aと列Bの合計・差分を列Cに表示することはできます。一方で、列Cの値として保存したいなら、計算列(Calculated Column)か Power Automate を使うのが現実的です。

まずは「後続の処理で列Cを使うか」「ソート・集計・エクスポートが必要か」を基準に判断し、必要なら保存用の列を用意して、表示は JSON で見やすく整える――この考え方で設計すると、後から要件が増えても崩れにくいリストになります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次