1. 概要

焦点質問: CC明細から33タブへの自動消込はどう動作するか?

背景・課題

JCBゴールド法人カードの利用明細を 34_wrk_card タブに貼り付け、GAS メニューから実行することで、 33_wrk_bank (STL) のレコードと自動マッチングし、確認後に消込済にする。

2段階処理フロー(マトリクス)

項番処理フェーズ入力(論理名)入力(物理名: タブ.列)処理詳細 / 変換ロジック出力(論理名)出力(物理名: タブ.列)例外処理
S1.1Step 1: マッチング確認カード明細 × クレカSTL34_wrk_card × 33_wrk_bankimportCcStatement() — 日付+金額±20%+名前一致でマッチング。結果を34タブに表示(消込しない)処理結果, STL情報34_wrk_card.O〜T列SKIP:取消, SKIP:金額なし
S1.2ユーザー確認34_wrk_cardMATCHED行: 確認FLG=TRUE。UNMATCHED行: 手動でSTL_ID入力 or データ修正→再実行確認FLG34_wrk_card.N列
S2.1Step 2: 消込実行確認FLG=TRUE行34_wrk_card.N列applyCcSettlement() — 確認FLG=TRUE かつ STL_IDがSTL_始まりの行のみ処理⚠️ STL_IDがSTL_で始まらない→スキップ
S2.233タブ更新マッチSTL情報34_wrk_card.P列決済ステータス→消込済, 決済日=card支払年月日, 消込手段="カード明細", 金額補正(差額記録)ステータス, 決済日, 消込手段33_wrk_bank.G,F,P列
S2.334タブ更新処理結果→消込済, 背景色=#D9EAD3(薄緑)処理結果34_wrk_card.O列
S3.1Step 3: Action B通常のAction Bで仕訳生成 → 33タブの緑ハイライトクリア42_trn_journal, 33_wrk_bank

2. 設計判断

#選択肢メリットデメリット選定
1辞書ファジー vs 完全一致表記揺れに高精度マッチ辞書の手動メンテ・初回 UNMATCHED辞書採用(誤マッチ防止に範囲限定)
2±20% 許容幅 vs 完全一致手数料・為替差で差異吸収別取引の誤マッチリスク±20% 採用(差額は手数料列に記録)
32 段階(確認→消込)vs 自動目視確認で誤マッチ修正可2 回操作必要2 段階(確認 FLG で承認)
4お支払い金額優先 vs ご利用金額実際の決済額でマッチ精度高差分が見えにくいお支払い優先(0/空時のみフォールバック)

§1 詳細: カード明細の利用先名は STL 取引先名と表記揺れが大きい(例: "CLAUDE.AI" vs "Anthropic, PBC")。辞書で正規取引先名に変換し、特定できた場合はその取引先の STL のみにマッチ対象を限定(誤マッチ "CLAUDE.AI → Google STL" 等を防止)。


3. 変更内容

3.1 スキーマ

34_wrk_card タブレイアウト

元データ (JCB明細 A〜M列)

A: 支払年月日 | B: ご利用者 | C: カテゴリ | D: ご利用日 | E: ご利用先など |
F: ご利用金額(¥) | G: 決済区分 | H: 今回回数 | I: 訂正サイン |
J: お支払い金額(¥) | K: 国内/海外 | L: 摘要 | M: 備考

GAS管理列 (N〜T列)

ヘッダー内容
N確認FLGチェックボックス。TRUE で消込実行対象
O処理結果MATCHED / UNMATCHED / 消込済 / SKIP:取消 / SKIP:金額なし
Pマッチ決済ID(STL)マッチした STL_ID (ユーザー手動変更可)
QSTL決済日_計画マッチSTLの決済日_計画
RSTL税込金額_決済マッチSTLの税込金額_決済
SSTL取引先名マッチSTLの取引先名
TSTL摘要マッチSTLの摘要

GAS管理列が存在しない場合、ensureMatchCols_() がヘッダー行末尾に自動作成する(card / receipt 共通の MATCH_EXTRA_HEADERS 定義)。

33_wrk_bank「消込手段」列

意味セットされるタイミング
(空)未消込STL 新規作成時
手動ユーザーが手動でステータスを変更Action B 実行時に消込手段が空なら自動セット
カード明細クレカ明細からの自動マッチングクレカ消込実行時 (既に消込済の STL にも常にセット)
帳票領収書/請求書からのマッチング領収書消込実行時

3.2 ロジック

3.2.1 マッチング対象STL

33_wrk_bank の以下 3条件すべてを満たす STL 行:

  1. 有効フラグ = TRUE
  2. 決済口座が "クレカ" を含む (例: "クレカ_福井銀行")
  3. 決済ステータス = "未処理" または (消込済 かつ 消込手段が空)

