While関数でJSON配列をラクにループ処理しよう
FileMakerでJSONデータを扱う機会が増えると、「JSONの配列を1件ずつ処理したい」「繰り返し処理をスマートに書きたい」と感じる場面が多くなります。従来のスクリプトステップだけでループを書くと、
変数の初期化・ループ条件・カウンタの更新など、どうしても行数が増えてしまいがちです。
そこで活躍するのが While関数 です。While関数を使うと、JSON配列のループ処理を1つの計算式の中で完結させることができ、スクリプトも計算式もスッキリします。
この記事では、専門用語をできるだけ少なくして、「While関数でJSON配列をループ処理する基本的な考え方」と「実際の書き方」を分かりやすく解説します。
While関数ってどんな関数?
While関数は、FileMaker Pro 18以降で使える「繰り返し処理」のための関数です。
ざっくり言うと、「変数を用意して、条件を満たす間、ずっと処理を繰り返す」ための計算式だと考えるとイメージしやすいと思います。
基本的な書き方は次のとおりです。
While (
[ 変数の初期設定 ];
繰り返しを続ける条件 ;
1回分の処理内容 ;
最終的に返したい値
)
- 変数の初期設定:ループの前に一度だけ設定される値(カウンタや結果用の変数など)
- 繰り返しを続ける条件:この条件が「真」の間、処理が続きます
- 1回分の処理内容:JSONから値を取り出したり、文字列を連結したりする部分
- 最終的に返したい値:ループが終わったあとに、関数の結果として返す値
スクリプトステップの「ループ」と同じようなことを、1つの計算式だけで表現できるのがポイントです。
JSON配列をループする基本の考え方
JSON配列とは、「1件目、2件目、3件目…」というように、同じ形のデータが並んだものです。例えば次のようなJSONがあるとします。
{
"items": [
{ "name": "りんご", "price": 120 },
{ "name": "みかん", "price": 80 },
{ "name": "バナナ", "price": 100 }
]
}
この中の items が配列(Array)です。1件ずつ取り出して処理するには、以下の流れで考えます。
- 配列の長さ(件数)を調べる
- カウンタ(1からスタートする番号)を用意する
- カウンタが件数以下の間、JSONGetElementで1件分ずつ取り出す
- 必要な項目だけを取り出して、変数に蓄積していく
- カウンタを1つ増やす
この一連の流れを、While関数の中にそのまま書いていくイメージです。
JSON配列をWhile関数でループするサンプル
先ほどのJSONをテキストとして変数 $json に入れてあるとします。
「商品名と価格を1行ずつのテキストにまとめたい」という例でWhile関数を書いてみましょう。
While (
[
// 初期設定
json = $json ;
count = JSONListValues ( json ; "items[]" ) ;
i = 0 ;
result = ""
] ;
// 繰り返し条件
i < count ;
// 1回分の処理内容
[
item = JSONGetElement ( json ; "items[" & i & "]" ) ;
name = JSONGetElement ( item ; "name" ) ;
price = JSONGetElement ( item ; "price" ) ;
result =
List ( result ; name & ":" & price & "円" ) ;
i = i + 1
] ;
// 最終的に返す値
result
)
この計算を実行すると、結果は次のようなテキストになります。
りんご:120円
みかん:80円
バナナ:100円
ポイントは、インデックス(i)を0からスタートして、JSONListValuesで取得した件数(count)より小さい間だけ処理を続けていることです。
FileMakerのJSON配列は、items[0] が1件目という数え方になるため、0始まりでループさせるのが自然です。
スクリプトをスッキリさせるコツ
While関数を使うと、今までスクリプトで書いていたループを計算式にまとめられますが、書き方を少し工夫するとさらに見やすくなります。
- 初期設定・処理内容を「配列形式」で揃える
While関数の1番目と3番目の引数で、[ 変数 = 値 ; … ]の形を並べて書くと、どこで何をしているかが把握しやすくなります。 - 名前の付け方を統一する
iはインデックス、countは件数、resultは結果…といったように、意味の分かりやすい名前を付けると、後から読んだときにも理解しやすくなります。 - JSONGetElementのパスを揃える
"items[" & i & "].name"のようにドットでつなぐ書き方もできますが、itemを先に取り出しておいてJSONGetElement ( item ; "name" )と分けて書くと、構造がシンプルになります。
実務でよくある利用シーン
While関数とJSON配列の組み合わせは、次のような場面で特に役立ちます。
- Web APIのレスポンスを処理する
REST APIなどから受け取ったJSONの一覧データを、FileMakerのレコードに変換したり、帳票用のテキストに変換したりする際に便利です。 - ポータルのデータをまとめて計算する
ポータル行を一度JSONに変換しておいて、While関数で集計や整形を行うことで、処理を計算式の中に閉じ込めることができます。 - 複雑な集計やレポートを1フィールドで表現する
ルックアップデータや集計値をJSONで持たせておき、表示用フィールドでWhile関数を使ってレポート形式のテキストを組み立てる、といった使い方もあります。
まとめ:While関数でJSON処理を「1か所」に集約する
While関数を使うと、JSON配列のループ処理をスクリプトに分散させるのではなく、1つの計算式にギュッとまとめて書けるようになります。
その結果、スクリプトの行数を減らせるだけでなく、「どのような順番で何をしているのか」が把握しやすくなり、保守もしやすくなります。
最初は少しとっつきにくく感じるかもしれませんが、
- カウンタ変数(i)を用意する
- JSONListValuesで件数を取る
- JSONGetElementで1件ずつ取り出す
という3つのポイントさえ押さえれば、あとはパターン化して応用できます。
JSONを扱う場面が増えてきたら、ぜひWhile関数でのループ処理を試してみてください。