GASのエラーは、コードの誤り、実行時間、承認、サービスの割り当て、トリガーの実行条件を分けて調べます。
エラーの全文だけでなく、実行した関数・時刻・実行方式・変更範囲を記録します。
エラーメッセージ逆引き早見表
画面に出ている文字列から探してください。各行の「見る場所」が、この記事の該当する節です。
| 出ているメッセージ | 起きていること | 見る場所 |
|---|---|---|
| TypeError: Cannot read properties of null (reading ‘…’) | 取得しようとしたものが見つからず null が返っている(シート名の違い、要素の不在) | TypeErrorとReferenceErrorの節 |
| TypeError: Cannot read properties of undefined | 配列の範囲外、オブジェクトのキー名違い | TypeErrorとReferenceErrorの節 |
| ReferenceError: … is not defined | 変数・関数の名前違い、宣言の抜け、スコープ外 | TypeErrorとReferenceErrorの節 |
| SyntaxError: … | 括弧・引用符・カンマなどの構文が不正。全角スペース自体はJavaScriptで空白として使えるため、それだけを原因と決めつけない | TypeErrorとReferenceErrorの節 |
| Exceeded maximum execution time | 1回の実行が実行時間の上限を超えた | 6分制限と30秒制限の節 |
| Exceeded maximum execution time(セル内の関数で) | カスタム関数の上限(30秒)を超えた。スクリプトの上限とは別 | 6分制限と30秒制限の節 |
| 承認が必要です / このアプリは Google で確認されていません | 承認要求と未確認アプリの警告は別。要求権限、審査状態、組織の制限を確認する | 承認エラーの節 |
| アクセス権がありません / You do not have permission to call … | 実行者の権限不足、またはカスタム関数・単純トリガーでは利用できないサービスを呼んでいる。実行方式も確認する | 承認エラーの節 |
| Service invoked too many times for one day | その日の利用回数の上限に達した | 利用回数の上限の節 |
| Service invoked too many times in a short time / 429 | 短時間の制限、または呼び出し先APIの割り当て超過。HTTP429だけで日次か短時間かは判断しない | 利用回数の上限の節 |
| Service using too much computer time for one day | その日の処理時間の合計が上限に達した | 利用回数の上限の節 |
| CORS policy / blocked by CORS | ブラウザーが別オリジンの応答を読めない。認証・リダイレクト・応答ヘッダーなど、サーバー側の条件も確認する | UrlFetchとCORSの節 |
「Service using too much computer time for one day」「Script invoked too many times per second for this Google user account」は、Google の公式ドキュメントが制限超過時に投げられる例外の例として挙げている文面です(Quotas for Google Services)。
まず実行方式とエラーの発生箇所を確認する
Apps Script左側の「実行数」で、失敗した実行と関数名を確認します。
セル内カスタム関数は、セルのエラー表示と記載された行も確認します。
行番号はプロジェクトごとに違うため、本稿の番号と一致させる必要はありません。onEdit(e)をエディタの実行ボタンから直接実行し、e.rangeでundefinedのエラーが出る場合は、編集イベントの引数が渡されていない可能性があります。イベントオブジェクトはトリガー発火時に渡されるものです。処理内容を確認した練習用コピーで、対象セルを手で編集して試してください。setValue()による書き込みではonEditは発火しません。
ログを共有するときは、認証情報、個人情報、ファイルID、URLの秘密パラメータを除きます。
TypeErrorとReferenceErrorを練習表で再現する
専用の練習表のApps Scriptに次の2関数を保存します。
A8へ =debugMissingSheet()、A9へ =debugMissingVariable() を入力すると、それぞれ意図的にエラーが出ます。
業務用コードやトリガーへ追加する練習ではありません。
function debugMissingSheet() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('存在しない練習シート');
return sheet.getRange('A1').getValue();
}
function debugMissingVariable() {
return missingPracticeValue;
}
| 症状 | 確認と修正 |
|---|---|
| Cannot read properties of null | getSheetByNameがnullを返したのにgetRangeを呼んだ。シート名と存在確認を修正する |
| missingPracticeValue is not defined | 定義されていない変数を参照した。名前の誤り・宣言・スコープを修正する |
| SyntaxError | 構文が不正。括弧や引用符などを直し、保存できる状態にする |
シート不存在は、取得直後に if (!sheet) で停止させると対象名を含むエラーにできます。
Googleスプレッドシート│GASでスプレッドシートのA1セルの値を取得する方法のガードを使って、練習表でこの違いを確認できます。
DriveApp.getFolderByIdなどが例外を投げるケースまで、すべてnullチェックで直せるわけではありません。
呼び出すサービスの仕様を確認します。
練習後はA8・A9の式と、故意にエラーを起こす関数を削除します。
エラーをcatchして握りつぶすと、成功したように見えて原因が残るため、必要な状態を記録したうえで停止させます。
6分制限と30秒制限を混同しない
実行時間の上限は「スクリプトとして実行する場合」と「セルの中のカスタム関数として実行する場合」で別です。Google の公式ドキュメントの値は次のとおりです(Quotas for Google Services)。
| 項目 | 無料の Google アカウント | Google Workspace アカウント |
|---|---|---|
| スクリプトの実行時間(Script runtime) | 6分 / 1回 | 6分 / 1回 |
| カスタム関数の実行時間(Custom function runtime) | 30秒 / 1回 | 30秒 / 1回 |
| 同時実行(Simultaneous executions per user) | 30 / ユーザー | 30 / ユーザー |
| トリガーの合計実行時間(Triggers total runtime) | 90分 / 日 | 6時間 / 日 |
セルに =MYFUNC(A1) のように書いて使う関数は30秒で止まります。通常のエディタ実行では上限が6分のため、この違いが原因の一つになります。ただし、引数の渡し方や利用できるサービス・権限も異なるので、時間だけで原因を断定しません。
6分に近づいたときに効く書き換え(1セルずつ読み書きをやめる)
シートを1セルずつ読み書きしている場合は、サービス呼び出し回数が処理時間を増やす要因になります。1行ずつ getRange().getValue() / setValue() を呼ぶ形を、まとめて1回にします。
// 比較用の断片です。sheetとlastRowは実行前に定義します。
// A列は数値、B列は上書き可能な練習範囲を使います。
// 2つの方式は比較のため併記しており、片方だけを使います。
// 遅い:1行ごとにシートへアクセスする
for (var i = 2; i <= lastRow; i++) {
var v = sheet.getRange(i, 1).getValue();
sheet.getRange(i, 2).setValue(v * 2);
}
// 速い:まとめて読み、配列で処理し、まとめて書く
if (lastRow >= 2) {
var values = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
var out = values.map(function (row) { return [row[0] * 2]; });
sheet.getRange(2, 2, out.length, 1).setValues(out);
}
getValues() は二次元配列を返し、setValues() は二次元配列を受け取ります。行数・列数が合っていないとエラーになるため、out.length のように書き込む配列から行数を渡すのが安全です。それでも時間が足りない場合は、処理する範囲を分割して複数回に分ける方法に切り替えます。
2026年10月2日に確認した公式の割り当てでは、一般のスクリプト実行は1回6分、カスタム関数は1回30秒です。
onEditなどの単純トリガーにも30秒の制約があります。
時間主導などのインストール型トリガーは、1回の時間に加えて1日の合計実行時間も確認します。
Exceeded maximum execution timeなら、セルごとのサービス呼び出しを、範囲のgetValues・setValuesへまとめられるか確認します。
長い処理は、処理済み位置を保存して次回へ分割します。
再開時の重複書き込みを防ぎ、LockServiceで並行実行を制御します。
改善率は入力件数と実測時間がないと判断できません。
利用回数の上限と短時間の連続呼び出しを区別する
Service invoked too many timesの対象サービスと、in a short timeなどの追記を確認します。
日次割り当てはユーザー単位で、最初のリクエストから24時間後にリセットされる仕様です。
暦の翌日になれば必ず復帰する、という意味ではありません。
短時間の呼び出し過多は、呼び出し削減や制限を設けた再試行を検討します。
日次上限に達した処理を連続で再実行しても解決しません。
承認エラーでは要求権限と実行者を確認する
承認が必要なサービスを初めて使う場合は、権限確認が表示されます。未確認アプリの警告が出るかどうかは、要求するスコープや組織などで異なります。警告の有無にかかわらず、コードと要求権限を確認してから判断します。警告の条件はGoogle公式のOAuthクライアント確認で確認できます。自分で内容を確認できるプロジェクトの承認手順は、おおむね次のとおりです。
- 実行すると、権限の確認を求めるダイアログが出る
- アカウントを選ぶ
- 未確認アプリの警告が出た場合は、内容と組織の利用方針を確認する。進める条件を満たす場合だけ詳細を開く
- 自分のプロジェクトであることと要求権限を確認できる場合に限り、表示された案内から進む。管理者にブロックされている場合は回避しない
- スクリプトが求めている権限の一覧を確認して許可する
つまずきやすい点は次の3つです。
- 複数のアカウントにログインしている:スクリプトの持ち主と違うアカウントで承認すると、そのアカウントに対象ファイルなどの権限がなければ失敗します。承認画面でアカウント名を必ず見ます。
- 求められている権限が広すぎると感じる:権限はコードから自動判定されるほか、マニフェストで明示される場合もあります。使っていないサービスの呼び出しが残っていないか確認します。
- トリガーで動かす場合:インストール型トリガーは登録した人の権限で動きます。手動では通るのにトリガーだと権限エラーになる場合は、誰が登録したトリガーかを確認します。
Authorization is requiredなら、編集者、トリガー作成者、実行アカウント、要求権限を確認します。
カスタム関数と単純トリガーは、実行中に承認を求められないため、承認が必要な処理を移しただけでは動きません。
Drive操作やメールなどは、目的に合った承認付きの実行方式へ分けます。カスタム関数内のYou do not have permission to call …は、ファイル共有を広げても解消しない場合があります。公式の利用可能サービス一覧と照合し、対象外の処理は承認できるメニュー実行などへ移してください。
未確認アプリの警告が出ても、無条件に先へ進まないでください。
自作したコードか、アクセス先と要求権限を説明できるか、組織の制限に触れないか確認します。
手動実行で動いても、別のアカウントが作ったトリガーでは権限が異なる場合があります。
トリガーを作り直す前に、既存の設定と実行履歴を控え、二重起動を防ぎます。別アカウントが作成したトリガーは自分の一覧に表示されないため、共同編集者にも登録状況を確認してください。
UrlFetchとCORSは別の実行場所の問題
UrlFetchAppはGASのサーバー側で実行するHTTPリクエストです。
HTTPの状態コード、相手のAPI仕様、認証、割り当てを確認し、レスポンス全文に秘密が含まれる場合はログへ出しません。
ブラウザーからWebアプリへfetchするときのCORSは、リダイレクト、認証画面、レスポンスヘッダーも関係します。
Content-Typeをtext/plainに変えただけで、必ず応答を読めるようになるとは限りません。
公開範囲を広げる前に、必要な呼び出し方式を見直します。
確認した範囲と、まだ実行していない範囲
本稿のTypeError、ReferenceError、シート不存在のガードは、Google Sheets上の読み取りカスタム関数で実際に確認しました。
本記事で実際に実行して確認したのは、練習表での TypeError・ReferenceError の再現までです。承認後の Drive 処理、トリガーの発火、実際に上限を超えたときの挙動、Web アプリの CORS 通信は当サイトでまだ実行していません。上限値と例外のメッセージは Google の公式ドキュメントの記載に基づいて書いており、実行して再現したものではありません。
上限を故意に使い切るテストはしていません。
Google公式:割り当てと制限、Google公式:単純トリガー、Google公式:カスタム関数を参照します。
操作・GAS・claspの練習ZIPをダウンロードできます。
関連記事と既存の案内
関連する操作は各記事へのリンクから確認できます。
練習ZIPと本文の検証範囲を優先し、旧実装や外部の例をそのまま業務ファイルへ適用しないようにします。

