FileMakerProの"OnFirstFileOpen"スクリプトトリガを実行させるたった一つの冴えたやり方

# はじめに
## 前書き
* この記事は [FileMaker Advent Calendar 2020](https://qiita.com/advent-calendar/2020/filemaker) 24 日目の記事です。
* 現時点 ( FileMaker Pro 19.2 ) では OnFirstFileOpen などというスクリプトトリガは存在しません。そのため、それと同じ挙動を果たすものを実装しようという記事内容です。

## 対象読者
* [Claris FileMaker Pro](https://www.claris.com/ja/filemaker/) ユーザー
* スクリプトトリガで [OnFirstWindowOpen](https://help.claris.com/ja/pro-help/content/onfirstwindowopen.html) を使っている／今後使おうと考えている人
* 前回記事 ( [Qiita - FileMakerProのOnFirstWindowOpenスクリプトトリガ実行時の不思議な挙動](https://qiita.com/Hi_Noguchi/items/76044390bf65d3c5608f) ) を読んできて、 OnFirstWindowOpen のバグ的とも言える挙動に頭を抱えてしまった人

## 検証環境
* Windows 10 Pro ローカル環境
    * FileMaker Pro 19.2.1.14

# 準備
## ファイルの準備
* 以下二つのファイルを用意します
    * A.fmp12
    * B.fmp12

## A.fmp12
* 前回記事 ( [Qiita - FileMakerProのOnFirstWindowOpenスクリプトトリガ実行時の不思議な挙動](https://qiita.com/Hi_Noguchi/items/76044390bf65d3c5608f) ) の準備と全く同じなので、そちらを参照。

## B.fmp12
### フィールドの用意
* `A.fmp12` ファイルの準備と同時に進める。リレーションさえ結べればよいので、何でも構わないから値を入れておいてください。

### スクリプトの作成
* 以下の四つを用意
    * `open`
    * `set_global_var.for_return`
    * `set_global_var.done_init_open`
    * `return_global_var.for_return`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/597e9568-c659-8dc1-99a3-e89e55c253e3.png)

* `open` については以下のように
    * 一度実行されたら、二度目は実行されないようにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a2d4e493-c8a4-763a-0e86-4846df72bc38.png)

* `set_global_var.for_return` については以下のように
  * 一度しか実行されなければ `1` がセットされるだけ
  * もし二度以上実行されたら、実行された回数分だけ数字が増えてしまうように

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/6fb60913-a9e4-2208-ed5f-92bfcd8528b7.png)

* `set_global_var.done_init_open` については以下のように
  * 一度実行されたよ、というフラグ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c72efb51-4187-7d3e-e954-fb38e5ade0c4.png)

* `return_global_var.for_return` については以下のように
  * `set_global_var.for_return` で格納されたグローバル変数を結果として返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1d804837-24da-7e3e-aa8c-6d05f2ca2c2f.png)


### ファイルオプション
* `表示するレイアウト` の指定をおこなう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2573ef60-286b-3003-228b-e65743d039a3.png)

### スクリプトトリガの設定
* 上記で指定をしたレイアウトにおいてスクリプトトリガを設定する
* `OnLayoutEnter` で `open` スクリプトを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/78ddeb76-06a6-4121-d6ba-d33bd26a89a7.png)

# 検証
## A だけ開く → スクリプト実行
* `A.fmp12` ファイルだけを開く
* スクリプト `confirmation` を実行
  * 明示的に `B.fmp12` ファイルを開いていないにもかかわらず、正しく値が `1` として返ってくる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7c68e29f-9f9b-d08b-2a61-f0be68eecd89.png)

## B を開いて別レイアウトと行き来してみる
* 別レイアウトを用意し、行き来してみても……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/bb05d7f0-88fe-bc97-f4b2-cc8ad1f6001d.png)

* 値は増えていません！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/3189e6cc-5070-f284-293b-8cc7bc3acafe.png)

* なお `open` スクリプトの二度目以後実行の制御をコメントアウトしてみると……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/99804dda-7aea-8b85-9d39-034b1aaa5d75.png)

* 当然、値が増えます。レイアウトを開き直せば開き直すだけ、値は増え続けます。ということで、ちゃんと制御は入れておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0e9b9096-9dd0-b4f3-17b0-e255cb43daec.png)


# おわりに
## まとめ
* 「ファイルを開いたとき最初に一度だけ必ずスクリプトが実行されるように」という "OnFirstFileOpen" を自分で実装するには、以下の手順を踏みましょう
    * 初期表示用のレイアウトを用意
    * `OnLayoutEnter` スクリプトトリガで `open` スクリプトを実行
    * `open` スクリプトが再実行されないようにグローバル変数でフラグ処理をすること
* つまり、`OnFirstWindowOpen` と `OnWindowOpen` には頼るんじゃない！　頼れるのは `OnLayoutEnter` だ！　ということになるかと思います。スクリプトトリガ実行用のレイアウトを用意するのが、ベストプラクティスということでしょう。

## 感想
* たった一つじゃない可能性は大いにありますが、何はともあれこれでやりたいことは実現できるし、予期せぬ挙動で沼に落ちることもなくなります。

## ちなみに
* OnFirstWindowOpen の代わりに OnWindowOpen を使えば良いのでは？　と思って試してみたところ、やっぱり OnFirstWindowOpen と同じくで、裏側でウィンドウが開いた扱いになっているせいか、実行されませんでした。やっぱり完全にバグなのでは🤔
    * これと同じ [ Qiita - FileMakerProのOnFirstWindowOpenスクリプトトリガ実行時の不思議な挙動 - OnFirstWindowOpen スクリプトトリガが実行されなくなる条件一例 ](https://qiita.com/Hi_Noguchi/items/76044390bf65d3c5608f#%E3%81%BE%E3%81%A8%E3%82%81)