GAS エラー「We’re sorry, the JavaScript engine reported an unexpected error. Error code INTERNAL.」が発生した場合の対処法

GAS エラー「We’re sorry, the JavaScript engine reported an unexpected error. Error code INTERNAL.」が発生した場合の対処法

GAS(Google Apps Script)で、エラー「We’re sorry, the JavaScript engine reported an unexpected error. Error code INTERNAL.」が発生した場合の対処法を記述してます。

環境

  • OS windows11 home
  • ブラウザ chrome 122.0.6261.69

エラー全文

1分おきに実行されるトリガーに設定したプラグラムで、たまに発生

原因

Chrome V8ランタイムを使用してトリガーを設定していると発生する問題なようです。

対処法

Chrome V8ランタイムを使用しないようにする。

左下の歯車マークのアイコンをクリックして「Chrome V8 ランタイムを有効にする」をチェックを外す。

ランタイムを使用してる場合は、構文エラーなどが発生します。自分の場合は以下を修正しました。

【アロー関数をやめる】

const hoge = () =>{}

↓

function hoge(){}


【const let を varに】

let foo = 1
const huga = 2

↓

var foo = 1
var huga = 2

一時的なエラーか確認する

「Error code INTERNAL」は、Google Apps Script側で一時的に発生している内部エラーの場合もあります。

同じコードを手動で再実行して正常に動作する場合は、一時的な問題の可能性があります。

function testRun() {
  main();
}

手動実行では問題なく、時間主導型トリガーだけでたまに失敗する場合は、処理内容や実行タイミングも確認します。

実行ログを確認する

エラーの発生箇所を確認するために、処理の途中にログを追加します。

function main() {
  console.log('start');

  // 処理1
  console.log('step 1');

  // 処理2
  console.log('step 2');

  console.log('end');
}

どこまで処理が進んでいるか確認することで、原因を絞り込みやすくなります。

try catchでエラー内容を記録する

トリガー実行時のエラーを確認しやすくするために、try catchでエラー内容をログに出力します。

function main() {
  try {
    // 実行したい処理
  } catch (e) {
    console.log(e.name);
    console.log(e.message);
    console.log(e.stack);
    throw e;
  }
}

「throw e;」を残しておくことで、エラーとして検知しつつ、詳細も確認できます。

処理を分割する

1分おきのトリガーで重い処理を実行している場合、処理が重なったり、実行時間が長くなったりして不安定になることがあります。

処理対象が多い場合は、一度にすべて処理せず、件数を絞って実行します。

function main() {
  var items = getItems();

  var limit = 50;

  for (var i = 0; i < items.length && i < limit; i++) {
    // 処理
  }
}

大量のスプレッドシート行やDriveファイルを一括処理している場合は、分割実行にすると安定しやすくなります。

トリガーの重複実行を防ぐ

前回の処理が終わる前に次のトリガーが実行されると、予期しないエラーになる場合があります。

LockServiceを使用すると、同時実行を防止できます。

function main() {
  var lock = LockService.getScriptLock();

  if (!lock.tryLock(10000)) {
    console.log('前回の処理が実行中のため終了します');
    return;
  }

  try {
    // 実行したい処理
  } finally {
    lock.releaseLock();
  }
}

1分おきのトリガーを使用している場合は、特に重複実行に注意します。

スプレッドシート操作をまとめる

スプレッドシートに対して、セル単位で何度も読み書きしていると処理が不安定になりやすくなります。

以下のような処理は避けます。

for (var i = 1; i <= 1000; i++) {
  sheet.getRange(i, 1).setValue(i);
}

まとめて書き込む場合は、配列を作成して「setValues」を使用します。

var values = [];

for (var i = 1; i <= 1000; i++) {
  values.push([i]);
}

sheet.getRange(1, 1, values.length, 1).setValues(values);

トリガーを作り直す

特定のトリガーだけでエラーが続く場合は、一度トリガーを削除して作り直す方法もあります。

Apps Script エディタ
↓
左側の時計アイコン「トリガー」
↓
対象トリガーを削除
↓
再度トリガーを作成

トリガー設定や認可状態が不安定になっている場合、作り直すことで改善することがあります。

まとめ

「We’re sorry, the JavaScript engine reported an unexpected error. Error code INTERNAL.」は、GAS側の内部エラーとして表示されるため、原因が分かりにくいエラーです。

確認するポイントは以下です。

・一時的なエラーか再実行して確認する
・実行ログを追加する
・try catchでエラー内容を記録する
・1回の処理量を減らす
・トリガーの重複実行を防ぐ
・スプレッドシート操作をまとめる
・トリガーを作り直す
・V8ランタイムを無効にして確認する

特に1分おきのトリガーで発生する場合は、処理の重複や実行時間の長さも確認すると原因を切り分けやすくなります。