3.2.2 マッチ成立条件 (全て AND)

  1. 日付一致: card.支払年月日 = STL.決済日_計画 (完全一致)
  2. 金額一致: card.お支払い金額 or card.ご利用金額 が STL.税込金額_決済 の ±20%以内
  3. 名前やや一致: 以下のいずれかを満たす
    • 名寄せ辞書 (Constants.CC_MERCHANT_MAP) で推定した取引先名が STL 取引先名と一致
    • STL 取引先名が card.ご利用先 に直接含まれる (正規化後、3文字以上)
    • STL 摘要が card.ご利用先 に直接含まれる (正規化後、4文字以上)
    • トークン分割での部分一致 (2文字以上)

3.2.3 辞書マッチの厳格化

名寄せ辞書で取引先が特定できた場合、その取引先のSTLのみ マッチ対象とする。 これにより CLAUDE.AI が Google の STL にマッチする等の誤マッチを防止。

3.2.4 複数候補時の優先度

金額差が最小の STL を優先。

3.2.5 金額補正

単一行マッチ

card の お支払い金額 で STL の 税込金額_決済 を上書き。差額を 差額(手数料等) に記録。

複数行合算マッチ

同じ STL_ID を複数の card 行に手動入力した場合、お支払い金額 を合算して消込。

3.2.6 アンマッチ時の候補提案

マッチ不成立の card 行には、全未処理STL (決済口座問わず) から最も近い候補を提案。 候補スコア: 日付一致(50) + 名前一致(30) + 金額近接(20) の合計で最高スコアの STL を表示。 候補提案時はSTL_IDに 候補: プレフィックスを付与し、取引先名に決済口座名を付記する。

3.2.7 スキップ条件

マッチング確認 (importCcStatement)

条件結果
確認FLG = TRUEスキップ (確認済み行は一切触らない)
処理結果 = 消込済 or SKIP:*スキップ
訂正サイン = 取消SKIP:取消
お支払い金額 = 0 or 空 (かつ ご利用金額も 0 or 空)SKIP:金額なし

消込実行 (applyCcSettlement)

条件結果
処理結果 = 消込済スキップ (二重消込防止)
確認FLG ≠ TRUEスキップ
マッチ決済ID(STL) が STL_ で始まらないスキップ

3.2.8 消込実行の処理詳細

applyCcSettlement() は以下の2パスで処理する:

パス処理詳細
Pass 1card行の集約同一STL_IDに紐づくcard行の お支払い金額 を合算し、stlCardMap に集約
Pass 2STL_ID単位で消込消込手段を常に カード明細 にセット。未処理STLのみステータス・決済日を更新。金額差があればSTL金額を上書きし差額を記録

3.2.9 正規化ロジック

normalizeMerchant_() は以下の変換を行う:

  • 全角英数 → 半角英数
  • 全角スペース → 半角スペース
  • 全角記号 (-, *, _) → 半角
  • 小文字化 + トリム

トークン分割時は会社種別名 (株式会社, 有限会社, 合同会社, pte, ltd, inc, llc, co, jp) を除外し、2文字以上のトークンのみ使用する。

3.3 UI

ハイライト仕様

タイミング対象背景色
マッチング確認card MATCHED行#FFFFFF (白)
マッチング確認card UNMATCHED行#FCE5CD (薄オレンジ)
消込実行33タブ STL行#D9EAD3 (薄緑)
消込実行card 行#D9EAD3 (薄緑)
Action B 実行後33タブ STL行null (クリア)

メニュー

🔍 消込・マッチング
  ├─ 💳 クレカ明細マッチング確認
  ├─ 💳 クレカ消込実行 (確認FLG=TRUE)
  ├─ ───
  ├─ 📄 領収書PDFの読み込み (Drive)
  ├─ 🧾 領収書マッチング確認
  └─ 🧾 領収書消込実行 (確認FLG=TRUE)

結果ダイアログ

マッチング確認・消込実行の完了時にダイアログで結果サマリーを表示:

関数表示項目
importCcStatementマッチ件数、金額差あり件数、アンマッチ件数、スキップ件数
applyCcSettlement消込件数、金額補正件数。対象なしの場合は警告ダイアログ

4. 影響範囲

影響対象影響内容対応
501_cc_importer.jsクレカ消込 + 領収書消込 + 共通マッチ列管理の主要ロジック主実装ファイル
002_constants.jsCC_MERCHANT_MAP 名寄せ辞書の定義新規取引先追加時に更新
101_sys_config.jsメニュー「🔍 消込・マッチング」+ 33タブスキーマ(消込手段・立替日)メニュー構成変更時に更新
403_subledger_engine.jsSTL作成時の列対応 + Action B でハイライトクリア・消込手段自動セット消込済STLのAction B処理
502_receipt_reader.js領収書PDF読み込み (Gemini API)関連機能
34_wrk_card タブN〜T列のGAS管理列を使用ensureMatchCols_ で自動作成
33_wrk_bank タブ決済ステータス・決済日・消込手段・税込金額・差額列を更新消込実行時に書き込み

