FileMaker API では一部のスクリプトステップは実行できない

# FileMaker API によるスクリプトの実行
FileMaker API for PHP にしろ XML にしる（またはそれをラップした各種ライブラリにしろ）、スクリプトを実行するメソッドというものが用意されています。

しかし、そのメソッドを実行した場合でも、**全てのスクリプトが正しく実行されるわけではありません**。このことは公式のマニュアルに書いてあるのですが、気づきにくいですのでここにまとめたいと思います。

# まずは公式マニュアル
[こちらのページ](https://community.filemaker.com/docs/DOC-5841)から公式マニュアルを落としてください。FileMaker Server 14 用ですが、大して変わりはありません。

# 注意書きを読む
落としたら 18 ページの「FileMaker スクリプトとカスタム Web 公開」をご覧ください。重要部分を引用します（太字は引用者による）。

> FileMaker は多くのスクリプトステップをカスタム Web 公開でサポートしています。URL にクエリー文字列でスクリプトを使用すると、Web ユーザはさまざまな自動化タスクを実行できます。カスタム Web 公開がサポートするスクリプトステップを表示するには、FileMaker Pro スクリプトワークスペースウインドウで [互換性] ボタンをクリックして [カスタム Web 公開] を選択します。**グレー表示されていないスクリプトステップがカスタム Web 公開でサポートされています**。

そうです、**全てのスクリプトステップが API で実行できるわけではない**のです。

# どのスクリプトステップが API で実行できる（できない）のか
API で利用できるスクリプトステップの一覧については以下のページの表が見やすいです[^1]。

- [FileMaker 13 でのスクリプトステップの互換性](http://filemaker-jp.custhelp.com/app/answers/detail/a_id/12814)

ここの「カスタム Web 公開」に「○」が記入されているスクリプトステップが API で利用できるスクリプトステップになります。

# API で実行できないスクリプトステップを実行するとどうなるか
API で実行できないスクリプトステップを API 経由で実行するとエラー（エラーコード）として「**3**」が返ってきます。

具体的に各ライブラリで返ってくる様子を見てみましょう。まずは FileMaker API for PHP です。

```bash:fmapi_for_php_error_3.php
# php fmapi_within_error3.php
FileMaker Error Code: 3<p>Command is unavailable (for example, wrong operating system, wrong mode, etc.)</p>
```

次に FX.php です。返り値を`var_dump`したものになります。

```
array(9) {
  ["data"]=>
  array(0) {
  }
  ["linkNext"]=>
  string(0) ""
  ["linkPrevious"]=>
  string(0) ""
  ["foundCount"]=>
  int(0)
  ["fields"]=>
  array(0) {
  }
  ["URL"]=>
  string(166) "hogehoge"
  ["query"]=>
  string(0) ""
  ["errorCode"]=>
  string(1) "3"
  ["valueLists"]=>
  array(0) {
  }
}
```

返ってくるエラーメッセージの構造は使用するライブラリによりまちまちです。エラー処理を行うために故意にエラーを起こしてその構造をチェックして、それを判定基準にした上の処理を書くということをする必要があるかなと思います。

# 実行できないスクリプトステップを強制的にスキップする方法
実は、実行できないと書かれているスクリプトステップを強制的にスキップし、スクリプト全体を実行する方法が存在します。

## FileMaker 14 を使えばいい？
冒頭のマニュアルの 19 ページには以下のような記述があります。

> スクリプトにサポートされないステップが含まれる場合（Web 互換ではないステップなど）、そのステップを実行すると FileMaker Pro エラー 3（「コマンドが使用できません」）が返されます。サポートされないスクリプトステップはスキップされ、スクリプトの実行が続行されます。FileMaker 14 では、[ ユーザによる強制終了を許可 ] スクリプトステップは、サポートされないスクリプトステップの動作に影響しません。

なるほど、FileMaker 14 では「サポートされないスクリプトステップ」は関係ない話だと[^2]。

しかしながら……

**FileMaker 14 でも「サポートされないスクリプトステップ」があればそこで動作が停止します。つまり、マニュアルの内容は False です**。

## 結局、FileMaker 13 以前と同じ手法で回避する
そんなため、FileMaker 13 以前と同じ方法で「サポートされないスクリプトステップ」をスキップをする方法を用います[^3]。

マニュアルの 18 ページの最下部をご覧ください。

> スクリプトに不明なステップが含まれる場合（廃止されたステップや認識されないステップなど）、そのステップを実行すると FileMaker Pro エラー 4（「コマンドが見つかりません」）が返されます。後続のステップの処理方法を決定するには、[ ユーザによる強制終了を許可 ] スクリプトステップを使用します。

> **[ユーザによる強制終了を許可] スクリプトステップオプションが有効（オン）の場合**、不明なスクリプトステップはスクリプトの続行を停止します。

つまり、**「ユーザによる強制終了を許可」を有効にしてあげれば、スクリプトは止まらずに進んでくれる**のです。

## しかし現場では……
それならば全部のスクリプトで「ユーザによる強制終了を許可」を有効にすればいいじゃないか、と思うかもしれません。でも、スクリプトを用いるインターフェイスは API だけではないでしょう。

エンドユーザが FileMaker 上でスクリプトを用いる場合があるはずです。むしろそちらの方が多いかもしれません。そこでは、何らかの意図を持ってスクリプトステップが用いられているはずです。

操作ミスを防ぐために確認のダイアログを出したり、複数の操作選択肢の中からどの操作を選択するかを選ばせるためにダイアログを出したり、といったことです。また、まとめて多くの（数万単位）レコードを操作する際にスクリプトを回すことも多いでしょう。これらのスクリプトステップを無条件で飛ばしてしまい、ESC キーによるキャンセルをできなくすることはリスクが大きすぎます。

となるとどうすればいいのでしょうか。考えられることとしては、同内容のスクリプトを手動操作用と API 操作用に分けることかと思います。ただしこれは典型的なバッドノウハウです。スクリプトの改変があったときに双方のコードを書き換えなくてはなりません。

とは言え、現在の FileMaker ではまともなコード管理ができません。重要で頻度が高い API 利用に絞ってこのような運用をすることは現実的にはやむを得ないでしょう。

もう一つの方法としては、スクリプトの内容を全て API で書き下す（全てのスクリプトの動作を PHP や Ruby で書く）ことです。ただし、これは必ずしも可能かどうかは場合によります。

# がんばりましょう
FileMaker というシステム自体がそういうものですので、できる範囲でがんばりましょう。もしかしたら一番ラクなのは、FileMaker のデータを適宜 Fluentd 的に RDBMS に流し込み、そちらのデータで処理することかもしれません[^4]。

[^1]: バージョン 14 以降でこの表が見つけられませんでした……
[^2]: だから「FileMaker 13 でのスクリプトステップの互換性」のようなページが存在しなかったのですね……
[^3]: FileMaker 15 でどうなっているかは未検証です
[^4]: それじゃあ FileMaker の意義って……とかは言わないこと