よくある質問:GASのエラーで迷ったときのチェックリスト
GASのエラーは、何から調べますか?
コードの誤り、実行時間、承認、サービスの割り当て、トリガーの実行条件を分けて調べます。エラーの全文だけでなく、実行した関数・時刻・実行方式・変更範囲を記録します。
「Cannot read properties of null」と出るのは、なぜですか?
記事の早見表では、取得しようとしたものが見つからず、nullが返っていることが原因として挙げられています(シート名の違い、要素の不在など)。
「Exceeded maximum execution time」と出たときは?
1回の実行が、実行時間の上限を超えた場合です。セルの中の関数(カスタム関数)で出た場合は、カスタム関数の上限(30秒)を超えており、スクリプトの上限とは別です。セルごとのサービス呼び出しを、範囲のgetValues・setValuesへまとめられるか確認します。
実行時間の上限は、いくつですか?
記事では、2026年10月2日に確認した公式の割り当てとして、スクリプトの実行は1回6分、カスタム関数は1回30秒、トリガーの合計実行時間は無料アカウントで90分/日、Google Workspaceで6時間/日と説明しています。最新の数値は、公式で確認してください。
「シートでは落ちるのに、エディタでは動く」のは、なぜですか?
カスタム関数の上限30秒と通常のエディタ実行の上限6分の違いは、原因の一つです。引数、使えるサービス、要求権限も異なるため、実際のエラー文から切り分けます。
6分に近づいたときは、どう書き換えますか?
1セルずつの読み書きが多い場合は、サービス呼び出し回数の削減を検討します。1行ずつ読み書きする形を、getValues・setValuesで、まとめて1回にします。それでも足りない場合は、処理する範囲を分割して、複数回に分けます。
