概要

項目内容
案件IDMAS-134
カテゴリパフォーマンス・DevOps
PhaseP1
優先度★★★
所要時間2-3時間
対象ファイル100_config/101_sys_config.js
前提案件なし

目的

100_config/101_sys_config.jssetupAllSchemas() が全シートに対して重い処理を多数実行し、DDL 適用に数十秒〜数分かかる問題を解消する。Sheets API v4 の一括更新(batchUpdate)と増分更新(ハッシュ比較)を導入することで、セットアップ時間を 10-20倍短縮し、開発・運用サイクルを高速化する。

現在のコード

ボトルネック1: 個別の書式設定ループ

101_sys_config.js L602-L672 付近で、各シートに対して個別に setNumberFormat()setFormulaR1C1() を呼び出している。

if (key === 'TRN_JOUR') { sheet.getRange("B2:D").setNumberFormat('yyyy-mm-dd'); sheet.getRange("I2:I").setNumberFormat('#,##0'); sheet.getRange("K2:M").setNumberFormat('#,##0'); }
// ... これが全シート分続く

ボトルネック2: 個別のバリデーション設定

L892-1001 付近で、setVali 関数を通じて各列に個別にデータバリデーションを設定している。

function setVali(sheetKey, colNum, dropColLetter, fallbackName) {
  try { 
    // ...
    targetSheet.getRange(2, colNum, Math.max(targetSheet.getMaxRows()-1, 1), 1).setDataValidation(rule); 
  } catch(e) {}
}
// ... これが約50回呼び出される

ボトルネック3: 全シートへのフォント適用(廃止対象)

L419 で全シートの全セルに対して setFontFamily を実行している。

try { let theme = ss.getSpreadsheetTheme() || ss.getPredefinedSpreadsheetThemes()[0]; if (theme) { theme.setFontFamily("Roboto Mono"); ss.setSpreadsheetTheme(theme); } } catch(e) {}

※テーマ設定だけでフォントは伝播するため、個別の setFontFamily ループ(過去に存在したボトルネック)は不要。

修正方針

Step 1: Sheets API v4 batchUpdate の導入

各シートの setNumberFormat, setBackground, setDataValidation を個別に呼び出すのではなく、1つの spreadsheets.batchUpdate リクエストに集約する。

  1. requests 配列を準備。
  2. RepeatCellRequest を使用して、数値フォーマット、背景色、データバリデーションを一括設定。
  3. 最後に Sheets.Spreadsheets.batchUpdate を実行。

Step 2: 増分更新モード(スキーマハッシュ)

スキーマ定義のハッシュ値を計算し、ScriptProperties に保存する。

  1. schemas オブジェクト全体の JSON 文字列から MD5 ハッシュを生成(Utilities.computeDigest)。
  2. 前回実行時のハッシュと比較し、一致する場合は(強制実行でない限り)スキーマ更新をスキップ。
  3. シート名や列構成が変更された場合のみ実行されるようにする。

Step 3: メニュー分割と進捗通知

  1. onOpen のメニューを以下のように分割する:
    • 全シートのスキーマを最新化 (Full)
    • 増分更新のみ実行 (Incremental)
    • 書式・バリデーションのみ再適用 (Formatting Only)
  2. 処理中のシート名を ss.toast() で表示し、進捗を可視化する。

影響範囲

ファイル変更量既存動作への影響
100_config/101_sys_config.js大(約200行のリファクタリング)処理速度が劇的に向上。設定内容は維持される。

注意事項

  1. Sheets API の有効化: Google Cloud Console および GAS エディタのサービスで Sheets API v4 を有効にする必要がある。
  2. A1表記からインデックスへの変換: Sheets API は 0-based index を使用するため、getRange("B2:D") 等の A1 表記を startRowIndex: 1, endRowIndex: undefined, startColumnIndex: 1, endColumnIndex: 4 のような構造に変換する必要がある。
  3. データバリデーションの形式: DataValidationRule オブジェクトを Sheets API 用の DataValidationRule 構造体に変換する必要がある。

エッジケース

