親子スクリプトの「情報の受け渡し」で困っていませんか?
FileMakerでスクリプトを書いていると、「共通処理を別スクリプトに切り出したい」「サブスクリプトから、結果だけ親スクリプトに返したい」といった場面がよくあります。いわゆる「親子スクリプト」の連携です。
ところが、いざ分けてみると…
- サブスクリプトで計算した結果を、どうやって親に返せばいい?
- グローバル変数やグローバルフィールドを多用して、どこで値が変わったのか分からなくなる
- 同じようなスクリプトが増えてしまい、メンテナンスが大変
といった問題が起きがちです。この記事では、Get ( ScriptResult ) 関数を使って、親子スクリプト間の情報をシンプルに受け渡しする方法を、できるだけ分かりやすく解説します。
Get ( ScriptResult ) って何をする関数?
Get ( ScriptResult ) は、簡単に言うと「直前に終了したスクリプトで返された結果」を取り出すための関数です。よく使う場面は、親スクリプトからサブスクリプトを「スクリプト実行」ステップで呼び出したあと、その結果を受け取りたいときです。
イメージとしては次のような流れです。
- 親スクリプトがサブスクリプトを呼び出す
- サブスクリプトの最後で「スクリプト結果を返す」
- 親スクリプトが
Get ( ScriptResult )でその値を受け取る
グローバル変数をわざわざ用意しなくても、サブスクリプト1回の実行につき1つの結果を、シンプルに返すことができるのがポイントです。
基本パターン:合計金額をサブスクリプトで計算して返す
実際のイメージをつかみやすいように、具体例で見てみましょう。ここでは「見積書」のようなレイアウトを想定して、
- サブスクリプト:明細行を集計して合計金額を計算する
- 親スクリプト:合計金額をフィールドにセットする
という構成にしてみます。
1. サブスクリプト側の作り方
サブスクリプト(例:「合計金額を計算」)では、最終的に数値(合計金額)を「スクリプト結果」として返します。大まかな流れは次のようになります。
- 対象の明細レコードに移動する
- 必要なら検索・ソートをする
- 合計を計算する(例:集計フィールドや集計関数を使用)
- スクリプトステップ「スクリプト終了」で、計算した値を結果として返す
最後のステップが重要です。例えば:
スクリプト終了 [ 結果: 明細テーブル::合計金額 ]
このように「スクリプト終了」ステップに計算式を指定しておくと、その値が親スクリプトから Get ( ScriptResult ) で取得できるようになります。
2. 親スクリプト側の作り方
親スクリプト(例:「見積書の合計を更新」)では、次のような流れになります。
- 「スクリプト実行」ステップで「合計金額を計算」スクリプトを呼び出す
- すぐ後で
Get ( ScriptResult )を使って結果を変数に代入する - 受け取った合計金額を、見積書のヘッダテーブルのフィールドにセットする
ステップ例は次のようになります。
# 1. サブスクリプトを実行
スクリプト実行 [「合計金額を計算」]
# 2. 結果を変数に受け取る
変数を設定 [ $合計 ; 値: Get ( ScriptResult ) ]
# 3. 見積ヘッダに書き込む
フィールド設定 [ 見積ヘッダ::合計金額 ; $合計 ]
これで、サブスクリプトで計算した合計金額が、シンプルに親スクリプトへ渡されます。
Get ( ScriptResult ) を使うメリット
親子スクリプトで Get ( ScriptResult ) を使うと、次のようなメリットがあります。
- グローバル変数に頼らずに済む
返したい値だけを「スクリプト結果」として返せばよいので、どこからでも書き換え可能なグローバル変数を多用する必要が減ります。 - スクリプトの役割がはっきりする
サブスクリプトは「入力 → 処理 → 結果を返す」という1つの流れにまとめやすくなり、再利用性も高まります。 - テストしやすい
サブスクリプト単体で実行して「スクリプト結果」に何が返っているか確認することで、動作確認がしやすくなります。
複数の情報を返したいときの工夫
「合計金額だけでなく、税額や明細行数も一緒に返したい」というように、複数の値を返したい場合もあります。その場合は、以下のような工夫がよく使われます。
- 改行で連結して 1 つのテキストにまとめる
- 区切り文字(カンマなど)で連結して、親側で分解する
- JSON 形式でまとめて返す(
JSONSetElement/JSONGetElementを利用)
例として、JSON 形式で返すパターンを簡単に紹介します。
サブスクリプト側
変数を設定 [ $json ;
値: JSONSetElement ( "" ;
[ "total" ; 明細テーブル::合計金額 ; JSONNumber ] ;
[ "tax" ; 明細テーブル::税額 ; JSONNumber ] ;
[ "count" ; 明細テーブル::行数 ; JSONNumber ]
)
]
スクリプト終了 [ 結果: $json ]
親スクリプト側
変数を設定 [ $result ; 値: Get ( ScriptResult ) ]
変数を設定 [ $total ; 値: JSONGetElement ( $result ; "total" ) ]
変数を設定 [ $tax ; 値: JSONGetElement ( $result ; "tax" ) ]
変数を設定 [ $count ; 値: JSONGetElement ( $result ; "count" ) ]
このようにしておくと、後から返したい情報を追加・変更しやすくなり、親子スクリプトの連携も分かりやすく保てます。
使うときに気を付けたいポイント
- 必ず「スクリプト実行」の直後に呼び出す
Get ( ScriptResult )は「直前に終了したスクリプト」の結果だけを返します。間に別のサブスクリプトの実行やカスタムダイアログをはさむと、想定していない結果になることがあります。 - 空の結果もあり得る
サブスクリプトの中で「スクリプト終了」が実行されなかった場合、結果が空になります。意図的に「失敗時は空を返す」と決めておくなど、ルールを決めておくとよいでしょう。 - 戻り値の型(数値・テキスト)を意識する
文字列として返しているつもりが、数値として評価されてしまうなどのトラブルを防ぐため、特に計算で使う場合は型を意識して扱いましょう。
親子スクリプトを「会話」させるイメージで設計しよう
Get ( ScriptResult ) を使うと、親スクリプトとサブスクリプトが「質問と回答」をやり取りするような、分かりやすい関係を作ることができます。
- 親スクリプト:サブスクリプトに「これを計算して」と依頼する
- サブスクリプト:計算して「結果はこれです」と返す
この考え方でスクリプトを組み立てると、あとから見直したときにも「どこで何をしていて、どこからどこへ値が渡っているのか」が理解しやすくなります。
すでにグローバル変数やグローバルフィールドを多用しているスクリプトでも、一部ずつ Get ( ScriptResult ) 方式に置き換えていくことで、動作がシンプルになり、保守性も上がっていきます。まずは、よく使う共通処理のサブスクリプトから試してみてください。