Skip to content

[検討] SKU別売れ数転記処理: SpreadsheetApp.openByIdの遅延をSheets API移行で解消できるか検証する #21

Description

@Hide-JZX100

背景

GetSalesSummaryAcquisition/06_売れ数転記_改修.gscopyMakerData() にて、
コピー先スプレッドシートを開く処理(openSpreadsheet(config.targetId) =
SpreadsheetApp.openById())の所要時間が、メーカーによって大きく変動することが
DEBUG_TIMING の診断ログで確認された。

現状の計測結果

読み込み・書き込み自体(getValues/setValues)は常に安定して1秒未満だが、
「先を開く」処理だけが突出して遅いケースがある。

メーカー 元を開く 先を開く 開始行計算 元読込 先書込 合計
SNO 4ms 241ms 375ms 139ms 4ms 763ms
サービス分集計 4ms 501ms 390ms 127ms 254ms 1276ms
熊井綿業 4ms 772ms 827ms 122ms 5ms 1730ms
国内マットレス 3ms 30743ms 560ms 128ms 3ms 31437ms
国内寝装品 3ms 11259ms 510ms 333ms 7ms 12112ms
万鵬家具 3ms 223ms 363ms 100ms 6ms 695ms

計測時刻: 2026-08-13 15:08頃(ピーク時間帯 07:00〜22:00 に該当)。

同じメーカーでも実行回によって遅延する対象が入れ替わることを既に確認済みで、
コピー先ファイル固有の構造上の問題(数式・条件付き書式・入力規則)は
ヒアリングにより否定済み。Google側の一時的な状態(コールドスタート/
ファイルへの同時アクセス/バックエンド混雑)に起因すると推測している。

想定される原因

SpreadsheetApp.openById() は、指定した範囲だけでなくスプレッドシート
全体(全シート・書式・グラフ・保護範囲など)をオブジェクトモデルとして
構築するコストがかかる。この「全体を開く」オーバーヘッドが、
遅延の主因ではないかと推測している。

検討したい対応

openSpreadsheet() / getSheet() / copyMakerData() の一部を、
GASの Advanced Google Services で有効化できる Sheets API
(Sheets.Spreadsheets.Values.get / update)に置き換える。
Sheets APIは対象範囲のみをHTTPで直接やり取りするため、
オブジェクトモデル構築のオーバーヘッドを回避できる可能性がある。

過去の関連実績

78万セル規模のマスターコピー処理において、Sheets API導入により
高速化した実績がある。ただしそのケースは大量データの読み書き
(getValues/setValues)自体がボトルネックだったのに対し、
今回は「開く」処理がボトルネックである点で性質が異なる。
そのため、今回も同様に効果があるかは実証が必要。

検証ステップ(着手時)

  • 遅延が再現しやすいメーカー(国内マットレス等)を対象に、
    Sheets API版の openById 相当処理を試験実装
  • DEBUG_TIMING と同様の計測ログを追加し、既存方式とAPI呼び出し
    回数・所要時間を比較
  • 複数回・複数時間帯で計測し、変動要因(時間帯/ファイル)との
    相関を確認
  • 効果が確認できた場合のみ、認証スコープ追加を含めた本実装に着手

優先度・緊急性

現状の合計実行時間(約90〜100秒)はGASの6分制限に対して十分余裕があり、
緊急対応は不要。SRE的な安定化フェーズでの改善候補として着手する。

関連ファイル

  • GetSalesSummaryAcquisition/06_売れ数転記_改修.gs

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions