ADVERTISEMENT

【Googleスプレッドシート】Apps Scriptで例外処理try・catch・finally!エラーの捕捉と復帰

【Googleスプレッドシート】Apps Scriptで例外処理try・catch・finally!エラーの捕捉と復帰
🛡️ 超解決

Google Apps Scriptで作成したスクリプトが、予期せぬエラーで途中停止してしまった経験はありませんか。特に、複数のシートを扱う処理や外部API連携では、エラーが発生すると後続の処理が全て止まってしまいます。この記事では、try・catch・finallyを使った例外処理の方法を解説します。エラーを適切に捕捉し、スクリプトを安全に復帰させる方法が身につきます。

【要点】Apps Scriptのtry-catch-finallyでエラーを捕捉し、スクリプトの停止を防ぎましょう

  • tryブロック: エラーが発生する可能性のある処理を記述します。エラーが起きてもスクリプトは中断しません。
  • catchブロック: tryブロックで発生したエラーを捕捉し、エラーログの記録や代替処理を実行します。
  • finallyブロック: エラーの有無に関わらず必ず実行される後片付け処理を記述します。

ADVERTISEMENT

なぜ例外処理が必要なのか

Google Apps Scriptでは、実行中にエラーが発生すると、その時点でスクリプト全体が停止してしまいます。例えば、スプレッドシートにアクセスできない場合、数値の割り算で0除算が起きた場合などです。例外処理を使わないと、エラー個所以降の重要な処理(データ保存や通知など)が実行されません。try-catch-finallyを利用すれば、エラーを安全に捕捉して、スクリプトの継続や適切な後処理が可能になります。これは、本番環境で動かすスクリプトには必須のテクニックです。

try-catch-finallyの基本的な書き方

まずは最も基本的な構文から解説します。以下のコードをApps Scriptのエディタに貼り付けて試してみてください。

  1. tryブロックを記述する
    エラーが発生しうる処理を try { ... } の中に書きます。例えば、存在しないシートを参照するコードを入れます。
  2. catchブロックでエラーを捕捉する
    catch(e) { ... } の部分で、エラーオブジェクト e を受け取ります。e.messageでエラーの内容を表示できます。
  3. finallyブロックで後片付けをする(省略可)
    finally { ... } はエラーの有無に関わらず必ず実行されます。ファイルのクローズやログ出力に使います。

具体的なコード例を見てみましょう。

function exampleTryCatchFinally() {
  try {
    // エラーが起きる可能性のある処理
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('存在しないシート');
    var data = sheet.getDataRange().getValues();
    Logger.log('データ取得成功');
  } catch (e) {
    // エラー時の処理
    Logger.log('エラー発生: ' + e.message);
    // エラーをユーザーに通知するなど
  } finally {
    // 必ず実行される処理
    Logger.log('後片付け完了');
  }
}

応用パターン:エラーに応じた処理の切り替え

catchブロック内でエラーの種類に応じて処理を変えることもできます。例えば、ネットワークエラーとデータ形式エラーで異なるメッセージを表示する場合です。

  1. エラーの種類を判定する
    エラーオブジェクト ename プロパティでエラーの種類を取得できます。TypeError、ReferenceErrorなどがあります。
  2. 条件分岐で処理を変える
    if文でエラー名をチェックして、適切な処理を実行します。
  3. デフォルトの処理を用意する
    想定外のエラーにも対応するため、else節で一般的なエラーハンドリングを記述します。
function handleErrorByType() {
  try {
    // なんらかの処理
    var value = undefinedVariable; // ReferenceErrorが発生
  } catch (e) {
    if (e.name === 'ReferenceError') {
      Logger.log('変数が定義されていません: ' + e.message);
    } else if (e.name === 'TypeError') {
      Logger.log('型が間違っています: ' + e.message);
    } else {
      Logger.log('予期しないエラー: ' + e.message);
    }
  } finally {
    Logger.log('エラーハンドリング完了');
  }
}

ADVERTISEMENT

例外処理の注意点とよくある失敗

catchブロック内でエラーが発生するケース

catchブロックの中で別の処理を書いているとき、そこでエラーが発生すると、finallyは実行されますが、エラーは上位に伝播します。catchブロック内も注意深くコードを書く必要があります。必要に応じて入れ子のtry-catchを使いましょう。

finallyブロックは本当に必ず実行されるのか

ほとんどの場合、finallyブロックは実行されます。ただし、スクリプトが強制終了された場合や、無限ループなどでタイムアウトした場合は実行されないこともあります。絶対に実行が必要な処理はfinallyに書かない方が安全です。

throw文で自分でエラーを発生させる

特定の条件で自らエラーを発生させることもできます。例えば、入力値が不正な場合に throw new Error('不正な値です'); と書きます。これにより、catchブロックでそのエラーを捕捉して適切な処理ができます。

try-catch-finallyの各ブロックの比較

ブロック 役割 必須/任意 実行タイミング
try エラーが発生する可能性のある処理を記述 必須 常に実行される
catch エラーを捕捉し、エラー時の処理を記述 任意(ただしtryと併用) エラー発生時のみ実行
finally エラーの有無に関わらず必ず実行される後処理 任意 try/catchの後、常に実行

まとめ

この記事では、Google Apps Scriptにおけるtry-catch-finallyを使った例外処理の基本と応用を解説しました。エラーを適切に捕捉することで、スクリプトの安定性が大きく向上します。まずは簡単な処理からtry-catchを導入してみましょう。次に、カスタムエラーをthrowしてエラー情報を明確にしたり、finallyでリソース解放を徹底することをおすすめします。これらのテクニックを活用して、堅牢なスクリプトを作成しましょう。

ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。