GASのエラーハンドリング:try-catchでスクリプトを堅牢にする

GASエラー処理プログラミング
GASのエラーハンドリング:try-catchでスクリプトを堅牢にするのサムネイル

GASのエラーハンドリングが必要な理由

お疲れさんだ、おじさんだよ。Google Apps Script(以下GAS)を使うと業務がぐっと楽になるけど、エラーが起きるとそこで止まってしまう。中小企業の経営者さんやフリーランスの皆さんにとって、スクリプトが途中で止まるのは時間とコストの無駄だ。

だからこそ、おじさんは「try-catch」を使ったエラーハンドリングを強くおすすめする。これでスクリプトの堅牢性が上がり、失敗しても適切に処理できるようになるんだ。

try-catchで堅牢なスクリプトを書くポイント

GASでエラー処理をするなら、まずは基本のtry-catch構文を押さえよう。

function safeProcess() {
  try {
    // ここに処理を書く
  } catch (e) {
    Logger.log('エラー発生: ' + e.message);
  }
}

だが、これだけでは不十分。中小企業やフリーランスなら、既存データを誤って消しちゃうリスクは避けたいだろ?だから、データは直接削除しない。代わりに新しい日時付きのシートやファイルへ結果を書き出すのがベターだ。

さらに、入力検証やバックアップ、バッチ処理も必須だ。これで失敗時にロールバックも可能になる。おじさんの経験から言うと、これがコスト削減につながるぞ。

具体的なコード例:入力検証・バッチ書き込み・バックアップ付き

以下は、スプレッドシートのデータを処理し、新しい日時付きシートに結果を書き出す例だ。既存データは一切変更しない。エラーがあればcatchで捕まえ、バックアップも作成する。

function processDataWithBackup() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = ss.getSheetByName('元データ');
  if (!sourceSheet) {
    Logger.log('元データシートが見つかりません');
    return;
  }

  // 入力検証:データがあるかチェック
  const dataRange = sourceSheet.getDataRange();
  const data = dataRange.getValues();
  if (data.length < 2) {
    Logger.log('データが不足しています');
    return;
  }

  const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
  const backupSheetName = 'バックアップ_' + timestamp;
  const resultSheetName = '処理結果_' + timestamp;

  try {
    // バックアップ作成(新しいシートにコピー)
    const backupSheet = ss.insertSheet(backupSheetName);
    backupSheet.getRange(1, 1, data.length, data[0].length).setValues(data);

    // バッチ処理:処理結果を配列で作成
    const resultData = [];
    // ヘッダー行をコピー
    resultData.push(data[0].concat(['処理日時']));
    for (let i = 1; i < data.length; i++) {
      const row = data[i];
      // ここで何らかの処理(例:2列目の数値に10%加算)
      const processedValue = typeof row[1] === 'number' ? row[1] * 1.1 : row[1];
      resultData.push([row[0], processedValue, timestamp]);
    }

    // 処理結果用の新規シート作成
    const resultSheet = ss.insertSheet(resultSheetName);
    resultSheet.getRange(1, 1, resultData.length, resultData[0].length).setValues(resultData);

    Logger.log('処理完了。バックアップシートと結果シートを作成しました。');
  } catch (e) {
    Logger.log('処理中にエラー発生: ' + e.message);
    // 必要に応じてメール通知やSlack連携も可能
  }
}

この例では、

  • 既存の「元データ」シートを直接編集せず、新しいシートにバックアップと結果を保存
  • 入力データの有無を検証してから処理開始
  • バッチ書き込みで効率的にデータを書き込み
  • try-catchでエラーを拾いログ出力

といったポイントを押さえている。これならミスで大事なデータを消すリスクはほぼゼロだ。

初期設定・権限・個人情報の扱いについて

このスクリプトを使うには、Googleスプレッドシートの編集権限が必要だ。初回実行時にGASの認証画面が表示されるので、指示に従って許可を与えてほしい。

また、個人情報や機密データを扱う場合は、

  • スクリプトのアクセス権限を最低限に設定
  • 共有設定を見直し、信頼できるメンバーのみアクセス可能に
  • 定期的にバックアップを取得し、復元手順を用意

を徹底することが重要だ。

installable trigger(時間主導型トリガーなど)を使う場合は、トリガーの設定画面から追加し、同様に権限を承認する必要がある。エラーが起きた場合はログやメール通知で把握し、手動でバックアップシートから復元するといい。

コスト削減の仮定と計算例

おじさん流に簡単に試算してみよう。

  • 例えば、手作業でのデータ処理に1件あたり3分かかるとする
  • 月間処理件数が200件なら、合計600分=10時間の工数
  • 時給3,000円換算で、月間3万円の人件費
  • GASの自動処理を導入して工数を70%削減できた場合、節約時間は7時間、節約金額は約21,000円/月
  • これが年間で約25万円のコストカットになる計算だ

もちろん、GASはGoogleアカウントの利用枠内で動くため、追加の専用SaaS料金は不要。ただし、Apps Scriptの実行時間やAPI呼び出し数にはquota・実行上限があるので使いすぎには注意しよう。

まとめ

スクリプトのエラー処理は堅牢な業務自動化に必須だ。try-catchで例外を拾い、既存データを直接編集せず、新規シートへバックアップと結果を書き出し、入力検証やバッチ処理も実装すれば安心だ。

GASはGoogleアカウントの利用枠内で、追加の専用SaaS料金なしで使える強力なツール。コスト削減効果も大きいので、ぜひ取り入れてほしい。

最後に、おじさんのGASおじラボメンバーシップでは500以上の便利ツールを使い放題で提供中。気になったらこちらからどうぞ。

GASおじラボで500ツール使い放題 →