FileMaker 18のデータファイル操作スクリプトステップを探る

5月に公開されたFileMaker 18の新機能の一つ、データファイル操作用の一連のスクリプトステップの挙動を詳しく解説した、Soliant Consultingのブログ記事を紹介します。


Exploring FileMaker 18’s Data File Manipulation Script Steps

(元記事はこちら)

Makah Encarnacao
2019/5/28

Filemaker 18の最もわくわくする新機能の一つは、データファイル操作スクリプトステップの追加です。一つずつ詳しく見て、利用方法をさぐっていきましょう。

添付のサンプルファイルをダウンロードして、記事を読みながらスクリプトステップを一つずつテストしてみてください。

データファイルを作成

FileMakerのヘルプでは、このスクリプトステップは次のように説明されています。

空の閉じられたデータファイルを作成してから、[データファイルを開く] スクリプトステップを使用して開き、[データファイルに書き込む] スクリプトステップを使用してデータを追加します。

つまり、このスクリプトステップは、この記事で説明する他のいくつかのスクリプトステップと連携して機能します。

このスクリプトステップのオプションを設定するときは、専用のファイルダイアログでファイルパスを指定します。ファイルパスを空欄のままにすると、エラーコード100: (ファイルがありません)が返されます。もう一つ[フォルダを作成]というオプションがあり、デフォルトではオフになっています。指定したファイルパスが存在しないフォルダであり、[フォルダを作成]をオンにした場合、このスクリプトステップがフォルダを作成します。フォルダが存在せず[フォルダを作成]をオフのままにすると、エラーコード100: (ファイルがありません)が返されます 。ファイルがすでに存在する場合、FileMakerは元のファイルを上書きします。

ではどんな種類のファイルを作成できるでしょうか? ヘルプに記述がないので、以下をすべてテストしました。

.txt
.log
.xls
.xlsx
.png
.jpg
.html
.fmp12
.doc
.mp3
.avi
.mov
.java
.json
.csv
.zip
.rar
.js

意外にもこれらのファイルはすべて正常に作成されました。

作成されたファイルのリスト
作成されたファイル

データファイルを開く

作成したファイル(またはすでに存在するファイル)への書き込みを始める前に、[データファイルを開く]スクリプトステップでファイルを開く必要があります。ファイルは[データファイルを閉じる]スクリプトステップで閉じる(またはFMPを終了するかコンピュータを終了する)まで開かれたと見なされます。パスを入力しなかった場合、または無効なパスを入力した場合は、エラーコード100: (ファイルがありません)が返されます。

このスクリプトステップはターゲットも要求します。ターゲットは、データファイルのファイルIDを保存する場所です。他のスクリプトステップでこの値が必要になるので、後で参照できる入れ物(フィールドまたは変数)に忘れずに設定します。

ファイルIDをフィールドまたは変数に格納しなかった場合、新しい関数Get(OpenDataFileInfo)を使用してファイルIDを見つけることもできます。既に開かれているファイルを開こうとすると、エラーコード300: (ファイルは使用中)が返されます。同時に開くことができるデータファイル数は25個に制限されています。それ以上開こうとすると、エラーコード2: (メモリーエラー)が返されます。

データファイルに書き込む

データファイルを作成して開く方法がわかったので、次に書き込みを試してみましょう。このスクリプトステップには4つのパラメータがあります。データソースとは、データファイルに書き込むデータのことで、フィールドまたは変数を指定します。さらに、文字エンコードタイプとしてUTF-16またはUTF-8を選択します。

どちらを選ぶべきでしょうか? ウィキペディアによると、「UTF-16は、WindowsやJavaなどのシステムやJavaScriptで内部表現に使われています。また、プレーンテキストやWindows上のワードプロセッサのデータファイルにも使用されています。Unix/LinuxやmacOS上のファイルではほとんど使われません。Web上では普及せず、UTF-8が主流となっています(そしてWHATWGによって「すべての環境での必須のエンコーディング」と見なされている)。UTF-16の方は、Webページでの使用は0.01%未満に留まっています。WHATWGはセキュリティ上の理由から、ブラウザアプリケーションではUTF-16を使用しないことを推奨しています。」