5. テスト仕様

テストIDテスト名前提条件期待結果
CC-T01正常マッチ (辞書一致)card明細に "CLAUDE.AI" あり。33タブに Anthropic, PBC のクレカ未処理STLあり。日付一致・金額±20%以内処理結果=MATCHED、STL_ID・取引先名等が正しく表示される
CC-T02正常マッチ (名前部分一致)card明細のご利用先にSTL取引先名が3文字以上含まれる処理結果=MATCHED
CC-T03辞書マッチ厳格化card "CLAUDE.AI" → 辞書で Anthropic 特定。33タブに Google のクレカSTLもあるAnthropic STLのみマッチ。Google STLにはマッチしない
CC-T04金額±20%超過card金額とSTL金額の差が20%超処理結果=UNMATCHED
CC-T05金額補正card お支払い金額 ≠ STL税込金額_決済(20%以内)消込実行後、STL金額がcard金額で上書きされ、差額(手数料等)に差額が記録される
CC-T06複数行合算マッチ同一STL_IDを2つのcard行に手動設定消込実行時にお支払い金額を合算してSTL金額を更新
CC-T07アンマッチ候補提案マッチ不成立。全未処理STLに近い候補あり処理結果=UNMATCHED。STL_IDに 候補:STL_xxx が表示。取引先名に決済口座名が付記される
CC-T08SKIP:取消card明細の訂正サイン = "取消"処理結果=SKIP:取消、マッチング処理をスキップ
CC-T09SKIP:金額なしcard のお支払い金額・ご利用金額がともに0または空処理結果=SKIP:金額なし
CC-T10確認FLG=TRUEスキップ既にマッチング確認済み(確認FLG=TRUE)の行に再実行当該行はスキップされ、内容が変更されない
CC-T11二重消込防止処理結果=消込済の行に消込実行スキップされる
CC-T12STL_ID不正マッチ決済ID(STL) が "STL_" で始まらない消込実行時にスキップ
CC-T13消込済+消込手段空のSTL再マッチ33タブに消込済だが消込手段が空のSTLありマッチング対象に含まれる。消込実行時に消込手段=カード明細がセットされる
CC-T14ハイライト確認マッチング確認実行後MATCHED行=白、UNMATCHED行=薄オレンジ。消込実行後=薄緑
CC-T15お支払い金額フォールバックcard のお支払い金額が0だがご利用金額に値ありご利用金額でマッチング処理が行われる

付録

付録A: 改修ファイル

ファイル内容
501_cc_importer.jsクレカ消込 + 領収書消込 + 共通マッチ列管理
502_receipt_reader.js領収書PDF読み込み (Gemini API)
002_constants.jsCC_MERCHANT_MAP 名寄せ辞書
101_sys_config.jsメニュー「🔍 消込・マッチング」+ 33タブスキーマ(消込手段・立替日)
403_subledger_engine.jsSTL作成時の列対応 + Action B でハイライトクリア・消込手段自動セット

付録B: 名寄せ辞書 (Constants.CC_MERCHANT_MAP)

Constants.CC_MERCHANT_MAP = [
  { keywords: ['microsoft', 'マイクロソフト', 'マイクロソフト', 'microsoft'], vendor: '日本マイクロソフト株式会社' },
  { keywords: ['google', 'workspace'], vendor: 'Google Asia Pacific Pte. Ltd.' },
  { keywords: ['ヌーラボ', 'nulab', 'nlab'], vendor: 'NLAB_株式会社ヌーラボ' },
  { keywords: ['pollo', 'cocosoft'], vendor: 'COCOSOFT TECHNOLOGY PTE. LTD.' },
  { keywords: ['claude', 'anthropic'], vendor: 'Anthropic, PBC' },
  { keywords: ['adobe', 'acrobat'], vendor: 'Adobe KK' },
  { keywords: ['zoom'], vendor: 'Zoom Communications, Inc.' },
  { keywords: ['amazon', 'アマゾン'], vendor: 'Amazon_Services_International_LLC' },
  { keywords: ['弁護士ドットコム', 'クラウドサイン', 'cloudsign'], vendor: '弁護士ドットコム株式会社' },
  { keywords: ['big5', 'ビッグファイブ'], vendor: '【BIG5-BASIC】運営事務局' },
  { keywords: ['freenance', 'フリーナンス'], vendor: 'フリー株式会社' },
  { keywords: ['福井カード'], vendor: '株式会社福井カード' },
];