Google Apps Script を触っていると、コードが合っているのに “INTERNAL(内部エラー)” だけ返されて完全に手が止まることがあります。私の環境でも、外部 API を扱う処理で急にこの内部エラーが出ることがあり、原因がまったく見えず困った経験がありました。ただ、発生理由を整理すると、このエラーはいくつかの典型パターンに分けられ、適切な対処を入れることで再発率を明確に下げることができます。
まず知っておきたいのは、このエラーが必ずしも開発者のミスを意味するわけではないという点です。多くの場合、Google 側の内部 API が一時的に応答できなくなる、スプレッドシート操作の競合が起きる、外部 API の遅延が発生するといった “GAS 実行環境特有の要因” が原因になります。私の開発環境では、UrlFetchApp のレスポンス遅延がトリガーになって INTERNAL が連発しましたが、リトライ処理を追加しただけで状況が大きく改善しました。
こうした背景を踏まえると、有効な対処は「GAS が詰まりやすい箇所を事前に減らし、異常時は自動で復旧できるようにする」ことに尽きます。具体的には、外部 API 呼び出しにリトライ処理を入れる、スプレッドシートへの書き込みはまとめて実行する、LockService で競合を防ぐ、権限の再許可を促すなどの対応が効果的です。とくに外部 API を扱う処理では、遅延・SSL エラー・リダイレクト失敗などが INTERNAL の直接原因になりやすいため、タイムアウト設定も忘れずに見直すべきポイントです。
さらに、以下のサンプルのように “最低限のリトライ処理” を入れておくだけで、実務レベルではかなり安定します。
function fetchWithRetry(url, options = {}, maxRetry = 3) {
for (let i = 0; i < maxRetry; i++) {
try {
return UrlFetchApp.fetch(url, options);
} catch (e) {
Utilities.sleep(500 * (i + 1)); //指数バックオフ
if (i === maxRetry - 1) throw e;
}
}
}
また、スプレッドシート操作で INTERNAL が起きる場合は、1セルずつ書き込むのではなく、配列でまとめて書き込むだけでも改善効果があります。同時編集の可能性がある場合は、LockService を使うと競合リスクを大幅に減らせます。
INTERNAL エラーは “原因不明に見えるだけで、実は発生ポイントが決まっている” というのがポイントです。この記事で紹介した対策を一つでも入れることで、処理が突然止まってしまう状況をほぼ排除できます。もし同じように INTERNAL に悩まされているなら、ぜひここで挙げた方法を順に試してみてください。