概要:なぜGASにエラー処理が必須なのか
Google Apps Script(GAS)を用いた業務自動化は、今や現代のビジネスパーソンにとって必須のスキルです。しかし、どれほど完璧に見えるコードを書いたとしても、外部要因によるエラーを完全に避けることは不可能です。例えば、スプレッドシートが編集中で開けない、APIのレスポンスが一時的にタイムアウトする、あるいは参照先のセルが削除されているといった事象です。
これらの「予期せぬエラー」が発生した際、プログラムがそのまま強制終了してしまうと、業務は中途半端な状態で停止し、ユーザーは混乱に陥ります。ここで重要になるのが「例外処理(try…catch)」です。本記事では、GASにおけるエラーハンドリングの基本から、実務でそのまま使える応用テクニックまでを、ベテランの視点で徹底解説します。
詳細解説:try…catchのメカニズム
GASにおいてエラーが発生すると、プログラムは例外オブジェクトを投げて実行を中断します。try…catch構文は、この「エラー発生時の挙動」をプログラマの意図通りに制御するための強力な仕組みです。
基本的な構造は以下の通りです。
tryブロック:
エラーが発生する可能性がある「危険なコード」を記述します。ここで問題がなければ、catchブロックは無視されます。
catchブロック:
tryブロック内でエラーが発生した際に、プログラムの制御がここに移ります。エラーの詳細をログに記録したり、代替処理を行ったり、ユーザーに通知したりする役割を担います。
finallyブロック(任意):
エラーの有無にかかわらず、処理の最後に必ず実行されます。例えば、開いたファイルを閉じる、データベースの接続を解除する、といった「後始末」に最適です。
この構文を適切に使うことで、プログラムの信頼性は劇的に向上します。特に、複数の外部サービスを連携させるような複雑なスクリプトでは、個別の処理をtry…catchで囲むことが「プロフェッショナルなコード」の条件となります。
サンプルコード:実務で使える堅牢な実装
以下は、スプレッドシートからデータを取得し、外部APIへ送信する際の標準的なエラー処理のテンプレートです。単にエラーをキャッチするだけでなく、エラーの種類に応じて適切な対応をとるのがポイントです。
function executeRobustProcess() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('データシート');
try {
// 1. データの読み取り(エラー発生の可能性あり)
const data = sheet.getRange('A1:B10').getValues();
if (data.length === 0) throw new Error('データが空です。');
// 2. 外部APIへの接続(ネットワークエラーの可能性あり)
const response = UrlFetchApp.fetch('https://api.example.com/data', {
method: 'post',
payload: JSON.stringify(data)
});
Logger.log('処理成功: ' + response.getResponseCode());
} catch (e) {
// 3. エラーの内容に応じて切り分け
Logger.log('エラーが発生しました: ' + e.message);
// ユーザーへの通知
SpreadsheetApp.getUi().alert('処理中に問題が発生しました。管理者に確認してください。');
// 必要に応じてエラーログを別のシートに書き出すなどの保存処理
logErrorToSheet(e.message);
} finally {
// 4. 終了処理(成功・失敗問わず実行)
Logger.log('処理を終了します。');
}
}
function logErrorToSheet(errorMessage) {
const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ログ');
logSheet.appendRow([new Date(), errorMessage]);
}
実務アドバイス:ベテランが教えるエラーハンドリングの極意
1. すべての処理をtry…catchで囲まない
初心者にありがちなのが、全てのコードを一つの大きなtry…catchで囲んでしまうことです。これでは、どこで何のエラーが起きたのか特定が困難になります。エラーが起きる可能性のある最小単位ごとに分割して記述するのが基本です。
2. エラーを「握りつぶさない」
catchブロックでエラーをキャッチした際、何も処理を書かずに空にすることを「握りつぶす」と呼びます。これはデバッグを不可能にする最悪の習慣です。必ずログを残すか、ユーザーに状況を伝える工夫をしてください。
3. カスタムエラーの活用
throw new Error(‘メッセージ’) を積極的に使いましょう。例えば、スプレッドシートの値が想定と異なる場合に、自分で意図的にエラーを投げ、それをcatchブロックで拾うことで、プログラムの制御が非常に楽になります。
4. ログの重要性
GASの実行ログは一定期間で消えてしまうことがあります。実務においては、上記サンプルコードのように、エラー内容を専用の「ログシート」に書き出す仕組みを作っておくと、後から障害の原因を追跡する際に雲泥の差が出ます。
5. タイムアウト対策
GASには6分間(または30分間)という実行時間制限があります。try…catchは、制限時間に達しそうなことを検知した際にも役立ちます。実行時間を監視し、残り時間が少なくなったら安全に中断するロジックを組み込むことも検討してください。
まとめ:保守性の高いコードを目指して
プログラミングの真価は、正常に動くコードを書くことではなく、異常が発生した時にどう振る舞うかを定義することにあります。Google Apps Scriptは手軽に始められるツールですが、try…catchを使いこなすことで、その品質は一気に「業務システム」レベルへと昇華されます。
今回解説したtry…catchの考え方は、GAS以外の言語でも応用可能な普遍的なスキルです。最初は面倒に感じるかもしれませんが、一度エラー処理の重要性を理解すれば、あなたの書くスクリプトは驚くほど安定し、周囲からの信頼も厚くなるはずです。
まずは、現在作成中のスクリプトの「外部連携(UrlFetchAppやDriveAppなど)」部分を、try…catchで囲むことから始めてみてください。その小さな一歩が、将来のあなた自身を助けることになります。安定した自動化ツールを構築し、本来の創造的な業務に時間を割ける環境を、ご自身の手で作り上げていきましょう。
