クレジットカード明細インポート — 34_wrk_card
1. 概要
焦点質問: CC明細から33タブへの自動消込はどう動作するか?
背景・課題
JCBゴールド法人カードの利用明細を 34_wrk_card タブに貼り付け、GAS メニューから実行することで、 33_wrk_bank (STL) のレコードと自動マッチングし、確認後に消込済にする。
2段階処理フロー(マトリクス)
| 項番 | 処理フェーズ | 入力(論理名) | 入力(物理名: タブ.列) | 処理詳細 / 変換ロジック | 出力(論理名) | 出力(物理名: タブ.列) | 例外処理 |
|---|---|---|---|---|---|---|---|
| S1.1 | Step 1: マッチング確認 | カード明細 × クレカSTL | 34_wrk_card × 33_wrk_bank | importCcStatement() — 日付+金額±20%+名前一致でマッチング。結果を34タブに表示(消込しない) | 処理結果, STL情報 | 34_wrk_card.O〜T列 | SKIP:取消, SKIP:金額なし |
| S1.2 | ユーザー確認 | — | 34_wrk_card | MATCHED行: 確認FLG=TRUE。UNMATCHED行: 手動でSTL_ID入力 or データ修正→再実行 | 確認FLG | 34_wrk_card.N列 | — |
| S2.1 | Step 2: 消込実行 | 確認FLG=TRUE行 | 34_wrk_card.N列 | applyCcSettlement() — 確認FLG=TRUE かつ STL_IDがSTL_始まりの行のみ処理 | — | — | ⚠️ STL_IDがSTL_で始まらない→スキップ |
| S2.2 | 33タブ更新 | マッチSTL情報 | 34_wrk_card.P列 | 決済ステータス→消込済, 決済日=card支払年月日, 消込手段="カード明細", 金額補正(差額記録) | ステータス, 決済日, 消込手段 | 33_wrk_bank.G,F,P列 | — |
| S2.3 | 34タブ更新 | — | — | 処理結果→消込済, 背景色=#D9EAD3(薄緑) | 処理結果 | 34_wrk_card.O列 | — |
| S3.1 | Step 3: Action B | — | — | 通常のAction Bで仕訳生成 → 33タブの緑ハイライトクリア | — | 42_trn_journal, 33_wrk_bank | — |
2. 設計判断
| # | 選択肢 | メリット | デメリット | 選定 |
|---|---|---|---|---|
| 1 | 辞書ファジー vs 完全一致 | 表記揺れに高精度マッチ | 辞書の手動メンテ・初回 UNMATCHED | 辞書採用(誤マッチ防止に範囲限定) |
| 2 | ±20% 許容幅 vs 完全一致 | 手数料・為替差で差異吸収 | 別取引の誤マッチリスク | ±20% 採用(差額は手数料列に記録) |
| 3 | 2 段階(確認→消込)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 (ユーザー手動変更可) |
| Q | STL決済日_計画 | マッチSTLの決済日_計画 |
| R | STL税込金額_決済 | マッチSTLの税込金額_決済 |
| S | STL取引先名 | マッチSTLの取引先名 |
| T | STL摘要 | マッチ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 行:
- 有効フラグ = TRUE
- 決済口座が "クレカ" を含む (例: "クレカ_福井銀行")
- 決済ステータス = "未処理" または (消込済 かつ 消込手段が空)
3.2.2 マッチ成立条件 (全て AND)
- 日付一致: card.支払年月日 = STL.決済日_計画 (完全一致)
- 金額一致: card.お支払い金額 or card.ご利用金額 が STL.税込金額_決済 の ±20%以内
- 名前やや一致: 以下のいずれかを満たす
- 名寄せ辞書 (
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 1 | card行の集約 | 同一STL_IDに紐づくcard行の お支払い金額 を合算し、stlCardMap に集約 |
| Pass 2 | STL_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.js | CC_MERCHANT_MAP 名寄せ辞書の定義 | 新規取引先追加時に更新 |
101_sys_config.js | メニュー「🔍 消込・マッチング」+ 33タブスキーマ(消込手段・立替日) | メニュー構成変更時に更新 |
403_subledger_engine.js | STL作成時の列対応 + 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-T08 | SKIP:取消 | card明細の訂正サイン = "取消" | 処理結果=SKIP:取消、マッチング処理をスキップ |
| CC-T09 | SKIP:金額なし | card のお支払い金額・ご利用金額がともに0または空 | 処理結果=SKIP:金額なし |
| CC-T10 | 確認FLG=TRUEスキップ | 既にマッチング確認済み(確認FLG=TRUE)の行に再実行 | 当該行はスキップされ、内容が変更されない |
| CC-T11 | 二重消込防止 | 処理結果=消込済の行に消込実行 | スキップされる |
| CC-T12 | STL_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.js | CC_MERCHANT_MAP 名寄せ辞書 |
101_sys_config.js | メニュー「🔍 消込・マッチング」+ 33タブスキーマ(消込手段・立替日) |
403_subledger_engine.js | STL作成時の列対応 + 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: '株式会社福井カード' },
];