この定義は、このスクリプトステップを使用して書き込むことができるファイルの種類を示唆していますが、それらがすべて機能することを確認するためにテストを行いました。データソースを「Here is some data」というテキストに設定し、エンコードをUTF-16に設定して、そのデータソースをすべてのファイルに書き込んでみました。幸いにも、どのファイルタイプでもエラーは発生せず、すべて動作しました。ファイルへの書き込み後には、ファイルサイズが増加していました。

すべてのファイルのサイズが増加した

予想通り、これらのファイルタイプのうち、実際に開いて追加したデータを表示することができたのは、.txt、.html、.java、.json、.csv、.jsだけでした。つまり、バイナリファイルへの書き込みが妨げられることはありませんが、意味のある形で書き込むことはできません。.txt、.html、.java、.json、.cvs、.js、.logなど、テキストベースのファイル以外のものを作成・読み取り・書き込みするためにこれらのスクリプトステップを使用することは、お勧めしません。

.txt、.html、.java、.json、.csv、.jsファイルタイプのデータのみを開いて表示できる

同じテストをUTF-16ではなくUTF-8でも実行し、同じくエラーは発生しませんでした。私が気づいた唯一の違いはファイルサイズが小さかったということです。

UTF-16ではなくUTF-8でテストするとファイルサイズが小さくなる

1回のスクリプトステップでファイルに書き込めるデータの最大量は64 MBです。ただし、64 MBのデータを同じファイルに複数回連続して追加することはできます。

このスクリプトステップの最後のオプションは、[改行を追加]です。このチェックボックスはデフォルトで選択されています。これは、ファイルにデータを追加する前に改行文字を追加するだけです。ここで、[改行を追加]をオンとオフにした場合で、データを連続して複数回追加したときの違いがわかります。

連続してデータを複数回追加した場合の[改行を追加]のオンとオフの違い

データファイルから読み取る

[データファイルから読み取る]スクリプトステップにはターゲットが必要で、それはデータファイルから読み取られた情報を格納するフィールドまたは変数です。データをバイト、UTF-8、UTF-16のどの形式で読み込むかを選択します。 デフォルトはバイトです。

このスクリプトステップではファイルIDも求められます。フィールドまたは変数に挿入されるデータ量を制限したい場合は[サイズ]パラメータに数値を設定できます。[読み取る:]でバイトまたはUTF-8を選択した場合、サイズの単位はバイトになります。UTF-16を選択した場合、サイズの値は読み取るUnicodeの文字数として解釈されます。この機能を試すのであればUTF-16を使うことを勧めます。その方が操作が簡単でした。ファイル全体を読み取るには、サイズを空欄のままにします。

テストでわかったこと – サイズに値を入力した場合、最初に位置を設定する必要があります(位置の設定については後述)。サイズを空欄のままにすると、ファイル全体が読み取られるので、ファイルの現在位置は関係ありません。これについてはデータファイルの位置に関するスクリプトステップについて読んだ後により理解できるでしょう。

[データファイルから読み取る]スクリプトステップでは、一度に64 MBを超える読み取りができないため、それ以上読み取る必要がある場合は、複数の処理に分割する必要があります。この例はヘルプの例3で見ることができます。

読み込むファイルがUTF-8でエンコードされているのであれば、[読み込む:]を同じくUTF-8に設定するべきです。同じことがUTF-16エンコーディングにも当てはまります – [読み込む:]でUTF-16を選択してください。UTF-8のファイルをUTF-16として読み込んでみたところ、(私にとっては)意味不明な文字列になってしまいました。

作成 読み込み 結果
UTF-8 UTF-8 期待通り
UTF-8 UTF-16 文字化け(以下のスクリーンショット)
UTF-8 バイト ファイル名のみ
UTF-16 UTF-8 期待通り
UTF-16 UTF-16 期待通り
UTF-16 バイト ファイル名のみ

 

UTF-8で作成されたファイルをUTF-16で読み込んだ結果

データファイルを読み書きするときのエンコード方式の組み合わせの結果を以下にまとめました。

