Google Apps Script入門
エラー処理(try・・・catch)

Google Apps Script(GAS)の入門解説です
公開日:2016-10-22 最終更新日:2022-11-04

第20回.エラー処理(try・・・catch)


Google Apps Scriptでは、他の言語(VBA等)で、どうしても発生する事の多い、データ型のエラーが発生しません。


従って、スプレッドシートを扱っている範囲内では、ほとんどエラーは出ないのですが・・・
とはいえ、全くエラーが出ないという事でもありません。

Google Apps Scriptでは、
文字列に四則演算をしても、0で割り算しても、エラーでは止まりまませんので、
表計算では、まずエラーでは止まりません。
その仕様が良いかどうかは別問題ですけど。

ここで言っているエラーは、記述間違いによるエラーの事ではなく、
通常は正しく動いているが、何らかの条件下で、エラーストップしてしまうような場合の事です。

以下で説明するエラー処理は、最初から入れない事をお勧めします。
書き間違いによるエラーが正しく診断できなくなってしまうからです。

エラー処理を入れずに、一旦は完成させた上で、
入力値や、操作手順により、エラーが出てしまう時に、エラーによるストップを避けるようにして下さい。


エラー処理(try・・・catch)の例題

以下の処理を例に考えてみます。

ブラウザーでシート名を入力し、そのシートに対して何らかの処理を行う場合

普通に書いたスクリプト
function sample20_1() {
  var sh = SpreadsheetApp.getActiveSpreadsheet();
  var sname = Browser.inputBox("シート名を入力");
  var sheet = sh.getSheetByName(sname)
  sheet.getRange(1, 1).setValue("ここでエラーが出る可能性がある");
}

単純に書くと、こんな感じになります。
しかし、入力したシート名が存在しない時、

google apps script 参考画像

google apps script 参考画像

getRangeでエラーが発生して、スクリプトが停止してしまいます。

もちろん、このような処理の場合は、シート名が存在するかの判定をする処理を入れるべきです。
ここでは、エラーのサンプルとして、あえてそのような処理を記述していません。


try・・・catch

try {
 try_statements
}
[catch (exception_var) {
 catch_statements
}]
[finally {
 finally_statements
}]


try_statements
実行される文。

exception_var
関連する catch 節に対して例外オブジェクトを保持する識別子。

catch_statements
try ブロックの中で例外が投げられた場合に実行される文です。

finally_statements
try 文が完了した後に実行される文。
これらの文は、例外が投げられたり捕捉されたかどうかに関係なく実行されます。

少なくとも 1 つのcatch、またはfinally、もしくはその両方が必要です。
すなわち、try 文には 3 つの形式があります:

try...catch
try...finally
try...catch...finally

例外が tryブロックの中で発生しなかった場合は、catch節は飛ばされます。
finally節は、tryブロックおよびcatch節が実行された後、try文の次の文の前に実行されます。
これは、例外が発生したかどうかに関係なく、常に実行されます。

なにやら難しい書き方になっていますが、
使い方自体は、そんなに難しくはなくて、
try...catch
とりあえずは、これだけ使えれば問題ないでしょう。


try・・・catchでエラー処理を入れたスクリプト

function sample20_2() {
  var sh = SpreadsheetApp.getActiveSpreadsheet();
  var sname = Browser.inputBox("シート名を入力");
  try {
    var sheet = sh.getSheetByName(sname);
    sheet.getRange(1, 1).setValue("ここでエラーが出る可能性がある");
  }
  catch (e) {
    Browser.msgBox("多分シートが無い");
  }
}

エラーが発生しそうな文を、tryのブロック内に入れます。
そして、catchで、エラー発生時の処理を書きます。

入力したシートがあれば、シート2のA1に、"ここでエラーが出る可能性がある"
入力したシートがなければ、メッセージボックスに、"多分シートが無い"
と表示されます。


tryブロックに含めるステートメントの範囲

エラー発生する可能性のあるステートメントがはっきりしていれば、そのステートメントに限定出来ますが、
多くの場合、
あちこちに可能性があって、どことは限定できない・・・

このような場合は、広い範囲をtryブロックに入れてしまって構いません。
ただし、そのような場合は、エラー発生時にエラー原因を特定できなくなりますので、
その対策は、別途考えておく必要があります。


エラー処理の最後に

最初にかきましたが、
Google Apps Scriptでは、データ型のエラーが発生しませんので、
このような、エラー処理を入れる必要はあまりありません。

必要が無いというより、エラーが出ないようにスクリプトを書くべきだという事です。
今回の例なら、入力されたシート名の存在を確認するコードを入れるという事です。

ただし、
本来あるはずのシートが消えてしまった等の人為ミスまで含めれば、必ずエラーは出ます。

そして、
そのような、人為ミスのエラーを考慮してまで、スクリプトを書く必要があるかと言うと・・・

それは何とも言えませんが、完全にはエラーが出ないスクリプトは書けません。
ただし、エラー処理を入れたところで、全ての問題が解決するわけでもありません。
エラーが出たときに、その後の対処をどうするかを決めておかなければ、何も問題が解決しません。
前述の例なら、シートを復活させるしかないことは、説明の必要が無いでしょう。




同じテーマ「Google Apps Script入門」の記事

第17回.JavaScript リファレンス
第18回.組み込み関数を使う
第19回.いろいろな繰り返し処理
第20回.エラー処理(try・・・catch)
第21回.配列って何なんだ?
第22回.オブジェクト、メソッド、プロパティとは
第23回.行・列を操作する(挿入・削除・非表示・サイズ)
第24回.シートの挿入・削除・名前変更
第25回.スプレッドシート(ブック)の作成・名前変更
第26回.セルのコピー&各種ペースト
第27回.セルに数式を入れる


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