GASの実行制限を理解し、効率的なコードを書くコツ

GASパフォーマンス最適化
GASの実行制限を理解し、効率的なコードを書くコツのサムネイル

GASの実行制限を理解し、効率的なコードを書くコツ

こんにちは、GASおじです。今日は中小企業の経営者さんやフリーランスの皆さんにぜひ知ってほしい、Google Apps Script(以下GAS)の実行制限と、それを踏まえた効率的なコードの書き方についてお話しします。GASはGoogleアカウントの利用枠内で追加の専用SaaS料金なしに使えますが、quotaや実行時間の上限があるので、無闇に書くと途中で止まったり、無駄なコストがかかることもあります。おじさんの経験をもとに、具体的なコード例も交えて解説していきますね。

GASの実行制限とは何か?

GASは無料で使いやすい反面、1日の実行時間やAPI呼び出し回数などに上限があります。例えば、一般的なGoogleアカウントでは1日あたりの実行時間は約6時間、1回の実行は最大6分程度とされています。これを超えるとスクリプトが途中で止まったり、次の実行まで待たされることもあるんですよ。

また、API呼び出し回数も制限があり、多数のセルを1つずつ更新するとすぐに上限に達してしまいます。特に中小企業やフリーランスの方が日常業務で大量データを扱う場合、この制限を理解して効率化しないと、作業が遅れるばかりか、思わぬ課金や追加コストにつながることもあります(もちろんGAS自体は追加SaaS料金なしですが、時間コストや外部連携で課金されるケースもあるので要注意です)。

効率的なコードを書くためのポイント

1. 入力データの検証を必ず行う

無駄な処理を減らすには、そもそも処理対象のデータが正しいかチェックすることが大事。たとえば「数値でなければ処理しない」といった条件を作ることで、不要なAPI呼び出しを減らせます。

2. 一括処理(バッチ処理)を活用する

GASはセル1つ1つに対して操作するとAPI呼び出しが増え、制限にすぐ達します。そこで、できるだけまとめて処理するバッチ処理を採用しましょう。具体的には、範囲の値を一度に取得・設定し、配列操作で値を変換してから一括で書き戻す方法です。

3. 既存データは残しつつ、新しい日時付きシートやファイルに結果を書く

既存データを消してしまうと、誤操作やトラブル時に復旧が面倒。なので、処理結果は新しい日時付きのシートやファイルに書き出すのがベスト。これによってバックアップ・ロールバックも容易になります。

具体例:入力検証+バッチ処理+日時付き出力

以下は、スプレッドシートの「元データ」シートから数値データを抜き出し、数値でないものは除外し、結果を新しい日時付きシートに一括出力するコード例です。

function processAndBackupData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = ss.getSheetByName('元データ');
  if (!sourceSheet) {
    Logger.log('元データシートが見つかりません');
    return;
  }
  
  // データ範囲の取得
  var dataRange = sourceSheet.getDataRange();
  var values = dataRange.getValues();
  
  // 入力検証&加工(数値のみ抽出)
  var processed = values.filter(function(row) {
    return row.every(function(cell) {
      return typeof cell === 'number' && !isNaN(cell);
    });
  });
  
  if (processed.length === 0) {
    Logger.log('有効な数値データがありません');
    return;
  }
  
  // 新規シート名を日時付きで作成
  var timestamp = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), 'yyyyMMdd_HHmmss');
  var newSheetName = '処理結果_' + timestamp;
  var newSheet = ss.insertSheet(newSheetName);
  
  // バッチ書き込み
  newSheet.getRange(1, 1, processed.length, processed[0].length).setValues(processed);
  
  Logger.log('処理完了。新しいシートに結果を書き込みました: ' + newSheetName);
}

この例では、既存の「元データ」シートは一切変更せず、新しい日時付きシートに結果を書き出しています。これなら元データはそのまま保持され、誤ってデータを消す心配はありません。

初期設定と必要権限、復元手順について

  • 初期設定
    このスクリプトはスプレッドシートの編集権限を持つGoogleアカウントで実行してください。
    また、スクリプトエディタから「processAndBackupData」を登録しておき、手動またはトリガーで実行可能です。

  • 必要権限
    実行時に「スプレッドシートの閲覧・管理」が必要になるため、初回実行時に認証を求められます。
    ※個人情報を扱う場合は、スプレッドシートの共有設定やアクセス権限に十分注意してください。

  • installable trigger(インストール型トリガー)
    定期的に実行したい場合は、Google Apps Scriptの「トリガー」設定画面から、時間ベースのインストール型トリガーを設定してください。
    (例:毎日朝9時に自動実行)

  • バックアップ・復元手順
    処理結果は新しいシートに保存されるため、元データは常に残ります。もし間違いがあった場合は、処理結果のシートを削除するだけでロールバック可能です。
    万が一、元データ自体を誤って編集してしまった場合も、Google スプレッドシートの「バージョン履歴」機能で復元が可能です。

コスト削減効果の目安

仮に、1回の処理で10,000セルを1つずつ更新すると、API呼び出しが10,000回に達しますが、バッチ処理で一括更新すれば1回で済みます。これにより、API呼び出し回数が大幅に減り、スクリプトの実行時間も短縮。
例えば、API呼び出し1回あたりの処理時間を0.01秒と仮定すると、10,000回×0.01秒 = 100秒が1回のバッチ処理なら約1秒に短縮可能。
時間コスト削減やスクリプト実行制限回避による業務効率アップは、結果的に作業工数の削減に直結します。


GASおじはこれからも、みなさんの業務効率化に役立つ情報やツールを提供していきます。
興味のある方は、ぜひメンバーシップで500以上の便利ツールを活用してくださいね。

GASおじラボで500ツール使い放題 →