GASのCacheServiceでAPI結果を
一時保存して高速化する方法
毎回同じ外部APIを呼んだり重い集計を回したりして、処理が遅くなっていませんか。CacheService(一時データを高速に読み書きする仕組み)で結果を一定時間キャッシュし、無駄な再計算を減らす方法を解説します。
Table of Contents
CacheServiceとは何か
CacheService(キャッシュサービス)は、GASで「一時的なデータ」を高速に読み書きするための仕組みです。 保存した値は指定した有効期限(最大6時間)が来ると自動で消えます。 「消えても困らないが、毎回作り直すと遅いデータ」を置く場所だと考えると分かりやすいです。
外部APIの結果
為替レートや天気など、少しの間なら古くても問題ないデータの再取得を減らす
重い集計の結果
大量行の合計・ランキングなど、計算に時間がかかる結果を使い回す
共通マスタの読み込み
別シートやDBから読むマスタ情報を一定時間キャッシュしてアクセスを速くする
Webアプリの一時状態
doGet/doPostで作るWebアプリで、短時間だけ保持したい状態を置く
永続的に残したいAPIキーや設定値は、消えると困るためPropertiesServiceを使います。「一時的な高速化=Cache」「永続的な設定=Properties」と覚えておきましょう。
put / get / remove の基本
まずキャッシュの入れ物をgetScriptCache()で取得し、putで保存、getで取得します。保存できる値は文字列だけで、取得時も文字列で返る点に注意してください。
function cacheBasics() {
const cache = CacheService.getScriptCache();
// 保存: put(キー, 値, 有効期限の秒数)
// 値は文字列のみ。第3引数は最大21600秒(6時間)、省略時は600秒
cache.put("rate_usd", "156.3", 3600); // 1時間
// 取得: 無ければ null が返る
const value = cache.get("rate_usd");
Logger.log(value); // "156.3"(文字列で返る点に注意)
// 削除
cache.remove("rate_usd");
}外部API結果をキャッシュする「キャッシュ優先」パターン
CacheServiceで最もよく使うのが、この「キャッシュ優先(cache-first)」パターンです。 まずキャッシュを見て、ヒットすればそれを返す。無いときだけ本体(外部API)を実行し、結果をキャッシュに入れてから返します。 これだけで、有効期限内のアクセスはAPIを一切呼ばなくなります。
// 外部APIの結果を1時間キャッシュする「キャッシュ優先」パターン
function getExchangeRate() {
const cache = CacheService.getScriptCache();
const key = "usd_jpy";
// 1. まずキャッシュを見る
const cached = cache.get(key);
if (cached !== null) {
return Number(cached); // ヒットしたら即返す(APIを呼ばない)
}
// 2. 無ければ本体(外部API)を実行
const res = UrlFetchApp.fetch("https://api.example.com/rate/usdjpy");
const rate = JSON.parse(res.getContentText()).rate;
// 3. 結果をキャッシュに保存して返す
cache.put(key, String(rate), 3600);
return rate;
}get()は必ずnullが返る可能性があります。「キャッシュが無ければ本体を実行する」フォールバックを省略しないことが安定運用のコツです。
オブジェクトや配列をJSONで保存する
保存できるのは文字列だけなので、オブジェクトや配列はJSON.stringify()で文字列にしてから保存し、取り出すときにJSON.parse()で元に戻します。1つの値は最大100KBまでです。
// オブジェクトや配列は JSON にしてから保存する
function cacheObject() {
const cache = CacheService.getScriptCache();
const data = { name: "山田太郎", items: ["A", "B", "C"] };
// 保存: 文字列化(JSON.stringify)
cache.put("profile", JSON.stringify(data), 1800);
// 取得: null チェックしてから復元(JSON.parse)
const raw = cache.get("profile");
if (raw === null) {
return null; // 期限切れ or 未保存
}
const restored = JSON.parse(raw);
Logger.log(restored.items.length); // 3
return restored;
}putAll / getAll で一括読み書きする
多数のキーを1つずつput/getすると通信回数が増えて遅くなります。putAll()/getAll()でまとめて扱うと高速です。getAll()はヒットしたキーだけを返すため、返ってこないキーは「未ヒット」と判断できます。
// 多数のキーをまとめて読み書きすると通信回数が減って速い
function cacheBulk() {
const cache = CacheService.getScriptCache();
// 一括保存: putAll(オブジェクト, 有効期限)
cache.putAll(
{
user_1: JSON.stringify({ name: "田中" }),
user_2: JSON.stringify({ name: "佐藤" }),
user_3: JSON.stringify({ name: "鈴木" }),
},
600
);
// 一括取得: getAll(キー配列) → { キー: 値 } が返る(無いキーは含まれない)
const found = cache.getAll(["user_1", "user_2", "user_9"]);
Logger.log(Object.keys(found)); // ["user_1", "user_2"](user_9 は未ヒット)
// 一括削除
cache.removeAll(["user_1", "user_2", "user_3"]);
}スクリプト・ユーザー・ドキュメントの使い分け
CacheServiceには3つのストアがあり、「誰と共有するか」で使い分けます。 全員共通ならgetScriptCache()、利用者ごとに分けるならgetUserCache()、特定のファイルに紐づけるならgetDocumentCache()です。
// 3種類のストアを用途で使い分ける
function cacheStores() {
// 全ユーザー共通のデータ(為替、共通マスタなど)
const scriptCache = CacheService.getScriptCache();
// 実行しているユーザーごとに分けたいデータ(その人の検索結果など)
const userCache = CacheService.getUserCache();
// 特定のスプレッドシート/フォームに紐づくデータ
const docCache = CacheService.getDocumentCache();
scriptCache.put("shared_master", "v2026-07", 21600);
userCache.put("last_search", "GAS 高速化", 600);
if (docCache) docCache.put("sheet_state", "ready", 600);
}getDocumentCache()はスプレッドシートなどのコンテナに紐づくスクリプトでのみ使え、そうでない環境ではnullが返ります。使う前にnullチェックを入れておくと安全です。
重い集計結果をキャッシュして高速化する
外部APIだけでなく、GAS内の重い処理にもキャッシュ優先パターンが効きます。 例えばダッシュボード用の集計を毎回計算し直すと遅くなりますが、結果を数分キャッシュすれば2回目以降は一瞬で返せます。
// 重い集計結果をキャッシュしてダッシュボードを高速化する例
function getDashboardSummary() {
const cache = CacheService.getScriptCache();
const key = "dashboard_summary";
const cached = cache.get(key);
if (cached !== null) {
return JSON.parse(cached);
}
// ここが重い処理(大量行の集計など)
const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
const rows = sheet.getDataRange().getValues().slice(1);
const total = rows.reduce((sum, r) => sum + Number(r[3] || 0), 0);
const summary = { total: total, count: rows.length };
// 10分キャッシュ。次のアクセスは即返る
cache.put(key, JSON.stringify(summary), 600);
return summary;
}集計の元データが更新されたタイミングでremove()を呼んでキャッシュを消せば、次のアクセスで最新の集計に切り替わります。
実務での注意点
1. get() は null になる前提で書く
有効期限内でも、Google側の都合でキャッシュが破棄されることがあります。「キャッシュがあれば使う、無ければ作り直す」という設計を常に守り、キャッシュの存在を前提にしないでください。
2. 100KB・6時間・250文字の上限を超えない
1つの値は最大100KB、有効期限は最大21600秒(6時間)、キー名は最大250文字です。これを超えるとエラーになったり保存されなかったりします。大きなデータはスプレッドシートやDriveに置き、キャッシュには要約や集計結果だけを入れましょう。
3. 更新頻度と鮮度のバランスを決める
有効期限を長くするほど高速になりますが、その分だけ古いデータが表示される時間も延びます。為替なら数分、共通マスタなら数時間など、「どれくらい古くても許容できるか」でキャッシュ時間を決めるのがポイントです。
4. 秘密情報のキャッシュは慎重に
スクリプトキャッシュは同じスクリプトを使う全員から見えます。個人情報や認証トークンなど、利用者ごとに分けるべきデータはユーザーキャッシュを使うか、そもそもキャッシュしない判断も必要です。
まとめ
CacheServiceは、外部APIの結果や重い集計を一定時間キャッシュして処理を高速化する仕組みです。基本は「キャッシュを見て、無ければ作ってから保存する」というキャッシュ優先パターン。 オブジェクトはJSONで保存し、多数のキーはputAll/getAllでまとめ、共有範囲でスクリプト・ユーザー・ドキュメントを使い分けます。get()がnullを返す前提と、100KB・6時間の上限さえ押さえれば、少ないコードで体感速度を大きく改善できます。
よくある質問
CacheServiceは有効期限(最大6時間)が来ると自動で消える一時保存で、外部APIの結果や重い集計結果のキャッシュに向いています。PropertiesServiceは明示的に消すまで残る永続保存で、APIキーや設定値の保管に向いています。「消えてもいい高速化のためのデータ」はCache、「消えると困る設定」はPropertiesと使い分けます。
1つのキーに保存できる値は最大100KB、キー名は最大250文字までです。オブジェクトはJSON.stringifyで文字列にしてから保存します。100KBを超える場合はデータを分割するか、CacheServiceではなくスプレッドシートやDriveへの保存を検討してください。
putの第3引数で秒数を指定でき、最大は21600秒(6時間)です。省略すると600秒(10分)です。なお有効期限内でも、Google側の都合でキャッシュが破棄されることがあります。get()がnullを返す前提で、必ず「キャッシュが無ければ本体を実行する」フォールバックを用意してください。
全員で同じ結果を共有してよいデータ(為替レート、共通マスタなど)はgetScriptCache()、利用者ごとに違うデータ(そのユーザーの表示設定や検索結果)はgetUserCache()を使います。特定のスプレッドシートやフォームに紐づくデータはgetDocumentCache()が使えます。
できます。putAll()にキーと値のオブジェクトを渡せば一括保存でき、getAll()にキー配列を渡せば一括取得できます。多数のキーを個別にput/getするより通信回数が減り高速です。putAllも各値100KB・全体で合計の上限があるため、大量のときは分割してください。
関連するサービス・記事
GAS実装テクニック・制約の回避策・業務システム開発のノウハウをまとめた記事一覧です。
技術記事一覧を見る →
APIキーや設定値を永続保存するPropertiesServiceの使い方を解説します。キャッシュとの使い分けの参考にどうぞ。
PropertiesServiceで設定値を安全に保存する方法を見る →
外部API呼び出しを安定させるリトライ設計。キャッシュと組み合わせるとAPI呼び出し回数をさらに減らせます。
Claude APIの429エラーに強い自動リトライを見る →
スプレッドシート自動化・帳票作成・外部API連携など、GAS開発の依頼内容と流れを説明します。
GAS開発の対応範囲を見る →
GAS開発・業務Webシステムを
相談する。
キャッシュによる高速化のほか、外部API連携・帳票出力・Gmail自動化など、日々の業務を効率化するGAS開発をご相談いただけます。