FileMakerでスクリプトを作っていると、「想定していない値が渡されて動かない」「引数を渡し忘れてエラーになる」といった経験はないでしょうか。小さなうちは気づきませんが、画面やスクリプトが増えてくると、スクリプト引数の整理とチェックは避けて通れないテーマです。
この記事では「スクリプト引数の型チェック」と「既定値(デフォルト値)の設定」を組み合わせて、安心して使えるスクリプトにするコツを、できるだけ専門用語を減らしながら紹介します。
スクリプト引数を放置すると何が困るのか
スクリプト引数は、スクリプトに渡す「注文票」のようなものです。ここが曖昧だと、次のようなトラブルが起きやすくなります。
- 本来「数値」を想定していたのに「文字」が来て、計算でエラーになる
- 引数が空なのに、そのまま処理を進めてしまい、思わぬレコードを更新してしまう
- 呼び出し元スクリプトが増えるほど、どの引数が必須なのか分からなくなる
こうした問題は、「型(数値か文字かなど)をチェックする」「値が来なかった場合の既定値を決めておく」という、2つの工夫でかなり減らせます。
基本パターン:数値かどうかをチェックする
まずは一番よくある「数値かどうか」のチェック例です。スクリプト引数に「商品ID(数値)」が入ってくる想定だとします。
- スクリプトの冒頭に、引数を受け取るステップを用意します。
Set Variable [ $productID ; Get ( ScriptParameter ) ] - 続けて、数値かどうかを確認します。
If [ not IsNumeric ( $productID ) ]
エラーメッセージの表示やスクリプトの終了処理を書きます。
End If
この「IsNumeric」でのチェックを入れておくだけで、文字列や記号が誤って渡された場合の暴走を防げます。
空だったときに既定値をセットする
値が「必須」ではない場合や、「指定がなければ0として扱う」と決めておきたい場合は、既定値(デフォルト値)を設定すると便利です。
たとえば、数量が空なら「1」を入れたい場合は、次のように書けます。
Set Variable [ $qty ;
Case (
IsEmpty ( Get ( ScriptParameter ) ) ; 1 ;
IsNumeric ( Get ( ScriptParameter ) ) ; Get ( ScriptParameter ) ;
1 // 想定外のときも、ひとまず1
)
]
こうすると、
- 何も渡されなければ「1」
- 数値が渡されればそのまま利用
- それ以外の値でもとりあえず「1」
という動きになります。本番では、「想定外の値」のときはログを残したり、エラーメッセージを出したりする形にアレンジするとよいでしょう。
複数引数は「区切り文字」か「JSON」で管理する
引数が1つだけなら簡単ですが、「ID」「数量」「モード」など複数の情報を渡したくなることが多いと思います。その場合に代表的な方法は2つです。
1)区切り文字でまとめる方法
単純なやり方として、「|」や「¶(改行)」などの区切り文字でまとめる方法があります。
// 呼び出し側
Perform Script [ "受注処理" ; Parameter:
$orderID & "¶" &
$qty & "¶" &
"confirm"
]
受け取る側では、
Set Variable [ $orderID ; GetValue ( Get ( ScriptParameter ) ; 1 ) ]
Set Variable [ $qty ; GetValue ( Get ( ScriptParameter ) ; 2 ) ]
Set Variable [ $mode ; GetValue ( Get ( ScriptParameter ) ; 3 ) ]
のように取り出し、前述のようにそれぞれ型チェックと既定値設定を行います。
この方法はシンプルですが、「順番」を間違えると意味が変わってしまう点に注意が必要です。
2)JSON形式で扱う方法
FileMakerにはJSONを扱う関数が用意されています。これを使うと、引数を「名前付き」で渡せるので、スクリプトが複雑になってきたときに特に有効です。
呼び出し側の例:
Set Variable [ $param ;
JSONSetElement ( "{}" ;
[ "orderID" ; $orderID ; JSONNumber ] ;
[ "qty" ; $qty ; JSONNumber ] ;
[ "mode" ; "confirm" ; JSONString ]
)
]
Perform Script [ "受注処理" ; Parameter: $param ]
受け取り側では、
Set Variable [ $json ; Get ( ScriptParameter ) ]
Set Variable [ $orderID ; JSONGetElement ( $json ; "orderID" ) ]
Set Variable [ $qty ; JSONGetElement ( $json ; "qty" ) ]
Set Variable [ $mode ; JSONGetElement ( $json ; "mode" ) ]
のように取り出し、それぞれに対して「数値かどうか」「空のときの既定値」などをチェックすれば、かなり安心して使えるようになります。
型チェックと既定値の「共通部品」を作る
毎回同じようなチェックを書くのは手間ですし、書き忘れも起こります。そこでおすすめなのが、「引数チェック専用スクリプト」を1本作っておき、ほかのスクリプトから呼び出す方法です。
たとえば、次のようなイメージです。
- スクリプト名:_util_引数チェック_数値
- 引数:JSON(value, default, min, max など)
- 戻り値:チェック済みの数値
呼び出す側は、
Set Variable [ $param ;
JSONSetElement ( "{}" ;
[ "value" ; Get ( ScriptParameter ) ; JSONString ] ;
[ "default" ; 1 ; JSONNumber ] ;
[ "min" ; 0 ; JSONNumber ]
)
]
Perform Script [ "_util_引数チェック_数値" ; Parameter: $param ]
Set Variable [ $qty ; Get ( ScriptResult ) ]
という形にしておけば、「数値チェック」そのもののロジックはユーティリティ側に集中させられます。
慣れないうちは少し複雑に感じますが、中〜大規模のファイルでは、後々のメンテナンス性がぐっと上がります。
まとめ:安全なスクリプトは「入口の厳しさ」から
スクリプト引数の型チェックと既定値の設定は、どちらも「入口をきちんと管理する」ための工夫です。次の3点を意識するだけでも、トラブルはだいぶ減ります。
- スクリプト冒頭で、まず引数を受け取り、型をチェックする
- 空や未指定を想定して、既定値(デフォルト値)を決めておく
- 複数引数は、できればJSON形式+名前付きで渡す
最初から完璧を目指す必要はありません。よく使うスクリプトから少しずつ型チェックと既定値設定を追加していくだけでも、運用の安心感は大きく変わってきます。