Google Apps Script を使っていると、ときおり INTERNAL(内部エラー)”に遭遇します。
特徴的なのは、このエラーが **「どこが悪いのかを一切教えてくれない」という点です。ログにも詳細は残らず、ただ処理が止まるだけ。私の環境でも、LINE Webhook の開発や UrlFetchApp を絡めた外部API連携の際に、この内部エラーが不定期に出て困ったことがありました。
しかし調査を重ねると、この曖昧なエラーにも共通パターンがあります。
そしてそのパターンさえ押さえておけば、実務上のトラブルは確実に軽減できます。
◆ INTERNAL エラーの正体は「Google側の処理失敗」
まず理解しておきたいのは、INTERNAL エラーは こちらのコードが間違っているとは限らないということです。むしろ、次のような Google 側の内部的な処理エラーが原因で発生しやすい。
- 内部 API の応答が詰まっている
- スプレッドシートや Drive のバックエンドが瞬間的に重い
- 外部 API の応答遅延に GAS が耐えられない
- 権限トークンの状態が不整合になっている
- トリガーが同時に走りすぎてロックに失敗
つまり、INTERNAL は「GAS が内部的に処理できなくなったときの最終エラー」だと理解するとよいです。
◆ なぜ発生するのか?実際の開発現場で多いケース
● 1. UrlFetchApp で外部APIが遅い
あなたの環境でも実際に起きたケース。
外部サービスが瞬間的に遅いと、GAS は内部で処理に失敗し INTERNAL を返す。
対処:リトライ処理を入れるだけで改善することが多い。
function fetchWithRetry(url, options, max=3){
for (let i = 0; i < max; i++){
try {
return UrlFetchApp.fetch(url, options);
} catch (e) {
Utilities.sleep(300 * (i+1));
if (i === max - 1) throw e;
}
}
}
● 2. スプレッドシートの書き込みが細切れ
setValue() を大量のループで叩くと内部処理が詰まり、INTERNAL を起こしやすい。
対処:setValues() で一括処理にする。
● 3. doPost / トリガーの競合
LINE Bot やフォーム送信など、呼び出しが重なる処理では、
異なるセッションが同時に走り Google のロックが取れず内部エラー。
対処:LockService を必ず入れる。
● 4. 権限スコープの不一致
新しい API を使い始めたり、コードを貼り替えた後に
「再承認しないまま動かした」場合に INTERNAL が出ることがある。
対処:エディタから一度手動実行し、権限を再付与。
● 5. Google 側の障害
StackOverflow でも頻出するが、Google のサーバー障害時は INTERNAL が乱発する。
そのときはどうやっても直らない。
対処:Google Workspace Status を確認するしかない。
◆ どうすれば安定化するのか?
INTERNAL は消せないが、「発生する確率」は下げられる。
実務では次の 4 点が最も効果的だった。
- ✔ 外部APIはリトライ処理を標準搭載
- ✔ 書き込みはすべて setValues() でまとめる
- ✔ LockService で競合回避
- ✔ 権限を再付与しておく
- ✔ 重い処理はバッチ化 or 分割
これらを入れると、内部エラーはほぼ沈静化する。
あなたの環境で実際に起きていた UrlFetchApp の一時的な遅延も、
リトライの導入で解決できる典型例です。