【必見】GASパフォーマンス改善テクニック|遅い処理を爆速化するスクリプト例まとめ!

「GASでスクリプトを書いたけど、動作がやたら重い…」
「大規模データを処理するとタイムアウトする…」
そんな悩みを抱えているあなたに向けて、GASパフォーマンス改善の具体例を一挙公開します!

この記事では、実際に使えるスクリプト例と一緒に、GASを爆速化するための鉄則をわかりやすく解説していきます。


1. なぜGASスクリプトは遅くなるのか?

まず、原因を正しく理解しましょう。

【GASが遅くなる主な理由】

  • スプレッドシートのセル単位操作が多い

  • getRange()setValue()何度も繰り返している

  • 外部APIとの通信回数が多い

  • 無駄なループやネストが深い

  • 同期的(逐次)に実行している

  • エラーハンドリングが甘くリトライできない

つまり、
**「小さい操作を大量に繰り返すコード」**は、GASでは致命的にパフォーマンスが落ちます。


2. 【基本鉄則】パフォーマンス改善5大原則

GASを速くするための鉄板ルールはこちら!

✅ 原則① まとめて読む・まとめて書く

✅ 原則② スプレッドシートは最小限しか触らない

✅ 原則③ ローカル変数で処理して最後に反映

✅ 原則④ 必要なデータだけ対象にする(フィルタリング)

✅ 原則⑤ 外部通信は極力減らす・まとめる

この5原則を意識するだけで、体感3倍以上速くなるケースも珍しくありません。


3. 【スクリプト例】パフォーマンスが悪いコードと改善コード

ここでは、具体例を交えて改善方法を学んでいきましょう。


✖️ NG例:超遅いコード

function slowUpdate() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  
  for (let i = 2; i <= lastRow; i++) {
    sheet.getRange(i, 2).setValue('更新完了');
  }
}

問題点

  • 毎回シートにアクセスしている

  • セル単位で書き込みしている

これでは数百件でタイムアウト必至!


◎ 改善例:爆速コード

function fastUpdate() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  
  const updateValues = Array.from({ length: lastRow - 1 }, () => ['更新完了']);
  sheet.getRange(2, 2, lastRow - 1, 1).setValues(updateValues);
}

改善ポイント

  • ローカルでまとめてデータを作成

  • 一括で書き込み(setValues

→ 数千行でもあっという間に完了します!


4. 【スクリプト例】データ処理の爆速化テクニック


✅ データ取得は一度にまとめる

const data = sheet.getDataRange().getValues();

これだけで、シート全体のデータをローカル変数にまとめて保持できます。
後はこのdata配列を操作するだけ!


✅ 条件フィルタリングしてからループ

const filteredData = data.filter(row => row[3] === '未処理');
for (const row of filteredData) {
  // 必要な処理だけ
}

無駄なループを回さないことで、劇的に速くなります。


✅ 必要な範囲だけを対象にする

const range = sheet.getRange('A2:E100');
const smallData = range.getValues();

使わない列や行まで取得しないだけで、GASの負荷は大幅に軽減します。


5. 【スクリプト例】外部通信の高速化(API・メール送信)


✖️ NG例:1件ずつ送信

function sendIndividualMails() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  
  for (let i = 1; i < data.length; i++) {
    GmailApp.sendEmail(data[i][1], 'お知らせ', '本文');
  }
}

これだと、送信待ち時間がかかるたびに処理がブロックされます。


◎ 改善例:バッチ送信(もしくは集約)

  • 件数制限内(Gmailは1日500件)なら、まとめて送る

  • もしくは、外部APIなら非同期処理(Promise化)を使う

GASは同期実行が基本ですが、通信回数を減らす設計だけでも十分速くなります!


6. 【応用編】さらにパフォーマンスを追求するTips


flush()は必要なときだけ使う

SpreadsheetApp.flush()は「すべての書き込みを即座に反映」する関数ですが、
頻繁に使うと逆にパフォーマンスが悪化するので注意!


✅ キャッシュを活用する

計算結果や外部データをCacheServiceで一時保存しておけば、再取得を防げます。


✅ エラーハンドリング+リトライ処理

エラー発生時に自動リトライする仕組みを入れると、無駄な再実行を防げます。

function safeApiCall() {
  try {
    // API呼び出し処理
  } catch (e) {
    Utilities.sleep(5000);
    // 再試行
  }
}

7. まとめ|GASスクリプトも「書き方次第」で爆速化できる!

GASが遅いのは、Googleのせいでも、PCのせいでもありません。
正しい書き方を知っていれば、劇的に高速化できるのです!

まずは、

  • データ取得&書き込みをまとめる

  • スプレッドシートアクセスを最小化

  • 通信回数を減らす

  • 必要な処理だけに絞る

この4つを徹底しましょう!

今日からあなたのGASスクリプトも、サクサク爆速に生まれ変わります。
次は、どんなスクリプトを高速化してみたいですか?🚀

Shop now