GASが止まったとき、出てくるメッセージは英語で、しかも短いです。
ただ、出るものはだいたい決まっています。
先にメッセージから引ける表を置き、そのあとで多いものから順に対処を書きます。
| 出るメッセージ | 意味 | 対処 |
|---|---|---|
Exceeded maximum execution time | 6分の上限を超えた | 処理を分ける。書き込みをまとめる |
Authorization is required to perform that action | 承認されていない | エディタから一度手で実行する |
Service invoked too many times | 1日の回数上限を超えた | 翌日まで待つ。回数を減らす |
TypeError: Cannot read properties of null | 取れなかったものを使った | シート名・IDを確かめる |
ReferenceError: xxx is not defined | 名前が違う | 関数名・変数名の綴り |
Server error occurred, please try again | Google側の一時的な不調 | 少し待って再実行 |
Library is missing | ライブラリの版が消えた | 版を選び直す。コードを写す |
UrlFetch calls to ... are not permitted | 管理者が通信先を制限している | 管理者に許可を頼む |
まず実行ログを見る
何が起きたかは、左のメニューの「実行数」に残っています。
行を開くと、どの関数が、いつ、どの行で止まったかが出ます。
トリガーで動いたぶんもここに残ります。
「勝手に動いて失敗していた」を見つけられる唯一の場所なので、詰まったら最初にここを開いてください。
6分で止まる|Exceeded maximum execution time
GASは1回の実行が6分までです。
個人のアカウントでもWorkspaceでも同じです。
行数が多いシートを1行ずつ読み書きすると、ここに当たります。
いちばん効くのは「まとめて書く」
時間を食っているのは、たいていセルへの読み書きの回数です。
// 遅い:1行ごとにシートへ書きに行く
for (let i = 0; i < rows.length; i++) {
sheet.getRange(i + 1, 1).setValue(rows[i]);
}
// 速い:配列を作ってから1回で書く
const values = rows.map(r => [r]);
sheet.getRange(1, 1, values.length, 1).setValues(values);これだけで数十倍速くなることが珍しくありません。
getValue と setValue がループの中にあったら、まずここを疑ってください。
それでも足りないとき
どこまで進んだかをスクリプトプロパティに書いておき、トリガーで続きから回します。
ただしトリガーで動く時間は1日あたり90分(Workspaceは6時間)という別の上限があります。
「6分は超えていないのにエラーにならず止まる」という場合は、こちらの上限に当たっていることがあります。
承認されていない|Authorization is required
エディタから動かすと承認の画面が出ますが、トリガーからの実行では出ません。
そのまま失敗します。
- エディタで、その関数を一度手で実行する
- 承認の画面が出たら許可する
- そのあとトリガーを動かす
新しいサービス(Gmailやドライブなど)をコードに足したときも、承認が増えるので同じことが起きます。
「昨日まで動いていたのに」というときは、直前に足したコードを疑ってください。
「このアプリは確認されていません」と出る
自分で書いたスクリプトでも、初回の承認でこの警告が出ます。
「詳細」を開くと、そのまま進むリンクがあります。
自分のスクリプトであれば進んで問題ありません。
回数の上限|Service invoked too many times
1日に使える回数が、サービスごとに決まっています。
| 個人アカウント | Google Workspace | |
|---|---|---|
| メール送信(宛先数) | 100 / 日 | 1,500 / 日 |
| URL Fetch の回数 | 20,000 / 日 | 100,000 / 日 |
| トリガーの実行時間 | 90分 / 日 | 6時間 / 日 |
| トリガーの数 | 20 / ユーザー / スクリプト | |
| 同時実行 | 30 / ユーザー | |
メールの100は「宛先の数」です。
1通に10人入れれば10と数えられるので、通知のスクリプトは思ったより早く当たります。
上限に当たると翌日までリセットされません。
残りは MailApp.getRemainingDailyQuota() で確認できます。
トリガーまわりの詰まり
失敗しても気づけない
トリガーの一覧で、各トリガーの右にある鉛筆を開くと「エラー通知設定」があります。
既定は毎日まとめてです。
すぐ知りたいものは「今すぐ通知」に変えておくと、失敗のたびにメールが来ます。
トリガーが見えない・消せない
トリガーは、作ったアカウントにしか見えません。
共同編集しているシートで「誰かが仕込んだトリガーが動いているのに一覧に無い」のはこのためです。
作った本人のアカウントで開いて消してもらってください。
保存できない
1つのスクリプトに作れるトリガーは、1人あたり20までです。
試しに作ったものが残っていないか、一覧を見直してください。
外部との通信|UrlFetchApp
| 出るもの | 意味 |
|---|---|
429 | 相手側の回数制限。間隔を空ける |
400 | 送った中身の形が違う。パラメータとJSONを見直す |
401 403 | 鍵かトークンが違う、または期限切れ |
DNS error | URLの綴り。または相手が落ちている |
not permitted by your admin | Workspaceの管理者が通信先を絞っている |
fetch は既定で、相手がエラーを返すと例外になります。
中身を見たいときは muteHttpExceptions: true を付けると、止まらずに応答を受け取れます。
const res = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
Logger.log(res.getResponseCode()); // 429 や 400 がここで分かる
Logger.log(res.getContentText()); // 相手が返した本文ブラウザから呼ぶと CORS で弾かれる
GASをウェブアプリとして公開し、別のサイトのJavaScriptから呼ぶときに出ます。
原因はGAS側ではなく、ブラウザが送る事前確認(プリフライト)にGASが答えられないことです。
事前確認が飛ばない形で送れば通ります。
Content-Typeをtext/plainにする(application/jsonだと事前確認が飛ぶ)- 独自のヘッダーを付けない
- 受け取る側は
e.postData.contentsをJSON.parseする
公開の設定が「自分のみ」だと、そもそも外から届きません。
「全員」にしてあるかも確かめてください。
コードのエラー
TypeError: Cannot read properties of null
いちばん多いのがこれです。
取れなかったもの(null)に対して、続きの操作をしたという意味です。
const sheet = ss.getSheetByName('シート1'); // 全角の1 → 見つからず null
sheet.getRange('A1'); // ここで TypeErrorシート名の全角と半角、末尾の空白、大文字と小文字を確かめてください。
getSheetByName、getFolderById、getElementById の直後で出ていたら、ほぼこれです。
ReferenceError: xxx is not defined
その名前のものが存在しません。
綴りの間違いか、別のファイルで定義した変数をそのまま使っているかのどちらかです。
構文エラー
保存した時点で赤い線が出ます。
閉じ括弧の数と、全角の記号(( ; ”)が混ざっていないかを見てください。
日本語入力のまま記号を打つと、見た目が似ていて気づきにくいです。
エラーの中身を自分で残す
トリガーで動かすものは、失敗したときに何が起きたか後から読めるようにしておくと楽です。
function main() {
try {
doWork();
} catch (e) {
console.error(e.message); // 何が起きたか
console.error(e.stack); // どの行か
throw e; // 握りつぶさない。トリガーの失敗として残す
}
}最後の throw e を忘れると、失敗が「成功」として記録されます。
エラー通知も来なくなるので、記録だけして投げ直す形にしてください。
Googleスプレッドシートのほかの操作は、まとめからご覧いただけます。

まとめ
- まず「実行数」を開く。トリガーの失敗もここに残る
- 6分で止まるなら読み書きをまとめる。トリガーには1日90分の別の上限がある
- 承認エラーはエディタから一度手で実行。サービスを足したら毎回
- メールの上限100は宛先の数。翌日までリセットされない
- トリガーは作った人にしか見えない。エラー通知は「今すぐ」にしておく
nullのエラーは、シート名の全角・半角と空白を疑う- try/catch で記録したら
throwで投げ直す
上限の数字は2026年9月10日時点のGoogle公式の割り当て表にもとづいています。
値は変わることがあるので、当たったときは公式の表もあわせて確認してください。

