ADVERTISEMENT

【Googleスプレッドシート】Apps ScriptでCacheServiceを使った結果キャッシュ!速度改善の手段

【Googleスプレッドシート】Apps ScriptでCacheServiceを使った結果キャッシュ!速度改善の手段
🛡️ 超解決

Apps Scriptで作成した関数の処理が重くて困っている方はいませんか。大量データの取得や外部APIの呼び出しを繰り返すたびに、毎回同じ計算が実行されて時間がかかってしまいます。そんなときに役立つのがCacheServiceです。CacheServiceを使えば、計算結果を一時的に保存して再利用することで、処理速度を大幅に改善できます。この記事では、CacheServiceの基本的な使い方から実践的な応用例までをわかりやすく解説します。

【要点】CacheServiceでApps Scriptの処理を高速化する方法

  • CacheService.getScriptCache(): スクリプト全体で共有できるキャッシュを取得します。複数のユーザー間でも同じキャッシュを参照できるので、APIレスポンスなどの共通データの保存に適しています。
  • キャッシュへのデータ保存(put): put(key, value, expirationInSeconds)メソッドで、キーと値(文字列)を指定して保存します。有効期限を秒単位で設定でき、最大6時間まで保存可能です。
  • キャッシュからのデータ取得(get): get(key)メソッドで、保存した値を文字列として取得できます。値が存在しない場合はnullが返るため、条件分岐でキャッシュヒット・ミスを判断します。

ADVERTISEMENT

CacheServiceの概要と動作の仕組み

CacheServiceはApps Scriptに組み込まれた一時的なデータ保存領域です。データはメモリ上に保存されるため、スプレッドシートやPropertiesServiceよりも高速に読み書きできます。ただし、保存可能な容量は1キーあたり100KB、合計で500MBまでという制限があります。また、キャッシュの有効期限はデフォルトで600秒(10分)ですが、putメソッドの第3引数で最大21600秒(6時間)まで延長できます。

キャッシュには3種類のスコープがあります。getScriptCache()はスクリプト全体で共有され、getUserCache()はユーザーごと、getDocumentCache()はドキュメント(スプレッドシート)ごとに独立したキャッシュを提供します。用途に応じて使い分けることで、より効率的なキャッシュ戦略を構築できます。

CacheServiceを使ったキャッシュの実装手順

基本的なキャッシュの保存と取得

  1. キャッシュオブジェクトを取得する
    最初にCacheService.getScriptCache()を呼び出して、キャッシュオブジェクトを変数に代入します。このオブジェクトを使ってputやgetなどの操作を行います。
  2. データをキャッシュに保存する
    put(key, value, expirationInSeconds)メソッドを使います。keyは一意な文字列、valueは保存したい文字列、expirationInSecondsは有効期限(秒)です。数値やオブジェクトはJSON.stringify()で文字列化してから保存します。
  3. キャッシュからデータを取得する
    get(key)メソッドで値を取得します。戻り値は文字列なので、必要に応じてJSON.parse()で元のデータに戻します。取得結果がnullの場合はキャッシュにデータが存在しない(期限切れなど)ことを意味します。
  4. 条件分岐でキャッシュを利用する
    キャッシュから取得した値がnullかどうかで、キャッシュヒット・ミスを判定します。ミスの場合は実際の処理(API呼び出しなど)を実行し、その結果を再度キャッシュに保存します。これにより、重い処理を毎回実行せずに済みます。

実践的なコード例:外部APIのレスポンスをキャッシュする

  1. キャッシュキーを設計する
    APIのURLやパラメータを組み合わせて一意なキーを作成します。例えば「weather_tokyo_20250320」のように、リクエスト内容と日付を結合すると、日別のデータをキャッシュできます。
  2. キャッシュをチェックする
    get()で該当キーの値を取得します。値が存在すれば、そのまま利用して関数を終了します。
  3. キャッシュミス時に本処理を実行する
    値がnullの場合はUrlFetchApp.fetch()などでAPIを呼び出し、レスポンスをJSON.parse()して必要なデータを抽出します。
  4. 結果をキャッシュに保存する
    抽出したデータをJSON.stringify()で文字列化し、put()で保存します。有効期限はAPIの更新頻度に合わせて設定します。
