最終更新: 2026/06/22 18:56
MAS-134: setupAllSchemas の高速化
概要
| 項目 | 内容 |
|---|---|
| 案件ID | MAS-134 |
| カテゴリ | パフォーマンス・DevOps |
| Phase | P1 |
| 優先度 | ★★★ |
| 所要時間 | 2-3時間 |
| 対象ファイル | 100_config/101_sys_config.js |
| 前提案件 | なし |
目的
100_config/101_sys_config.js の setupAllSchemas() が全シートに対して重い処理を多数実行し、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 リクエストに集約する。
requests配列を準備。RepeatCellRequestを使用して、数値フォーマット、背景色、データバリデーションを一括設定。- 最後に
Sheets.Spreadsheets.batchUpdateを実行。
Step 2: 増分更新モード(スキーマハッシュ)
スキーマ定義のハッシュ値を計算し、ScriptProperties に保存する。
schemasオブジェクト全体の JSON 文字列から MD5 ハッシュを生成(Utilities.computeDigest)。- 前回実行時のハッシュと比較し、一致する場合は(強制実行でない限り)スキーマ更新をスキップ。
- シート名や列構成が変更された場合のみ実行されるようにする。
Step 3: メニュー分割と進捗通知
onOpenのメニューを以下のように分割する:全シートのスキーマを最新化 (Full)増分更新のみ実行 (Incremental)書式・バリデーションのみ再適用 (Formatting Only)
- 処理中のシート名を
ss.toast()で表示し、進捗を可視化する。
影響範囲
| ファイル | 変更量 | 既存動作への影響 |
|---|---|---|
100_config/101_sys_config.js | 大(約200行のリファクタリング) | 処理速度が劇的に向上。設定内容は維持される。 |
注意事項
- Sheets API の有効化: Google Cloud Console および GAS エディタのサービスで Sheets API v4 を有効にする必要がある。
- A1表記からインデックスへの変換: Sheets API は 0-based index を使用するため、
getRange("B2:D")等の A1 表記をstartRowIndex: 1, endRowIndex: undefined, startColumnIndex: 1, endColumnIndex: 4のような構造に変換する必要がある。 - データバリデーションの形式:
DataValidationRuleオブジェクトを Sheets API 用のDataValidationRule構造体に変換する必要がある。
エッジケース
| 条件 | 挙動 | 理由 |
|---|---|---|
| 新規シート追加 | ハッシュが不一致となり、全処理が実行される | スキーマ定義に新しいキーが追加されるため |
| 列の順序変更 | ハッシュが不一致となり、全処理が実行される | headers 配列の内容が変わるため |
| API 制限 | batchUpdate は 1 リクエストに集約されるため、クォータ制限に強くなる | 個別呼び出しによる API 叩きすぎを防止 |
実データ検証
setupAllSchemas実行後の各シートの数値フォーマット(カンマ区切り、日付形式)が正しく維持されているか。- プルダウン(データバリデーション)が正しく機能しているか。
- 背景色(手入力=薄青、自動=薄灰)が正しく適用されているか。
関連ドキュメント
| 仕様書リンク | 関連箇所 |
|---|---|
| mst_sys_config.md | DDL定義の基本思想 |
| 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.6 | Sheets API の複雑なリクエスト構造の正確な記述が必要 |
変更履歴
| 日付 | 変更内容 |
|---|---|
| 2026-04-17 | 初版作成 |