最終更新: 2026/06/22 18:56
データ整合性チェック — バリデーション
1. 概要
焦点質問: どのデータ不整合を検知し、どう通知するか?
背景・課題
20番台 (予算・計画) と 30番台 (サブ元帳) のデータ入力ミス・不整合を検知し、 後続の RPA 起票・仕訳エンジン・データマート作成でのエラーを未然に防止する。
実行方法
GAS メニュー「⚙️ メンテナンス」→「✅ データ整合性チェック」から手動実行。
2. 設計判断
| 選択肢 | メリット | デメリット | 選定 |
|---|---|---|---|
| マスタ事前読込(Set/Map) | 全行 O(1) 参照・API 最小 | マスタ全量メモリ保持 | 採用 |
| オンデマンド都度参照 | メモリ低 | 行数 × API・6 分制限抵触 | 不採用 |
| 配列一括処理 | API 最小(20-30 コール) | 2D 配列メモリ確保 | 採用 |
セル単位 getValue/setBackground | 実装が素朴 | API が桁違い・致命的遅さ | 不採用 |
マスタ事前読み込み一覧
検証前に以下のマスタを一括読み込みし、Object (Set 相当) に変換する:
| 変数名 | ソース | キー | フィルタ |
|---|---|---|---|
acctSet | 11_mst_account | 科目名 (入力用科目名) | 有効フラグ=TRUE のみ。現金・預金 はハードコード追加 |
ordSet | 31_wrk_order | 発注ID(ORD) | 有効フラグ=TRUE |
invSet | 32_wrk_invoice | 請求ID(INV) | 有効フラグ=TRUE |
invMeta | 32_wrk_invoice | 請求ID(INV) → { date, shushi, dueDate } | 有効フラグ=TRUE |
pjSet | 14_mst_project | プロジェクト名 | 有効フラグ=TRUE |
hcNameSet | 22_bud_headcount | 氏名・ポジション | 有効フラグ=TRUE |
API コール数
| 操作 | コール数 |
|---|---|
| データ読み込み | シート数 × 1 (getValues) |
| マスタ読み込み | マスタ数 × 1 |
| 背景色書き込み | シート数 × 1 (setBackgrounds) |
| メモ書き込み | シート数 × 1 (setNotes) |
| 合計 | 約 20〜30 コール (全シート合計) |
3. 変更内容
3.1 スキーマ (検証対象タブ)
| # | 対象タブ | 検証関数 | 参照マスタ |
|---|---|---|---|
| 1 | 21_bud_pipeline | validatePipeline_ | acctSet |
| 2 | 22_bud_headcount | validateHeadcount_ | acctSet |
| 3 | 23_bud_subscription | validateSubscription_ | acctSet |
| 4 | 24_bud_capex_loan | validateCapex_ | acctSet |
| 5 | 25_bud_finance | validateFinance_ | acctSet |
| 6 | 26_bud_adhoc | validateAdhoc_ | acctSet |
| 7 | 27_bud_resource | validateResource_ | pjSet, hcNameSet |
| 8 | 31_wrk_order | validateOrder_ | (なし) |
| 9 | 32_wrk_invoice | validateInvoice_ | acctSet, ordSet |
| 10 | 33_wrk_bank | validateBank_ | invSet, invMeta |
3.2 ロジック (検証項目マトリクス)
全シート共通の前提:
- 有効フラグ=FALSE の行はスキップ
- 列参照はヘッダー名ベース (
buildHeaderIndex_)。列が存在しない場合はチェックをスキップ - 各シートで管理ID列が空の場合は警告 (G01 相当)
3.2.1 21_bud_pipeline (パイプライン)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| P01 | 計上開始年月 | 必須。空欄NG | 致命的 |
| P02 | 確度(ヨミ) | 必須。空欄NG | 致命的 |
| P03 | 売上科目 | 必須。11_mst_account に存在すること | 致命的 |
| P04 | 契約形態+継続月額 | 契約形態が「継続」または「準委任」を含む場合、継続月額(MRR)が0はNG | 警告 |
| P05 | 契約形態+スポット売上 | 契約形態が「スポット」を含む場合、スポット売上・初期費用が0はNG | 警告 |
| P06 | 継続月数 | 契約形態が「継続」または「準委任」を含む場合、0はNG | 警告 |
3.2.2 22_bud_headcount (人件費)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| H01 | 開始年月 | 必須。空欄NG | 致命的 |
| H02 | 終了年月 | 空でなければ、開始年月 以降であること | エラー |
| H03 | 月額給与・報酬 | 0 はNG | エラー |
| H04 | 科目名 | 必須。11_mst_account に存在すること | 致命的 |
| H05 | 源泉消費税額 | 月額給与・報酬 を超えていないこと (月額>0の場合のみ) | エラー |
| H06 | 差引支給額 | マイナスはNG (税金・社保引きすぎ) | エラー |
3.2.3 23_bud_subscription (SaaS)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| S01 | 開始・契約年月 | 必須。空欄NG | 致命的 |
| S02 | 次回更新・終了年月 | 空でなければ、開始・契約年月 以降であること | エラー |
| S03 | 税抜金額_計画 | 0 はNG | エラー |
| S04 | 費用科目 | 必須。11_mst_account に存在すること | 致命的 |
| S05 | 未定放置 | 利用中で取引先名 or 決済手段に「未定」含 → NG | 警告 |
3.2.4 24_bud_capex_loan (設備投資・借入)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| C01 | 発生日(P/L計上日) | 必須。空欄NG | 致命的 |
| C02 | 借入金額 vs 取得価額 | 借入 > 取得価額 NG(取得価額>0 時) | 致命的 |
| C03 | 取得価額+資産科目 | 取得価額 > 0 なのに資産科目が空はNG | エラー |
| C04 | 資産科目 | 空でなければ、11_mst_account に存在すること | 致命的 |
| C05 | 借入金額+負債科目 | 借入金額 > 0 なのに負債科目が空はNG | エラー |
| C06 | 負債科目 | 空でなければ、11_mst_account に存在すること | 致命的 |
| C07 | 借入金額+返済 | 借入>0 で開始年月空 or 返済月数=0 → NG | エラー |
3.2.5 25_bud_finance (財務取引)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| F01 | 発生日(P/L計上日) | 必須。空欄NG | 致命的 |
| F02 | 金額 | 0 はNG | エラー |
| F03 | 科目名 | 必須。11_mst_account に存在すること | 致命的 |
3.2.6 26_bud_adhoc (単発予算)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| A01 | 発生日(P/L計上日) | 必須。空欄NG | 致命的 |
| A02 | 税込金額 | 0 はNG | エラー |
| A03 | 科目名 | 必須。11_mst_account に存在すること | 致命的 |
3.2.7 27_bud_resource (要員稼働率)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| R01 | 要員名 | 必須。空欄NG | 致命的 |
| R02 | 要員名 | 22_bud_headcount (氏名・ポジション) に存在すること | エラー |
| R03 | PJ・案件名 | 必須。空欄NG | 致命的 |
| R04 | PJ・案件名 | 14_mst_project (プロジェクト名) に存在すること | エラー |
| R05 | 対象年月 | 必須。空欄または parseDateToYm 解析不能はNG | 致命的 |
| R06 | 稼働率(%) | 数値でなければNG (例: "5%")。0〜1の小数で入力 | 致命的 |
| R07 | 稼働率(%) | 0以下はNG | エラー |
| R08 | 稼働率(%) | 1(100%)超えはNG | エラー |
3.2.8 31_wrk_order (発注台帳)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| O01 | 発注残高(自動計算) | マイナスはNG (INV過剰紐付け) | 警告 |
| O02 | 取引先名 | 空欄NG | エラー |
3.2.9 32_wrk_invoice (請求台帳)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| I01 | 発生日(P/L計上日) | ステータスが「承認済」「決済完了」「部分決済」のとき必須 | 致命的 |
| I02 | 親発注ID(ORD) | 空でなければ、31_wrk_order に存在すること | エラー |
| I03 | 請求額計算 | 税抜+消費税 ≠ 税込(差額 2 円超で警告) | 警告 |
| I04 | 税込金額_計画 | 0 はNG | エラー |
| I05 | 科目名 | 必須。11_mst_account に存在すること | 致命的 |
| I06 | 未決済残高(自動計算) | マイナスはNG (消込やりすぎ) | エラー |
3.2.10 33_wrk_bank (入出金台帳)
| # | 対象列 | チェック内容 | 重要度 |
|---|---|---|---|
| B01 | 決済日_実績+ステータス | 決済ステータス=「消込済」なのに決済日が空 | 致命的 |
| B02 | 消込対象請求ID(INV) | 空でなければ、32_wrk_invoice に存在すること | エラー |
| B03 | 決済日_実績 vs 今日 | 決済日が未来日 | 警告 |
| B04 | 決済日 vs INV 発生日 | 決済日 < 発生日 NG(前払い/収入 INV 除く) | 警告 |
| B05 | 税込金額_決済 | 0 はNG | エラー |
3.3 UI (エラー通知 UX)
| 要素 | 仕様 |
|---|---|
| エラーセル背景色 | 重要度に応じた3色 (付録B参照) |
| エラーセルメモ | エラー理由をセルノートに記載。接頭辞 [VAL] (例: [VAL] 科目名がマスタに存在しません) |
| 正常化時 | 背景色・メモを自動クリア (エラー色のみクリアし、既存の背景色は保持) |
| 結果通知 | ダイアログでシート別エラー件数を表示 |
エラーセルの背景色とメモは、チェック実行時に全対象のエラー色 (
[VAL]メモ) を一括クリア→検証→エラーのみ再設定。 既存の整合性チェック (checkInvStlConsistency) と同じパターン。
4. 影響範囲
| 影響対象 | 影響内容 | 対応 |
|---|---|---|
201_data_validator.js | バリデーション実行エンジン本体 | 新規作成 |
101_sys_config.js | メニューに「✅ データ整合性チェック」を追加 | メニュー登録 |
| 20番台・30番台の全対象シート | エラーセルに背景色・メモが書き込まれる | 既存の背景色は保持 (エラー色のみ上書き) |
5. テスト仕様
| テストID | テスト名 | 前提条件 | 期待結果 |
|---|---|---|---|
| VAL-01 | 必須項目未入力検知 | 22タブの開始年月を空にする | 赤背景 + メモ「[VAL] 開始年月が未入力です」 |
| VAL-02 | マスタ不存在検知 | 23タブの費用科目をマスタにない値に変更 | 赤背景 + メモに「致命的」相当の内容 |
| VAL-03 | INV 発生日必須(連動) | 32 タブ承認済 INV の発生日を空にする | 赤背景 + 「承認済だが発生日未入力」メモ |
| VAL-04 | STL決済日必須 (消込済連動) | 33タブの消込済STLの決済日を空にする | 赤背景 + メモ「致命的」相当の内容 |
| VAL-05 | エラー修正後クリア | エラーを修正してから再実行 | 背景色とメモがクリアされる |
| VAL-06 | 全シートエラーなし | 全シートに問題がない状態で実行 | ダイアログ「全シートの整合性に問題はありません」 |
| VAL-07 | パフォーマンス | 全シート対象で実行 | 全シート合計30秒以内に完了 |
付録
付録A: 改修ファイル一覧
| ファイル | 役割 |
|---|---|
201_data_validator.js | バリデーション実行エンジン本体 |
101_sys_config.js | メニュー登録 |
関数構成 (201_data_validator.js)
| 関数名 | 用途 |
|---|---|
runDataValidation() | メインエントリ。マスタ読み込み → シート別検証 → 結果ダイアログ |
validatePipeline_(data, idx, acctSet, bg, notes) | 21_bud_pipeline 検証 |
validateHeadcount_(data, idx, acctSet, bg, notes) | 22_bud_headcount 検証 |
validateSubscription_(data, idx, acctSet, bg, notes) | 23_bud_subscription 検証 |
validateCapex_(data, idx, acctSet, bg, notes) | 24_bud_capex_loan 検証 |
validateFinance_(data, idx, acctSet, bg, notes) | 25_bud_finance 検証 |
validateAdhoc_(data, idx, acctSet, bg, notes) | 26_bud_adhoc 検証 |
validateResource_(data, idx, pjSet, hcNameSet, bg, notes) | 27_bud_resource 検証 |
validateOrder_(data, idx, acctSet, bg, notes) | 31_wrk_order 検証 |
validateInvoice_(data, idx, acctSet, ordSet, bg, notes) | 32_wrk_invoice 検証 |
validateBank_(data, idx, invSet, invMeta, bg, notes) | 33_wrk_bank 検証 |
applyValidationResults_(sheet, rowCount, colCount, bg, notes) | 一括適用 (エラー色クリア+再設定) |
loadValidAccountNames_() | 科目マスタ Set 読み込み |
loadIdSet_(ss, key, fb, headerName) | 汎用 ID Set 読み込み |
loadInvMeta_(ss) | INV メタ情報 Map 読み込み |
loadValidPjNames_(ss) | PJ マスタ Set 読み込み |
loadHcNameSet_(ss) | 人件費氏名 Set 読み込み |
setErr_(bg, notes, r, c, level, msg) | エラー登録ヘルパー |
isActiveRow_(data, r, idx) | 有効フラグ判定 |
parseAmt_(val) | 金額パース |
付録B: エラーメッセージ接頭辞一覧
| 接頭辞 | 重要度 | 背景色 | 意味 |
|---|---|---|---|
[致命的] | CRITICAL | #EA9999 (赤) | RPA/仕訳が動かない |
[エラー] | ERROR | #F4CCCC (薄赤) | 計算結果がおかしくなる |
[警告] | WARNING | #FCE5CD (薄オレンジ) | 運用上の問題 |
実装上のメモ接頭辞は
[VAL]固定。上記の[致命的]等はユーザー向けの分類名であり、実際のセルメモには具体的なエラーメッセージが[VAL] ...の形式で記載される。