function getWeatherData(city) {
  const cache = CacheService.getScriptCache();
  const key = 'weather_' + city;
  const cached = cache.get(key);
  if (cached) {
    return JSON.parse(cached);
  }
  const url = 'https://api.example.com/weather?city=' + encodeURIComponent(city);
  const response = UrlFetchApp.fetch(url);
  const data = JSON.parse(response.getContentText());
  cache.put(key, JSON.stringify(data), 3600); // 1時間キャッシュ
  return data;
}

スプレッドシートのセル範囲をキャッシュする応用例

  1. シートのデータを読み込んでキャッシュする
    大量のセル範囲を何度も読み込む代わりに、スプレッドシートのデータをJSON文字列としてキャッシュします。これにより、毎回SpreadsheetAppへのアクセスを減らせます。
  2. キャッシュの更新トリガーを設定する
    シートが編集されたときなど、データが変更されたタイミングでキャッシュを削除(remove(key))するか、強制的に再キャッシュします。

CacheService使用時の注意点とよくある失敗例

キャッシュが期待通りに機能しない場合

キャッシュミスが頻発する場合、有効期限が短すぎるか、キーが正しく生成されていない可能性があります。putの第3引数で有効期限を適切に設定し、キーに一意な識別子(日付やIDなど)を含めるようにしましょう。また、デバッグ時にはcache.get(key)の戻り値をログ出力して確認します。

キャッシュサイズの制限を超えてしまう

1キーあたり100KB、合計500MBの制限があります。大きなデータをキャッシュする場合は、分割して保存するか、別のストレージ(PropertiesServiceなど)を検討します。また、定期的に不要なキャッシュを削除するためにremove()やremoveAll()を使用することも重要です。

スクリプトキャッシュの共有範囲を誤解している

getScriptCache()は同じスクリプトプロジェクト内の全ユーザー間で共有されます。ユーザー固有のデータをキャッシュしたい場合はgetUserCache()を使用します。また、ドキュメントに紐づくキャッシュが必要な場合はgetDocumentCache()を使います。

キャッシュの有効期限が原因で古いデータを使い続けてしまう

キャッシュの有効期限はputの第3引数で指定しますが、デフォルト600秒です。データの更新頻度に合わせて適切な秒数を設定しないと、古いデータが長期に渡って使われるリスクがあります。重要なデータは短めの有効期限を設定し、必要に応じて手動でキャッシュをクリアする仕組みも用意しましょう。

ADVERTISEMENT

CacheServiceと類似サービスの比較

項目 CacheService PropertiesService スプレッドシートセル
保存場所 メモリ(一時) 永続ストレージ スプレッドシート
読み書き速度 非常に高速 高速 低速
有効期限 最大6時間 なし(永続) なし
容量制限 1キー100KB、合計500MB ユーザーあたり500KB、スクリプトあたり500KB シートのサイズ依存
共有範囲 スクリプト/ユーザー/ドキュメント ユーザー/スクリプト シートの権限に依存

CacheServiceは一時的な高速キャッシュに特化しており、頻繁に変わるデータの高速化に最適です。一方、PropertiesServiceは永続的な設定保存向きで、スプレッドシートは大量データの保存に適しています。用途によって使い分けましょう。

まとめ

CacheServiceを利用すると、Apps Scriptの重い処理をキャッシュして劇的に速度改善できます。具体的には、getScriptCache()でキャッシュオブジェクトを取得し、put/getでデータの保存と読み出しを行います。また、有効期限や共有範囲を考慮して適切なキャッシュ戦略を設計することが重要です。応用例として、外部APIのレスポンスやスプレッドシートの範囲データをキャッシュしてみてください。CacheServiceを活用して、ストレスのない高速なスクリプトを実現しましょう。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。