読み込むファイルがバイナリ(これは基本的にテキストベースではないファイルすべて)であれば、[読み取る:]をバイトと設定するべきです。ほとんどの場合、バイナリファイルに[データファイルから読み取る]スクリプトステップを使用することは、バイナリデータをオブジェクトフィールドに保存することになるため、[ファイルを挿入]スクリプトステップと非常によく似ています。1つ大きな違いは[データファイルから読み込む]はサーバでの実行が可能です。ただし、サーバの特定の場所(Documentフォルダと一時フォルダ)でのみ可能です。

データファイルを閉じる

[データファイルを閉じる]スクリプトステップは非常に単純です。1つのパラメータ、ファイルIDのみを取ります。ファイルを閉じると、開いているデータファイルの読み書きができなくなり、ファイルを削除するなど、データファイルを閉じている必要があるスクリプトステップを実行できます。

開いているすべてのファイルを1つのスクリプトステップで閉じる場合は、パラメータに二重引用符で囲んだアスタリスクを設定します(“*”)。加えて、FMPを終了しても、開いているすべてのデータファイルを閉じることができます。開いていないファイルを閉じようとすると、エラーコード100: (ファイルがありません)が返されます。

ここまでで、基本的な部分はすべて説明したと思うかもしれませんが、まだまだあります。データファイルを開いたり、読んだり、書き込んだり、閉じたりする以外に何ができるかを見てみましょう。

データファイルの位置を取得

このスクリプトステップでは、モニタ上のデータファイルの「物理的な」位置(私が最初に期待していたのはこれ)は返されません。そうではなく、データファイル内の読み書き位置(ファイルテキストの先頭からファイルのデータの読み書きを開始する位置までのバイト数)を返します。ファイルが最初に作成されるとき、読み書き位置はデフォルトで0になります。データファイルの最後では、位置はファイルのサイズと同じです。

このスクリプトステップでは、ファイルIDとターゲットの2つのパラメータを取ります。ターゲットは、読み書き位置の結果を格納する場所です。

データファイルの位置を設定

このスクリプトステップは、ファイルIDとファイルに設定したい新しい位置の2つのパラメータを取ります。新しい位置はファイルの先頭からのバイト数です。ファイルを読み書きするときは、この位置から始まります。ファイルに書き込むときにこの位置の後にデータがあると、上書きされます。例えば、ファイルの内容が「123456789」で、データ位置を0にリセットしてからファイルに「hello」と書き込むと、データファイルの内容は「hello56789」となります。

ファイルサイズを取得

このスクリプトステップは、ファイルのサイズをバイト単位で示します。2つのパラメータ、つまりファイルパスと、ファイルサイズを保存したいフィールドまたは変数をとります。位置をファイルの末尾に設定する場合は、このスクリプトステップを上記の[データファイルの位置を設定]スクリプトステップと組み合わせて使用できます。

ファイルを削除

このスクリプトステップはただ1つのパラメータ、ファイルパスを取ります。そしてファイルが削除されるためには閉じられている必要があります。開いているファイルを削除しようとすると、エラー300: (ファイルはロックされているか使用中)が返されます。このスクリプトステップと一つ前のスクリプトステップが、どちらも「データファイル」ではなく「ファイル」を対象としていることに注目してください。これは、データファイルだけでなく、任意のサイズのファイルを削除したり、任意の種類のファイルを削除したりできるためです。

ファイルの存在を取得

このスクリプトは、存在を確認したいファイルへのパス、および結果を格納するフィールドまたは変数を求めます( 1 = true, ファイルが存在する、0 = false, ファイルが存在しない)。ファイルパスを必要とする他のファイル操作スクリプトステップ([ファイルを削除]、[ファイルサイズを取得]、[データファイルを作成]、[データファイルを開く]、[ファイルの名前変更]など)を実行する前に、このステップを含めることをお勧めします。

ファイルの名前変更

このスクリプトステップは、既存のファイルへのパスと、新しい名前を要求します。

自分で試してみよう

これらすべての新しいスクリプトステップを実際に試して、それらが協調してどのように動作するかを理解するための、デモファイルを作成しました。このファイルは、データファイルポータルで作成、開く、閉じる、削除するすべてのファイルを管理します。

