Google Apps Script入門 | 第20回.エラー処理(try・・・catch) | Google Apps Script(GAS)の入門解説です



最終更新日:2016-10-26

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

Google Apps Scriptでは、他の言語(VBA等)で、どうしても発生する事の多い、

データ型のエラーが発生しません、

従って、スプレッドシートを扱っている範囲内では、ほとんどエラーは出ないのですが、

とはいえ、全くエラーが出ないという事でもありません。

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



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

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

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


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

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

普通に書いたスクリプト

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

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





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入門」の記事

第21回.配列って何なんだ?
第22回.オブジェクト、メソッド、プロパティとは
第23回.行・列を操作する(挿入・削除・非表示・サイズ)
第24回.シートの挿入・削除・名前変更
第25回.スプレッドシート(ブック)の作成・名前変更
第26回.セルのコピー&各種ペースト
第27回.セルに数式を入れる

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

SUMIFの間違いによるパフォーマンスの低下について|エクセル関数超技(3月26日)
条件式のいろいろな書き方:TrueとFalseの判定とは|ExcelマクロVBA技術解説(5月6日)
空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
5.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.定数と型宣言文字(Const)|ExcelマクロVBA入門



  • >
  • >
  • >
  • エラー処理(try・・・catch)

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


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

    ↑ PAGE TOP