概要
CEO が SUICA 利用明細(PDF または CSV)を Drive の INBOX_suica フォルダに投入すると、
うーぱんが自動で乗車履歴を抽出し、SUICA 明細管理簿スプシの
SUICA_自動取込 シートに 1 行ずつ追加します。
証憑管理簿シート 1 は更新しません。
SUICA 立替分は年末(または期末)に CEO がまとめて Freee 転記します。
このパイプラインはあくまで「叩き台の自動生成」です。
処理フロー
[CEO] Drive INBOX_suica に PDF / CSV を投入
↓
[うーぱん] LaunchAgent: com.connect8.upan.suica_poller(1 時間毎)
↓
[suica_pipeline.py]
1. Drive ポーリング → 未処理ファイル取得
2. パース
- PDF: claude CLI(OAuth)で Vision OCR → JSON 抽出
- CSV: Shift-JIS / UTF-8 自動判定、フォーマット自動検出(4 種)
3. 対象期間(最古日〜最新日)を抽出
→ OK: YYYYMMDD-YYYYMMDD_suica利用明細.{ext} にリネーム
→ NG: _要確認_<元ファイル名> にリネーム
4. SUICA_自動取込 シートに行追加(重複スキップ)
5. ファイル移動
→ OK: 代表者交通費立替フォルダ
→ NG: _要確認フォルダ
↓
[うーぱん] LaunchAgent: com.connect8.upan.suica_poller(1 時間毎)
↓
[suica_pipeline.py]
1. Drive ポーリング → 未処理ファイル取得
2. パース
- PDF: claude CLI(OAuth)で Vision OCR → JSON 抽出
- CSV: Shift-JIS / UTF-8 自動判定、フォーマット自動検出(4 種)
3. 対象期間(最古日〜最新日)を抽出
→ OK: YYYYMMDD-YYYYMMDD_suica利用明細.{ext} にリネーム
→ NG: _要確認_<元ファイル名> にリネーム
4. SUICA_自動取込 シートに行追加(重複スキップ)
5. ファイル移動
→ OK: 代表者交通費立替フォルダ
→ NG: _要確認フォルダ
Drive フォルダ
| 名称 | Drive ID | 説明 |
|---|---|---|
| INBOX_suica | 1up3bVjq-0DouBf1l516Sdk3tTKCXU3xG |
投入口(CEO がドロップする場所) |
| SUICA 作業場 | 18pmkLwY-RfuuGdv7u0_J1ANA4HrL6cmE |
処理中一時フォルダ |
| 代表者交通費立替 | 153v2cIFZ7GncuRmcAF3yZ9YGZt_0aYp0 |
最終配置先(リネーム済みファイルが格納される) |
スプシ構成
管理スプシ ID: 1PT1uZPLxVxPq6piHYtdNmV7pPd_z39rE0MtyYhajM68
既存手動シート(2026.6 交通費立替、2025.6 交通費立替... 等)は一切触りません。
うーぱんが書き込むのは SUICA_自動取込 シートのみです。
SUICA_自動取込 シート列構成(A〜L 列・12 列)
| 列 | 内容 | 備考 |
|---|---|---|
| A | 発生日 | YYYY-MM-DD |
| B | 乗車駅 | 入駅 |
| C | 降車駅 | 出駅 |
| D | 利用金額 | JPY 整数(丸め厳禁) |
| E | 残高 | JPY 整数 |
| F | 備考 | 自動では空欄。CEO が手動で追記可 |
| G | 勘定科目 | 「旅費交通費」固定 |
| H | 会計年度 | 7月始まり(例: 2026 = 2025/07〜2026/06) |
| I | Freee 転記済 | スタッフ手動 ✓ |
| J | 対象期間 | YYYYMMDD-YYYYMMDD 形式 |
| K | ソースファイル | Drive HYPERLINK(クリックでファイルを開ける) |
| L | 処理日時 | YYYY-MM-DD HH:MM JST |
CSV フォーマット対応
スクリプトはヘッダー行を解析して CSV フォーマットを自動判定します。
| フォーマット名 | 識別条件 | 主な出典 |
|---|---|---|
| existing_manual | 月/日 列 + 種別列 2 つ | 既存手動スプシと同形式のエクスポート |
| mobile_suica | 月日/利用日 + 差額/利用金額列 | モバイル Suica / JRE POINT アプリ |
| pasmo | 入列 + 出列あり | PASMO / カードリーダー |
| jr_internet | 種別 + 残高/残額列 | JR 東日本インターネットサービス |
不明フォーマットの場合:
レコード 0 件 → 期間抽出不可 →
_要確認_ プレフィックスでリネーム → _要確認 フォルダへ退避。
CEO に通知(ログ確認)。
リネーム規約
| 状態 | ファイル名フォーマット |
|---|---|
| OK | YYYYMMDD-YYYYMMDD_suica利用明細.{pdf|csv}例: 20260304-20260606_suica利用明細.pdf |
| 要確認 | _要確認_<元ファイル名>例: _要確認_JE809xxxx_20260304.pdf |
CEO テスト手順
1
SUICA 明細 PDF または CSV を Drive の INBOX_suica フォルダにドロップ
Drive を開く(INBOX_suica)
Drive を開く(INBOX_suica)
2
Mac mini で手動実行(LaunchAgent を待たずに即時テスト)
cd ~/claude/2_Areas/A10_corporate_finance/suica_pipeline
python3 suica_pipeline.py
3
4
ファイル移動確認
投入したファイルが「代表者交通費立替」フォルダに
投入したファイルが「代表者交通費立替」フォルダに
YYYYMMDD-YYYYMMDD_suica利用明細.pdf にリネームされて移動済みを確認
5
問題なければ LaunchAgent をインストール
cp ~/claude/2_Areas/A10_corporate_finance/suica_pipeline/com.connect8.upan.suica_poller.plist \
~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.connect8.upan.suica_poller.plist
LaunchAgent 仕様
| 項目 | 値 |
|---|---|
| Label | com.connect8.upan.suica_poller |
| 実行間隔 | 1 時間毎(StartInterval: 3600) |
| plist 保管場所 | suica_pipeline/com.connect8.upan.suica_poller.plist |
| ログ出力 | _logs/suica_poller_stdout.log / suica_poller_stderr.log |
| 処理済み ID 管理 | suica_pipeline/suica_processed_ids.json(べき等性保証) |
| 既存ポーラーとの関係 | 完全独立(com.connect8.upan.poller とは別) |
実装ファイル
| ファイル | 役割 |
|---|---|
suica_pipeline/suica_pipeline.py |
メインスクリプト(PDF OCR + CSV パース + スプシ追記 + ファイル移動) |
suica_pipeline/setup_suica_sheet.py |
スプシ初期設定(SUICA_自動取込 シート新設・ヘッダー書込・列幅設定) |
suica_pipeline/suica_processed_ids.json |
処理済みファイル ID 管理(自動生成・べき等性保証) |
suica_pipeline/com.connect8.upan.suica_poller.plist |
LaunchAgent 定義(1 時間毎定期実行) |
_context/SPEC_a10_pipeline_v4.md §12 |
SUICA フロー仕様書(技術仕様・フォーマット定義) |
_context/drive_folder_ids.json |
SUICA 関連フォルダ ID 登録済み(INBOX_suica / suica_workspace / suica_dest) |
うーぱんルール(SUICA 専用)
- 証憑管理簿シート 1 には絶対に書き込まない
- SUICA 立替は年末に CEO がまとめて Freee 転記(立替金精算)
- Freee への書き込みは一切しない(スプシ叩き台のみ)
- 金額の丸め・四捨五入厳禁(1 円単位)
- 乗降駅情報はログに書かない(件数のみ)
- 処理済み ID を
suica_processed_ids.jsonで管理(2 度処理防止) - 疑わしい場合は
_要確認_プレフィックス + 退避(スキップしない)
トラブルシューティング
PDF OCR が失敗する場合
claudeCLI が起動できるか確認:claude --version- OAuth トークンが有効か確認(Claude Code ログイン状態)
- ファイルが
_要確認_プレフィックスでリネームされていれば Drive に残っているので、正常な手動入力で対応可能
CSV フォーマット不明の場合
- ファイルが
_要確認フォルダに退避されています - CSV の先頭数行をテキストエディタで確認し、ヘッダー情報を確認
- フォーマット追加が必要な場合は CEO → うーぱんに依頼
スプシに行が追加されない場合
suica_processed_ids.jsonにファイル ID が登録されていないか確認- ログ(
_logs/suica_poller_stdout.log)で処理結果を確認 - 重複スキップが発生している可能性(同一期間 + 同一乗降)