GASで“INTERNAL(内部エラー)”が出るときに何が起きているのか?——エラー解決tips Error code INTERNAL

この記事の内容について、業務や開発でお困りの場合は個別に対応できます。

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 の一時的な遅延も、
リトライの導入で解決できる典型例です。

ZIDOOKA!

この記事の内容について、対応できます

この記事に関連する技術トラブルや開発上の問題について個別対応を行っています。

個別対応は3,000円〜 内容・工数により事前にお見積りします
最後までお読みいただきありがとうございました

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

AI活用に関するポリシー

当サイトでは、記事の執筆補助にAIを活用する場合がありますが、全面的な委任は行いません。