概要

項目
案件IDMAS-217
カテゴリUX / 観測性
優先度P2 ★★
ステータス仕様書完了
前提案件MAS-214 (PR #230 完了)
対象ファイル(主)000_infra/002_constants.js (MENU_DEFINITION 拡張)、templates/operations_sidebar.html (CSS / HTML 視認性改善)
仕様書作成日2026-04-20

目的

MAS-214 で GAS トップメニュー (🚀 BizLP / 💾 バックアップ) を Constants.MENU_DEFINITION に集約し、updateMenuCatalog_00_menu タブへ自動展開する基盤が完成した。しかし運用上利用される操作の大半は サイドバー (templates/operations_sidebar.html) に存在しており、9 セクション・41 項目のボタンが MENU_DEFINITION 外でハードコードされたままになっている。本案件では次の 2 点を達成する。

  1. カタログの完全性: サイドバーの 41 項目を MENU_DEFINITION に統合し、00_menu から運用上ほぼ全ての操作の利用状況を把握できるようにする
  2. サイドバー視認性: 9 セクション・41+ ボタンが単色で並ぶ現状の探索負荷を、色分け・検索等で低減する

現状のコード

サイドバー現況 (templates/operations_sidebar.html)

9 セクション・41 ボタンの構成:

セクション項目数条件
📒 経理業務 (RPA / Action)9常時
🔍 消込・マッチング7常時
📝 費用登録1常時
📊 マート更新5常時
⚙️ メンテナンス4常時
🔧 開発・設定7常時
🔧 マイグレーション6常時
🔄 開発用 (dev)1isDev=true のとき表示
🧪 テスト1hasTestRunner=true のとき表示

既存 CSS は 4 クラスのみ (btn / btn.primary / btn.warn / btn.danger) で、primary は「🤖 全RPA一括実行」「財務3表の更新」の 2 箇所、warn は孤立 TRN/重複行削除、danger は空行物理削除/本番データ同期で使われている。

Constants.MENU_DEFINITION には現在、GAS トップメニュー分 (🚀 BizLP 4 項目 + 💾 バックアップ 5 項目 + MAS-214 で追加された メニューカタログを更新 1 項目の 計 10 項目) のみが登録されている。サイドバー項目は一切含まれない。

修正方針

Step 1 — サイドバー項目の MENU_DEFINITION 追加

templates/operations_sidebar.html から全 41 項目を逐語抽出し、Constants.MENU_DEFINITION に追加セクションとして統合する。onOpen() のメニュー生成対象外 (サイドバー由来) の項目には category として「📋 サイドバー: <元セクション>」のプレフィックスを付けて区別する。

データ追加例 (000_infra/002_constants.jsMENU_DEFINITION 末尾に追記):

// --- サイドバー項目 (operations_sidebar.html 由来) ---
{
  category: '📋 サイドバー: 📒 経理業務',
  source: 'sidebar',
  items: [
    { label: '🤖 全RPA一括実行', funcName: 'generateAllRpaInvoices', description: '全 RPA モジュール (HC/SaaS/CAPEX/Finance/Adhoc/Pipeline) を一括起票' },
    { label: '📥 SaaS月次請求', funcName: 'generateSaasInvoices', description: 'SaaS 定期利用料の月次 INV を自動起票' },
    // ... (以下 9 項目)
  ]
},
// ... 他 8 セクション

全 41 項目の抽出結果 (逐語引用):

📒 経理業務 (RPA / Action) — 9 項目

labelfuncNamedescription 案 (20-50 字)
🤖 全RPA一括実行generateAllRpaInvoices全 RPA モジュール (HC/SaaS/CAPEX/Finance/Adhoc/Pipeline) を一括起票
📥 SaaS月次請求generateSaasInvoicesSaaS 定期利用料の月次 INV を自動起票
📥 人件費(HC)月次請求generateHcInvoices給与・報酬・源泉税等の月次 INV を起票
📥 設備投資・返済generateCapexInvoices設備償却費・借入金返済の月次 INV を起票
📥 資金移動・財務取引generateFinanceInvoices資金移動・財務イベントの INV を起票
📥 単発経費generateAdhocInvoices26 タブの単発経費予算から INV を起票
📥 パイプライン受注generatePipelineInvoices21 タブ受注パイプラインから売上 INV を起票
📋 承認済INV→仕訳 (Action A)processInvoiceApprovals承認済 INV を仕訳に変換 (STL 自動生成含む)
✅ 消込済STL→仕訳 (Action B)processSettlementClearings消込済 STL の決済仕訳を確定

🔍 消込・マッチング — 7 項目

labelfuncNamedescription 案
💳 クレカ明細マッチング確認importCcStatementクレカ CSV を取込み、既存 INV とのマッチング候補を提示
💳 クレカ消込実行applyCcSettlement承認済みマッチング結果を STL に反映
📄 領収書PDF読込 (Drive)importReceiptPdfsDrive 指定フォルダの領収書 PDF を OCR で取込
🧾 領収書マッチング確認importReceiptStatement取込済み領収書と既存 INV のマッチング候補を提示
🧾 領収書消込実行applyReceiptSettlement承認済みマッチング結果を STL に反映
🏦 銀行CSVマッチング確認importBankStatement銀行口座 CSV を取込み、既存 INV/STL とのマッチング候補を提示
🏦 銀行CSV消込実行applyBankSettlement承認済みマッチング結果を STL に反映

📝 費用登録 — 1 項目

labelfuncNamedescription 案
📥 未登録領収書→26タブtransferReceiptToAdhoc未消込の領収書を 26 タブ単発経費に転記

📊 マート更新 — 5 項目

labelfuncNamedescription 案
財務3表の更新buildBudgetTrendDataMartP/LB/S・CF の予実マートを再構築
📅 基準年月指定で更新buildDataMartWithCustomBoundary基準年月を手動指定して財務3表を再構築
プロジェクト別 採算buildProjectProfitabilityPJ 別 P/L マート (78 タブ) を再構築
📊 KPIダッシュボード再描画buildKpiDashboardKPI ダッシュボード (93 タブ) を再計算
📸 前年度P/LスナップショットsavePlSnapshot前年度 P/L 実績をスナップショット保存

⚙️ メンテナンス — 4 項目

labelfuncNamedescription 案
✅ データ整合性チェックrunDataValidation全データシートの整合性を一括検証
🧹 孤立TRN削除cleanupOrphanTrn親 INV が存在しない孤立 TRN 行を削除
🧹 重複行削除cleanupDuplicateRows同一キーの重複行を検知して削除
🔎 INV/STL整合性checkInvStlConsistencyINV と STL の金額・期間整合性を検証

🔧 開発・設定 — 7 項目

labelfuncNamedescription 案
DDL 全更新 (Full)setupAllSchemas全シートのヘッダー・バリデーション・色を再適用
DDL 増分更新setupAllSchemasIncremental変更されたシートのみ DDL 再適用 (高速)
シート GID 取得・リンクinitConfigs01_sys_config にシート GID を記録
タブ名一括変更syncSheetNamesRENAME_MAP に基づいてタブ名を一括変更
タブを番号順並替sortSheetsByNameタブを番号プレフィックス順に並べ替え
📋 監査ログを開く (98_audit_log)openAuditLog98_audit_log シートに遷移
🗄️ 監査ログを月次アーカイブarchiveAuditLogMonthly前月分の 98_audit_log を 99_audit_archive_YYYYMM に移動

🔧 マイグレーション — 6 項目

labelfuncNamedescription 案
D-01〜D-03 科目マスタ追加migrationD01D03D-01〜D-03 の科目マスタエントリを冪等追加
D-04/D-06 説明列データmigrationD04D06D-04/D-06 科目説明列にデータを冪等投入
MAS-154 取引先略称migrationI10MAS-154 取引先略称列にデータを冪等投入
MAS-166 立替精算STLmigrationI24MAS-166 立替精算 STL の振込先名を冪等補完
MAS-120: 取引先決済条件マスタ化migrationS48PartnerPaymentTermsMAS-120 既存データから標準決済条件をマスタに冪等投入
🧹 全シート空行物理削除cleanupEmptyRows全シートの末尾空行を物理削除 (警告あり)

🔄 開発用 (dev) — 1 項目 (dev 環境のみ)

labelfuncNamedescription 案
本番データ同期syncProdToDevprod スプレッドシートから dev にデータをコピー (dev 環境限定)

🧪 テスト — 1 項目 (テストランナー有効時のみ)

labelfuncNamedescription 案
全テスト実行runAllTests901_test_runner.js の全テストケースを実行

条件付き項目の扱い: isDev / hasTestRunner の条件で表示切替される 2 セクションは、MENU_DEFINITION に項目オブジェクトの追加フィールド condition: 'isDev' / condition: 'hasTestRunner' を持たせる。updateMenuCatalog_ は全項目を展開するが、description 末尾の「(dev 環境限定)」等で運用者が認識できるようにする。サイドバー動的生成化 (後述の後続案件) でこの condition フィールドを実際の表示制御に使う。

Step 2 — サイドバー視認性改善 (HTML/CSS のみ)

9 セクション・41+ ボタンの探索負荷を低減するため、以下 5 案のうち採用案を組み合わせて適用する。

概要工数効果備考
1. セクション別の左ボーダー色<h3> の絵文字カテゴリと同系色の border-left: 4px を各ボタンに付与CSS 追加のみ、構造変更なし
2. 操作カテゴリ別の背景色読取系 = 薄青 / 書込系 = 白 / 破壊的 = 薄赤 の 3 段階クラス拡張既存 primary/warn/danger を補完
3. 高頻度操作の強調primary を 2 箇所以外にも手動拡張 (例: Action A/B、財務3表系)主観的、ユーザー選択必須
4. 検索ボックス追加ラベルを JS フィルタリング (インクリメンタル検索)DOM 操作追加、a11y 考慮
5. セクションの折りたたみ<details> で各 <h3> を展開/折畳み可能に好みが分かれるため可否要確認

推奨組合せ: 1 + 2 を基本採用。工数低く視認性改善効果が大きい。4 (検索) は工数中だが効果大なので採用推奨。3 と 5 はユーザー選択依頼。

案 1 + 2 の CSS 実装例:

/* 案 1: セクション別の左ボーダー色 (h3 カテゴリと連動) */
.section[data-cat="rpa"]         .btn { border-left: 4px solid #34a853; }  /* 緑系 */
.section[data-cat="match"]       .btn { border-left: 4px solid #4285f4; }  /* 青系 */
.section[data-cat="regist"]      .btn { border-left: 4px solid #fbbc04; }  /* 黄系 */
.section[data-cat="mart"]        .btn { border-left: 4px solid #673ab7; }  /* 紫系 */
.section[data-cat="maintenance"] .btn { border-left: 4px solid #fb8c00; }  /* 橙系 */
.section[data-cat="devops"]      .btn { border-left: 4px solid #5f6368; }  /* 灰系 */
.section[data-cat="migration"]   .btn { border-left: 4px solid #9c27b0; }  /* 桃系 */
.section[data-cat="dev"]         .btn { border-left: 4px solid #ea4335; }  /* 赤系 */
.section[data-cat="test"]        .btn { border-left: 4px solid #00acc1; }  /* 水色 */

/* 案 2: 操作カテゴリ別の背景色 (読取/書込/破壊の 3 段階) */
.btn.read    { background: #f0f7ff; }  /* 薄青 = 読取系 (参照・一覧) */
.btn.write   { background: #ffffff; }  /* 白   = 書込系 (既存: 通常) */
.btn.destroy { background: #fdf2f2; border-color: #e57373; }  /* 薄赤 = 破壊的 */

HTML 側は各 <div class="section">data-cat="..." を追加し、必要な <button>.read / .write / .destroy を追加する。

案 4 (検索ボックス) の実装例:

<input type="search" id="menuSearch" placeholder="🔍 メニュー検索..."
       style="width: 100%; padding: 6px; margin-bottom: 10px; border: 1px solid #d0d0d0; border-radius: 3px; font-size: 12px;">
<script>
  document.getElementById('menuSearch').addEventListener('input', function(e) {
    var q = e.target.value.toLowerCase();
    document.querySelectorAll('.btn').forEach(function(btn) {
      var hit = q === '' || btn.textContent.toLowerCase().indexOf(q) >= 0;
      btn.style.display = hit ? '' : 'none';
    });
    document.querySelectorAll('.section').forEach(function(sec) {
      var visibleBtns = sec.querySelectorAll('.btn:not([style*="display: none"])');
      sec.style.display = visibleBtns.length > 0 ? '' : 'none';
    });
  });
</script>

Step 3 — 動作確認

  1. npm run push:dev で dev 環境にデプロイ
  2. スプレッドシートをリロードし、サイドバー表示の回帰確認 (全 41 項目が表示、既存 primary/warn/danger のスタイルが保持、動作 (run 実行) が変わらないこと)
  3. '💾 バックアップ → メニューカタログを更新' を実行し、00_menuサイドバー 41 項目が追加されて表示されることを確認
  4. 新 CSS の表示確認 (ボーダー色・背景色・検索挙動)
  5. 98_audit_log にサンプル実行履歴がある状態で再実行し、サイドバー項目の実行回数・最終実行日時が正しく集計されることを確認

影響範囲

ファイル変更内容
000_infra/002_constants.jsConstants.MENU_DEFINITION 末尾にサイドバー由来 9 セクション・41 項目を追加
templates/operations_sidebar.htmlCSS クラス追加 (ボーダー色・背景色)、検索ボックス HTML/JS 追加、各 <div class="section">data-cat 付与、該当 <button>.read / .write / .destroy 付与
100_config/101_sys_config.js変更不要 (updateMenuCatalog_ は既に MENU_DEFINITION 全体を展開するため、追加定義を読み込むだけ)

注意事項

  1. サイドバー HTML ファイルは動的生成化しない: operations_sidebar.htmlMENU_DEFINITION からレンダリングする案 (動的生成化) は本案件の対象外。別案件 (後続の N-XX) として切り出す。本案件では HTML と MENU_DEFINITION二重管理になることを許容し、代わりに Step 3 の動作確認 2 でラベル・関数名の一致を目視確認する。
  2. primary の拡張は Step 2 の案 3 に含める: 既存の primary 2 箇所を変更する場合はユーザー判断が必要。本案件のデフォルトでは既存 primary を維持。
  3. 条件付き項目 (isDev / hasTestRunner) の MENU_DEFINITION 扱い: condition フィールドを持たせるが、updateMenuCatalog_ は無条件に全項目を展開する。description で環境条件を明記。
  4. category 命名規則: GAS トップメニュー由来の既存カテゴリ (🚀 BizLP / 💾 バックアップ) と区別するため、サイドバー由来には「📋 サイドバー: 」プレフィックスを統一付与する。00_menu カタログ上でもこの prefix でグループ識別できる。
  5. description 執筆のレビュー必須: 41 項目の description (20-50 字) は仕様書作成時点で逐語読解に基づくドラフト。実装前にユーザー (業務オーナー) が内容確認すること。機能ごとの精度差があり得る。

エッジケース

条件挙動理由
サイドバーで未表示の条件付き項目 (syncProdToDev / runAllTests) を 00_menu 上で確認常に一覧に表示、description に環境条件明記カタログは全項目の網羅が目的。表示制御はサイドバー側の責務
未使用機能の検出98_audit_log にエントリなし → 実行回数 0 / 最終実行日時 -00_menu に出力MAS-214 既存挙動を継承
MENU_DEFINITION に追加したが operations_sidebar.html にない項目00_menu には表示されるが、サイドバーからは起動できない本案件では二重管理のため整合性チェックは目視のみ。動的生成化 (別案件) で解消
operations_sidebar.html にあるが MENU_DEFINITION に追加漏れの項目00_menu に表示されず、統計集計対象外Step 3 動作確認で目視チェック (41 項目の件数一致)
CSS 追加クラス (.read / .write / .destroy) を付け忘れたボタン既存スタイル (デフォルト .btn) が適用段階的適用を許容。視認性改善は best-effort
検索ボックスに絵文字入力絵文字も部分一致対象 (textContent 全体で比較)ユーザーがカテゴリ絵文字で絞れるよう意図
検索ヒット 0 件全ボタン・全セクションが hiddenプレースホルダ等の案内は不要 (空の状態が明白)
data-cat 未設定セクション左ボーダー色なし (既存 .btn スタイルのみ)段階的適用可能

関連ドキュメント

  • dev_mas-214_menu_catalog.md — 前提案件。MENU_DEFINITION 設計・updateMenuCatalog_ 実装
  • docs/_internal/failure_patterns.md #20 — 固有名詞 (関数名・ラベル) の造語禁止
  • docs/_internal/TODO_future.md — MAS-214 / MAS-217 案件情報

人間が検討すべき事項

  1. description 41 項目の内容レビュー: 仕様書のドラフト description はコード逐語読解ベース。業務オーナー (代表者) が運用目線で全項目の description を確認し、実装前に調整すること。特に「📥 単発経費」「📥 パイプライン受注」「プロジェクト別 採算」「タブ名一括変更」等は誤解の余地がある。
  2. Step 2 視認性改善の採用案選択: 5 案のうち採用するものを選ぶ (推奨: 1 + 2 + 4、オプション: 3 / 5)。採用範囲で工数・実装難度が変わる。
  3. 左ボーダー色のカラーパレット決定: 案 1 の CSS 例は暫定色。既存 Constants.COLORS との整合、ブランドカラー適合は要レビュー。
  4. 検索ボックスの a11y 要件: 案 4 採用時、スクリーンリーダー対応 (aria-label 付与) やキーボードフォーカス制御が必要か判断。個人利用範囲なら省略可。
  5. 条件付き項目 (dev / テスト) の MENU_DEFINITION 扱い: condition フィールド方式で良いか、別の表現方式 (例: category 自体に dev-only suffix) で良いか要決定。
  6. サイドバー動的生成化 (後続案件 候補): 本案件完了後、operations_sidebar.htmlMENU_DEFINITION から動的レンダリングする案件を別起票するか判断。PR #230 の動的化 C 案と合流する。
  7. 📋 サイドバー: プレフィックスの妥当性: 00_menu カタログ上で GAS トップメニュー由来とサイドバー由来を区別する命名が必要か、別手段 (source 列の追加等) で良いかを検討。
  8. description 重複ロジック: 同一 funcName が GAS メニューとサイドバー両方に登録された場合 (例: 将来メニュー重複があり得る)、00_menu でどう表示するか要検討 (現状は重複定義を禁止する前提)。

実装プロンプト(Claude Code 用)

あなたはGAS会計システムのシニア開発者です。
案件 MAS-217「サイドバー項目を MENU_DEFINITION に統合 + 視認性改善」を実装してください。

## 実行前タスク
1. `templates/operations_sidebar.html` を Read し、9 セクション・41 項目の label / onclick 関数名を逐語確認する (行 32〜111)。推測・記憶で書くことは禁止 (失敗パターン #20)。
2. `000_infra/002_constants.js` の `Constants.MENU_DEFINITION` 現況 (MAS-214 で追加済) を Read し、既存のオブジェクト構造・末尾位置を確認する。
3. `100_config/101_sys_config.js` の `updateMenuCatalog_` (MAS-214 実装) を Read し、`condition` フィールドに対する挙動を確認する (本案件では無条件展開で良い)。
4. `docs/dev/dev_mas-217_sidebar_catalog_and_readability.md` を Read し、41 項目の description ドラフトと視認性改善の採用案をユーザー選択結果として受け取る。
5. `docs/_internal/failure_patterns.md` #20 を確認し、ラベル・関数名の逐語引用ルールを守る。

## 修正対象ファイル
- `000_infra/002_constants.js`: `Constants.MENU_DEFINITION` 末尾にサイドバー由来 9 セクション・41 項目を追加。既存項目は一切変更禁止。
- `templates/operations_sidebar.html`: (Step 2 採用案に応じて) CSS クラス追加、`<div class="section">` に `data-cat` 属性付与、該当 `<button>` に `.read` / `.write` / `.destroy` 付与、検索ボックス HTML/JS 追加。既存 `primary/warn/danger` 付与箇所および onclick 関数名は一切変更禁止。
- `100_config/101_sys_config.js`: 変更不要。

## 実装内容
- Step 1: `Constants.MENU_DEFINITION` への 9 セクション・41 項目追加
  - 配置: 既存の最後のセクション (MAS-214 で追加された `💾 バックアップ` の次) の直後に追加
  - 各セクション: `{ category: '📋 サイドバー: <元セクション絵文字付き名>', source: 'sidebar', items: [...] }`
  - 各項目: `{ label, funcName, description }` (description は仕様書 §修正方針 Step 1 の表から逐語コピー)
  - 条件付き項目 (`syncProdToDev` / `runAllTests`) には `condition: 'isDev'` / `condition: 'hasTestRunner'` を追加
- Step 2: サイドバー視認性改善
  - 採用案 (ユーザー選択結果): [ ユーザー指示に従う。仕様書推奨は 1 + 2 + 4 ]
  - 案 1: 各 `<div class="section">` に `data-cat="rpa|match|regist|mart|maintenance|devops|migration|dev|test"` を付与。CSS ルール追加
  - 案 2: 該当 `<button>` に `.read` / `.write` / `.destroy` を追加。CSS ルール追加
  - 案 4: 検索ボックス HTML (`<input type="search" id="menuSearch">`) を `<h2>` 直後に追加。JS フィルタリングロジック追加
- Step 3: 動作確認
  - `npm run push:dev` でデプロイ
  - サイドバー目視確認 (全項目表示・既存スタイル維持・動作回帰なし)
  - `updateMenuCatalog_` 実行 → `00_menu` に 41 項目追加確認
  - CSS 適用確認 (ボーダー色・背景色・検索)

## 制約
- ラベル文字列・関数名は `templates/operations_sidebar.html` からの逐語引用のみ使用。造語・推測禁止 (失敗パターン #20)。
- CSS クラス付与は段階適用可 (全ボタンに付ける必要はない)。
- `onclick` 属性の関数名を変更しない。
- 既存 `primary/warn/danger` の付与箇所を変更しない。
- 条件付きセクション (`<? if (isDev) { ?>` / `<? if (hasTestRunner) { ?>`) の HTML 構造は維持。

## エッジケース
- サイドバーの条件付き項目は `MENU_DEFINITION` に無条件追加 (`condition` フィールドで区別)
- `98_audit_log` データゼロ → 実行回数 0 / 最終実行日時 `-` で `00_menu` 表示
- `operations_sidebar.html` と `MENU_DEFINITION` の二重管理は許容 (動的生成化は別案件)
- `data-cat` / `.read|.write|.destroy` 未付与ボタン → 既存スタイル維持
- 検索ヒット 0 件 → 全 btn / section が hidden

## 動作確認
1. `npm run push:dev` でデプロイする
2. スプレッドシートをリロードし、サイドバーの 41 項目が既存の表示・動作と変わらず出ることを確認 (回帰チェック)
3. `'💾 バックアップ → メニューカタログを更新'` を実行し、`00_menu` にサイドバー由来 41 項目が「📋 サイドバー: 」プレフィックスで新規追加されていることを確認
4. CSS 改善 (ボーダー色・背景色・検索ボックス) が採用案通りに適用されていることを目視確認
5. 検索ボックスに「領収書」と入力し、該当ボタンのみが表示されることを確認
6. `98_audit_log` にサンプル履歴がある状態で再度 `updateMenuCatalog_` を実行し、サイドバー項目の実行回数・最終実行日時が正しく集計されることを確認

### 拡張思考の使用状況
| フェーズ | 拡張思考 | 備考 |
|---------|---------|------|
| 実行前タスク (Read・description 内容確認) | あり | label / funcName の逐語引用、description の業務妥当性レビュー |
| 実装 (コード書き下し) | なし | 確定済み内容の清書に徹する |

推奨実行モデル

工程推奨モデル理由
Step 1 前半 (description 執筆の最終確認)Claude Opus 4.641 項目の業務内容整理に会計ドメイン知識が必要
Step 1 後半 (MENU_DEFINITION への追加)Claude Sonnet 4.6仕様書で完全定義済みのコード書き下し
Step 2 (サイドバー CSS / HTML)Claude Sonnet 4.6既存パターン拡張、中程度の判断
Step 3 (動作確認)Claude Haiku 4.5手順実行のみ

変更履歴

日付変更内容
2026-04-20初版作成