デモファイルをダウンロード(コンタクト情報の入力が必要です)

[エラーログ設定]をオン/オフするためのスイッチにも気づくでしょう。これは、スクリプトエラーを自動的にファイルに記録し、最初のエラーを記録したときにドキュメントフォルダに作成されるScriptErrors.logファイルに保存する新しいスクリプトステップです。スクリプトエラーがログに記録されるたびに評価する独自の計算式を追加することもできます。

もう1つ目につくのは、ポータルを更新するためのボタンでしょう。このボタンは、FileMaker Pro 18の新しい関数 Get(OpenDataFileInfo)を使用しています。このボタンに割り当てられているスクリプトは、開いているすべてのデータファイルを取得し、まだ含まれていない場合はそれらをリストに追加します。

質問は?

ここまで来てあなたは「うーん…まだいくつか聞きたいことがあるんだけど」と思っているかもしれません。実は私もそうです。以下にあげるのが私の質問と、それに対する私が思いついた答えです。もし他に質問があれば、下のコメント欄に書き込んでください。


質問1

データファイルの位置を変更しない場合、常に0で読み、ファイルの最後に書き込むということであってますか?
答え

私のテストによると、その通りです。特に位置を変更しない限り、常に0から始まりファイルの末尾に書き込みます。


質問2

ファイルに書き込んでからデータファイルを部分的に読み取り、それから再度書き込む場合、書き込む位置はファイルの末尾か、読み込みを中断した場所のどちらですか?

答え

読み込みを中断した位置に書き込みます。それによって、最後の読み位置以降の文字を上書きします。


質問3

これらの機能はどこで使えますか? FileMaker Go、FileMaker Server、FileMaker WebDirectでは使えますか?

答え

これらすべての新しいスクリプトステップについて、答えは同じです。FileMaker WebDirectおよびランタイムではNoで、それ以外のすべてがYesです。ただしFileMaker Serverの場合は、アクセスできる場所が限られる点(一時フォルダとDocumentフォルダ)が、データファイルのスクリプトステップも同じであることに注意が必要です。


質問4

1つのFileMaker Proファイルからファイルを開くと、開いているすべてのFileMaker Proファイルからアクセスできるようになりますか?

答え

はい。また、元々データファイルを開いたFileMakerファイルを閉じても、そのデータファイルはFileMaker Proを終了するまで開かれていると見なされます。


質問5

[エラーログ設定]はそのファイルのみに有効ですか? それとも他の開いているファイルからのエラーも記録するのでしょうか?

答え
[エラーログ設定]はファイルごとの設定であり、あるファイルに対して有効にしても、他の開いているファイルでエラーが記録されることはありません。ただし、すべてのファイルのエラーが同じ一つのログファイルに書き込まれます。


そしておそらく最大の疑問は…

質問6

これらのデータファイル操作スクリプトステップをどのようなことに利用できますか?

答え

いくつかの可能性があります…他に何か思いついたら、コメント欄から知らせてください!

  • ログのカスタマイズ/ユーザ固有の環境情報の取得
  • FMPでHTML/JSON/XMLファイルを生成して外部(または内部)で使用するためにエクスポートする
  • エクスポートしたファイルにカスタムヘッダを挿入する
  • フィールドの内容をエクスポートする(テキストファイルのみ)
  • [エラーログ設定]スクリプトステップと連携させて使用する
  • [データファイルから読み込む]スクリプトステップを使用してオブジェクトフィールドに保存することによって、サーバ側で[ファイルを挿入]の機能を再現する
  • 「ハードコード」されたデータをFMPの外に保存する – たとえばAPIキー、SMTP設定、プラグインのライセンスキーなど。現在はおそらくそれらのデータをカスタム関数に保存していることでしょう。これをサーバ上のテキストファイルに保存し、[サーバー上のスクリプト実行]および[データファイルから読み取る]を使用してクライアントファイルにそのデータを読み取らせることができます。(ファイルはサーバ上のDocumentフォルダに置く必要があります。)必要に応じてファイルを暗号化することもできます。

Leave a Reply