GoogleドキュメントでGoogle Apps Script(GAS)を使っていると、ある日突然「実行回数が上限に達しました」というエラーが表示されることがあります。この制限はGoogleのサービス全般に設定されているクォータ(割当量)によるもので、特に業務で大量のデータを処理するスクリプトを頻繁に実行する場合に遭遇しやすい問題です。制限に当たった場合、単に待つだけでなく、スクリプトの処理を分割して実行回数を効率的に使う方法が有効です。ここでは、具体的な原因と確認手順、分割処理の実装方法、失敗パターン、そして管理者に伝えるべき情報を詳しく解説します。
【要点】この記事で確認すること
- 最初に見る場所: Google Apps Scriptエディタの「現在の制限」から現在のクォータ使用状況を確認する。また、実行ログやエラーメッセージの内容を確認する。
- 切り分けの軸: 制限の種類(1日あたりの実行回数、同時実行数、合計実行時間など)を特定し、その上限に達しているのかどうかを切り分ける。また、スクリプトの処理内容(データ量やループ回数)が適切かどうかも判断する。
- 注意点: 会社PCで共有ドライブや組織アカウントを使っている場合、スクリプトの変更には管理者の承認が必要なケースがある。また、分割処理を導入してもクォータそのものが増えるわけではないため、根本的な改善には管理者によるクォータ引き上げ申請が必要な場合もある。
ADVERTISEMENT
発生原因とクォータの種類
Google Apps Scriptには、サービスクォータと呼ばれる利用制限が設けられています。この制限はGoogle Workspaceの全エディション共通のものと、利用者ごとに異なるものがあります。主な制限には以下の種類があります。
| 制限の種類 | 内容 | 代表的な上限値 |
|---|---|---|
| 実行回数(1日あたり) | スクリプト全体の実行回数。時刻トリガーやカスタムメニューからの呼び出しも含む。 | コンシューマー版: 90回/日、Workspace版: 20,000回/日(エディションにより変動) |
| 合計実行時間(1日あたり) | すべてのスクリプト実行の合計時間。長時間実行で制限に当たりやすい。 | コンシューマー版: 1時間、Workspace版: 6時間~無制限(エディションによる) |
| 同時実行数 | 同時に実行できるスクリプトの数。トリガーが重なるとエラーになる。 | コンシューマー版: 1、Workspace版: 30 |
| 特定サービスクォータ | Gmail送信やURL Fetchの呼び出し回数など、サービス固有の制限。 | 例: Email受信者数(1日): 100、URL Fetch(1日): 20,000 |
これらの制限に達すると、スクリプトが途中で停止し「実行回数が上限を超えました」や「スクリプトがタイムアウトしました」といったエラーが発生します。特に、1日に何度もスクリプトを実行するバッチ処理や、大量のデータをループして処理するケースで頻発します。
制限に当たったときの確認手順
1. エラーメッセージと実行ログの確認
まずは、スクリプトエディタの「表示」→「ログ」または「実行数」から最新の実行ログを確認します。エラーが発生した場合、赤いアイコンが表示され、詳細メッセージに「Quota exceeded」や「Maximum execution time exceeded」などと記載されます。これによりどの制限に引っかかったかが特定できます。
2. 現在のクォータ使用状況の確認
スクリプトエディタのメニューから「表示」→「現在の制限」を選択します。ここには、そのスクリプトに適用されているサービスクォータの使用量と上限が一覧表示されます。「今日の実行数」「今日の合計実行時間」などを確認し、上限に近づいていないかチェックします。また、同じGoogleアカウントで他のスクリプトが動作していないかも確認しましょう。
3. トリガーの設定と実行間隔の見直し
スクリプトに時刻トリガーやイベントトリガーが設定されている場合、その実行間隔が短すぎると制限に当たりやすくなります。トリガーの設定画面から実行頻度を確認し、必要以上に頻繁に実行されていないか見直します。たとえば、1分ごとに実行するトリガーを10分ごとに変更するだけで、実行回数が大幅に削減できます。
分割処理の実装方法
制限を回避するには、一度にすべての処理を行わず、小さな単位に分割して実行する方法が効果的です。代表的な分割手法は「チャンク分割」と「ジョブ分割」です。以下に具体的な手順を示します。
チャンク分割(データ件数で分割)
大量のデータを処理する場合、一度に処理する行数やアイテム数を制限し、複数回に分けて実行します。次の例では、スプレッドシートのデータを100行ずつ処理します。
- 処理対象のデータ件数(例: 全行数)を取得します。
- 1回のバッチで処理する最大件数(例: 100行)を設定します。
- ループ内で開始行と終了行を計算し、その範囲のデータのみを処理します。
- 1回の処理が終わるごとに、次回の開始位置を保存するためにスクリプトプロパティや一時ファイルに保存します。
- すべてのデータを処理完了したら、トリガーを削除するなどの後処理を行います。
この方法では、スクリプトを複数回呼び出す必要があるため、時間トリガーを使って一定間隔で実行させるか、または再帰的にスクリプトを呼び出す実装にします。ただし、再帰呼び出しは実行回数を消費するため、トリガーを使うほうが管理しやすい場合があります。
ジョブ分割(機能単位で分割)
処理内容が複数の独立した機能から構成されている場合、各機能を別々の関数に分け、それぞれを個別のトリガーやカスタムメニューから実行できるようにします。たとえば、「データ取得」「加工」「出力」の3工程をそれぞれ別の関数に分割し、それぞれを逐次実行するか、1日あたりの実行回数を分散させます。
// 分割処理の例(疑似コード)
function processBatch(batchSize) {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var totalRows = data.length;
var startRow = getStartRow(); // プロパティから前回の続きを取得
var endRow = Math.min(startRow + batchSize, totalRows);
for (var i = startRow; i < endRow; i++) {
// 各行の処理
}
saveStartRow(endRow);
if (endRow < totalRows) {
// まだ処理が残っていればトリガーを設定して次回実行
ScriptApp.newTrigger('processBatch').timeBased().everyMinutes(5).create();
} else {
// 完了したのでトリガー削除
var triggers = ScriptApp.getProjectTriggers();
for (var j = 0; j < triggers.length; j++) {
ScriptApp.deleteTrigger(triggers[j]);
}
}
}
注意点として、トリガーを動的に作成する場合は、既存のトリガーを削除しないと無制限にトリガーが増えるため、管理が必要です。また、トリガーの作成にもクォータが消費されます(トリガー数に上限あり)。
失敗パターンと注意点
パターン1: 分割数が多すぎてトリガークォータに引っかかる
分割処理のために大量のトリガーを作成すると、プロジェクトあたりのトリガー数上限(現在は20個)に達する可能性があります。トリガーを使いすぎないよう、1つのトリガーで複数バッチを処理するか、トリガー数を監視する仕組みを入れてください。
パターン2: 再帰呼び出しでスタックオーバーフローや実行時間超過
再帰的にスクリプトを呼び出す方法は、1回の実行時間を短縮できる反面、再帰の深さが増すとスタックエラーや合計実行時間の制限に引っかかることがあります。再帰呼び出しはせずに、時間トリガーで一定間隔をあけて実行するほうが安全です。
パターン3: 分割単位が小さすぎて逆にオーバーヘッドが増加
1回のバッチサイズを極端に小さくすると、スクリプトの起動オーバーヘッドが増え、かえって合計実行時間が長くなることがあります。適切なバッチサイズは、処理内容やデータ量によりますが、数百から数千単位で調整するとよいでしょう。
管理者に伝えるべき情報
もし会社の管理下にあるGoogle Workspaceアカウントでクォータ制限に頻繁に当たる場合、管理者に以下の点を伝えることで、根本的な解決につながる可能性があります。
- クォータの増加申請: Google Workspaceのエディションによっては、管理者がGoogleに申請して特定のクォータを引き上げてもらうことができます。特にBusiness StandardやEnterpriseエディションでは、上限が高く設定されています。
- エディションの見直し: 現在のエディションがコンシューマー版やBusiness Starterの場合、Business Standard以上にアップグレードすることで利用可能なクォータが大幅に増加します。
- スクリプトの監査: 組織内で同じアカウントを使用している場合、他のスクリプトがリソースを消費している可能性があります。管理者に監査を依頼し、不要なスクリプトの停止や最適化を促してください。
よくある質問
Q1: 分割処理をしてもすぐに制限に当たってしまいます。どうすればよいですか?
分割処理のバッチサイズや実行間隔を見直してください。また、他のスクリプトが同じアカウントで動作していないか確認しましょう。それでも改善されない場合は、管理者にエディションのアップグレードやクォータの引き上げを依頼してください。
Q2: トリガーを使わずに分割処理する方法はありますか?
可能です。スクリプト内で「CacheService」や「PropertiesService」を使って処理の続きを保存し、ユーザーが手動で繰り返し実行する仕組みも考えられます。ただし、自動化には不向きです。また、Googleの「シンプルトリガー」(onOpenなど)も利用できますが、実行回数や時間制限は同様に適用されます。
Q3: 分割処理のバッチサイズはどれくらいが適切ですか?
一般的な目安として、1回のスクリプト実行で処理する行数を1,000~5,000行程度に設定すると、実行時間が数分以内に収まることが多いです。ただし、データの複雑さやAPI呼び出しの有無によって調整してください。最初は小さめの値(100行など)から始めて、制限に当たらない範囲で徐々に増やすと安全です。
まとめ
Googleドキュメントのスクリプト実行回数制限に当たった場合、まずは現在のクォータ使用状況を確認し、何の制限に引っかかっているのかを特定することが重要です。その上で、処理を分割する方法としてチャンク分割やジョブ分割を導入することで、制限を回避しながらスクリプトを継続して実行できるようになります。ただし、分割処理だけでは根本的な解決にならないケースもあるため、管理者と協力してエディションの見直しやクォータの増加申請を検討してください。また、定期的に実行ログとトリガー設定を確認し、適切なバッチサイズと実行間隔を保つことで、安定した運用が可能になります。
ADVERTISEMENT
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Office・仕事術の人気記事ランキング
- 【Word】差し込み印刷で数字の桁を整える!金額にカンマ(桁区切り)を入れる設定
- 【Teams】メッセージを「保存済み」にして後で読む!重要なチャットをブックマークして整理する技
- 【Outlook】添付ファイルが「Winmail.dat」に化ける!受信側が困らない送信設定
- 【Copilot】「サービスに接続できません」エラーの原因切り分けと対処法
- 【PDF】PDFのサムネイルプレビューが表示されない!エクスプローラーの設定とAcrobat環境設定
- 【PDF】PDFに入力した文字の「フォント・サイズ・色」を変更するプロパティ設定
- 【Excel】文字がセルの枠からはみ出す・隠れる!「折り返して表示」と「縮小して全体を表示」の使い分け
- 【Word】校閲機能の基本!赤字(変更履歴)とコメントで修正を見える化する
- 【神技】保存せずに閉じたExcel・Wordファイルを復元する!消えたデータを復活させる4つの救出法
- 【Teams】会議の「参加者リスト」を出席後にダウンロードする!誰が参加したか確認する手順