条件挙動理由
新規シート追加ハッシュが不一致となり、全処理が実行されるスキーマ定義に新しいキーが追加されるため
列の順序変更ハッシュが不一致となり、全処理が実行されるheaders 配列の内容が変わるため
API 制限batchUpdate は 1 リクエストに集約されるため、クォータ制限に強くなる個別呼び出しによる API 叩きすぎを防止

実データ検証

  • setupAllSchemas 実行後の各シートの数値フォーマット(カンマ区切り、日付形式)が正しく維持されているか。
  • プルダウン(データバリデーション)が正しく機能しているか。
  • 背景色(手入力=薄青、自動=薄灰)が正しく適用されているか。

関連ドキュメント

仕様書リンク関連箇所
mst_sys_config.mdDDL定義の基本思想
dev_mas-178_error_handling.mdエラーログ基盤との連携

人間が検討すべき事項

  • 増分モードのデフォルト化: 開発メニューでは「増分」をデフォルトにし、不具合時のみ「Full」を実行する運用とする。
  • Sheets API 有効化の確認: 実装前にサービス設定で Sheets API が追加されているか確認が必要。

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

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-134「setupAllSchemas の高速化」を実装してください。

## 実行前タスク

以下のファイルを読み込んでください:
1. `100_config/101_sys_config.js` — setupAllSchemas() の実装(L413-1008)
2. `000_infra/002_constants.js` — Constants.CONFIG_SHEET 等の定義

## 修正対象ファイル

- `100_config/101_sys_config.js` への追記・リファクタリング

## 実装内容

### 1. Sheets API v4 batchUpdate への移行
- `setupAllSchemas` 内の `setNumberFormat`, `setBackground`, `setDataValidation` の個別呼び出しを廃止。
- `requests` 配列を構築し、`RepeatCellRequest` を使用して書式とバリデーションを一括設定するロジックを実装。
- `DataValidationRule` は `ConditionValue` を使用した Sheets API 形式に変換すること。

### 2. 増分更新モードの実装
- `schemas` オブジェクトの MD5 ハッシュを計算する `getSchemaHash_()` を作成。
- `ScriptProperties` に `LAST_SCHEMA_HASH` を保存。
- `setupAllSchemas(isFull)` 引数を受け取り、`isFull` が false かつハッシュが一致する場合は、シート作成や列並び替えをスキップし、書式適用のみ(または完全スキップ)とする。

### 3. 進捗通知の実装
- 各シートの処理開始時に `SpreadsheetApp.getActive().toast(sheetName + ' を更新中...', 'DDL適用', 1)` を表示。

### 4. メニューの更新
- `onOpen` 内の「🔧 開発・設定」メニューを以下に更新:
    - `全シートのスキーマを最新化 (Full)` -> `setupAllSchemas(true)`
    - `増分更新のみ実行 (Incremental)` -> `setupAllSchemas(false)`

## 制約
- 既存の `RENAME_MAP` による列の自動マイグレーション機能は維持すること。
- `MST_DICT` や `SYS_DROP` の初期化ロジックも維持すること。
- Sheets API を使用するため、`Sheets` サービスが有効であることを前提とする(コード内でのチェックは不要)。

## 動作確認
1. `増分更新のみ実行` をクリックし、数秒で完了することを確認。
2. スキーマ定義(`schemas` オブジェクト)の列名を1つ変更し、再度 `増分更新` を実行。変更が反映されることを確認。
3. 各シートの数値フォーマット、背景色、プルダウンが正しく設定されていることを目視で確認。

推奨実行モデル

工程推奨モデル理由
仕様書作成Claude Sonnet 4.6既存コードのボトルネック分析と Sheets API への置換設計
実装Claude Sonnet 4.6Sheets API の複雑なリクエスト構造の正確な記述が必要

変更履歴

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

仕様書作成プロンプト

展開して表示 Create the specification document for MAS-134 (setupAllSchemas optimization) in docs/dev/dev_mas-134_setup_all_schemas_optimization.md. Follow the template in docs/_internal/dev_spec_prompt_template.md. Include the following technical details: - Use Sheets API v4 batchUpdate for formatting and validation. - Implement incremental mode using schema hashing (Utilities.computeDigest). - Split the menu into Full/Incremental/Formatting-only. - Add progress toasts. - Update docs/_config.json and docs/_internal/changelog.md.