【FileMaker】ローカル環境でバックアップしたい

FileMaker Advent Calendar 2019 の23日目です。初参加になります。
カレンダーを作成してくださった Atsuko Sekiguchi (tyuma) さん、ありがとうございます:bow:

内容的には初級レベルのお話ですので、FileMakerガチ勢の人はつまらなくても怒らないでください。

#はじめに
FileMakerServerを導入すれば、バックアップはとても簡単に行うことができますが、自分だけのシステムを作って運用している方もとても多いのではないでしょうか。しかもそういうシステムに限って、結構重要な情報を管理していたり。
バックアップを取ろうと思うと、ご自身で名前を付けて保存したり、一旦閉じてコピー＆ペーストしたりという方法になるかと思います。OSのスケジューラで自動化している方もいらっしゃるかもしれませんが、起動中の場合は破損の恐れがある、全く更新がなくても無駄なバックアップが取られている、といった問題点があります。今回のTipsがそのような状況改善の糸口になれば幸いです。
※内容を理解して取り入れてほしいので、サンプルファイルのアップロードは行いません。悪しからず。

#条件
- ローカル環境(FileMakerServerを使っていない環境)で運用しているシステム
- FileMaker14移行（ディレクトリ選択機能を使うため　不要なら13以下でもＯＫ）
- Windows環境（こちらもディレクトリ関連の処理があるため　その部分をmac用に変更してもらえればＯＫ）

#システム概要
- 予めバックアップ先のディレクトリを指定。
- システム終了時に、自動で上記の場所に日付＋時刻のフォルダを作成し、その中にファイルを保存。
- 手動でもバックアップできるようにボタンを配置。


#レシピ
## 材料

- ファイル(.fmp12)１つ
- テーブル１つ（フィールド２つ）
- 値一覧１つ
- スクリプト５つ
- スクリプトトリガー１つ
- レイアウト１つ
    - フィールド１つ
    - ボタン２つ
    - チェックボックス１つ

## 手順

### １．テーブル定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/c34621a9-0281-ab50-04b1-ed5b02c0f8b2.png)

特に難しいところはありません。追加したのは２つのフィールドだけです。

| フィールド名 |タイプ|オプション|説明|
|:-----------------|:------------------|:------------------|:------------------|
|保存先|テキスト|グローバル|バックアップを保存するディレクトリ|
|終了時自動保存|テキスト|グローバル|システム終了時に自動でバックアップを保存する場合の設定|

### ２．スクリプト作成
作るスクリプトは５つです。コメントを入れているので細かい説明は省きますが、分からない箇所があればコメントください。

####ディレクトリ選択
バックアップの保存場所を、選択するためのスクリプトです。滅多に変更するものでもないので、直接入力するわ。っていう人は作らなくて良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/30cd39ba-7179-4a9f-05e3-ac93bb69a092.png)

####ディレクトリ作成
日付＋時間のフォルダを作ります。そこにバックアップファイルを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/d25c83c7-7e9c-5c65-5eaa-a2bff3d0bc78.png)

####バックアップ作成
バックアップ実行時のメインとなるスクリプトです。ここから他のスクリプトを呼び出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/47cec70f-41e1-f110-652c-1b4bb930326f.png)
※システムが複数のファイルで構成されている場合は、後述の「名前を付けて保存」スクリプトをそれぞれのファイルに作成して、このスクリプトから呼び出してください。

15行面「変数を設定」ステップだけ、ちょっとややこしいので中身を抜き出しておきます。やっていることは、現在日時を「2020-01-05 0905」のような形式に整形しているだけです。

``` 変数を設定
$directory &
Let([
ts=Get ( タイムスタンプ );
y=Year(ts);
m=Right("00" & Month(ts); 2);
d=Right("00" & Day(ts); 2);
h=Right("00" & Hour(ts); 2);
min=Right("00" & Minute(ts); 2)
];
y & "-" & m & "-" & d & " " & h & min & "/"
)
```


####名前を付けて保存
「名前を付けて保存」を実行するためのスクリプトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/efcb9807-ed6c-5fae-4dc6-2685ffcc1333.png)

####OnLastWindowClose
システム終了時に自動でバックアップを保存するために、OnLastWindowCloseトリガーへ設定するためのスクリプトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/9175a305-020c-eae3-a1f8-4afdecd518ca.png)

### ３．レイアウト作成
いたってシンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/7fd2b068-46d5-918d-4d80-5ebbac50e64a.png)

①保存先を入力するためのテキスト　作成したフィールドをそのまま配置してください。
②保存先をディレクトリ選択画面で選ぶためのボタン
「ディレクトリ選択」スクリプトを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/ec7dc31d-a5af-9ec8-68fb-632b605c6e0f.png)

③終了時に自動で保存させたるためのチェックボックス
「終了時自動保存」のカスタム値一覧を追加して、インスペクタから割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/d1c806ac-73c5-e197-339e-5d08d44606af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/9dcfeccd-cebe-7ac2-b12e-c4910c1d63a3.png)

④今すぐにバックアップを実行する場合にクリックするボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/e767c84c-c97e-9fa9-83ea-412bd2c0f44c.png)
「バックアップ実行」スクリプトを割り当てます。

### ４．システム終了時のスクリプト割り当て
ファイルオプションから「スクリプトトリガ」タブを選択。イベント「OnLastWindowClose」に、先ほど作成した「OnLastWindowClose」を割り当てます。これで、システム終了のタイミング（すべてのウインドウが閉じたタイミング）で、バックアップが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/40a076b3-3f93-482d-e38b-9dc861c168c8.png)



### ５．完成（動かしてみる）
バックアップ実行ボタンをクリックするか、終了時自動保存にチェックを入れてシステムを終了してください。以下のように指定ディレクトリに日付＋時刻のフォルダが生成され、その中にバックアップファイルが保存されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251813/a4d90ed0-f9ec-baf8-db64-5004f69bc969.png)

#おしまい
今回作成した機能はベース中のベースなので、ここから要件によっていろいろと機能強化しても良いと思います。

例）

- バックアップファイルの世代数設定（要は古いものは消していく）。
- 最終バックアップ日時を表示する。
- バックアップログ用のテーブルを作成し、バックアップの成功可否や保存場所、ファイルサイズ等の履歴を保存。参照も可能にする。

一度作ってしまえば、いろいろなシステムに流用できますので、是非実装してみてください。
それではよいお年を！ :santa_tone5: