FileMaker書類の修復処理を自動化

FileMaker で「修復」コマンドを利用すると「ファイル名 (修復).fmp12」というファイルが出来上がり、その後の扱いが面倒。専用ファイル作って自動化してみました。

えー。毎度ばかばかしいお話でございます。

「修復」コマンドを実行するとファイルがコピーされ修復されたファイルが「ファイル名(修復)」になります。

元のファイルを捨てるなりバックアップなりしたあとファイル名から「(修復)」を削除しますね。あぁ面倒くさい。あぁ面倒臭い。この作業がダルくてついつい「修復」を避けます。でも避けているうちに症状が悪化して取り返しが付かなくなったりしますから何とかします。

「AppleScriptを実行」を利用しますのでMac限定のお話となります。

修復したファイルの後始末をするスクリプトの話ですが、修復するための専用ファイルを作るところからとなります。修復するだけのファイルを作っても面白くないので、ファイルブラウザというかランチャーというかメニューというか、そういうファイルを作ることと絡めます。

関連ファイルブラウザ

まずはFileMaker書類を新規にひとつこしらえます。このファイルにファイルを登録してプロジェクト内のファイルブラウザ、あるいはメニュー、ランチャーとして利用します。そしてついでに、修復ユーティティの機能を持たせます。

関連するファイルを登録

イメージフィールドをひとつ作って、参照で「ファイルを挿入」して読み込みます。

読み込みのためのスクリプトでは少しだけ工夫を凝らして、すでに登録済みのファイルを登録できないようにしておきましょう。

…例えばレコードのリストを利用して重複を避ける

値一覧「パスリスト」を作成し、ファイルパスのフィールドを指定しておきます。

新規登録する際、変数 $全パス [ ValueListItems ( Get(ファイル名) ; “パスリスト” ) ] をセットしてから新規レコード、新規挿入、パスが作成されるまで進めます。

作成されたパスが$全リストに含まれていれば(if(PatternContent ( $全リスト ; ファイルブラウザ::ファイルパス )) )重複なので、今作成したレコードを削除します。

フォルダごと一括でインポートしてもいいですね。その場合、要らないファイルも登録されますからそういうのは手動でチクチク消していきます。

ファイルを読み込むと、イメージフィールドからファイル名、パス、そしてPOSIXのパスを取得できます。

フィールド

ファイル名

ファイル名フィールドに GetContainerAttribute ( イメージ ; “filename” ) の計算式を与えます。

パス

FileMaker形式のパスを取得します。パスフィールドは GetValue ( GetAsText ( イメージ ); 2 ) こういう計算式にしています。大体GetAsTextの2行目がパスなので。2行目がパスと限らない場合は、この式にいろいろ条件を付与します。

POSIX

FileMaker形式のパスをUNIXで扱うPOSIXの形式に変換する計算式のフィールドです。v19ではFileMakerの関数として用意されているそうです。よく使うので私はカスタム関数に登録して使い回しています。アナログチックに Substitute を駆使して、FileMakerパスをPOSIXに変換しています。

以上でファイルブラウザの基本ができました。実際にはいろいろスクリプトを追加してメニューやランチャーとして使えるようにしています。他に、分類や絞り込みの補助としてフォルダ名フィールドやお気に入り★フィールドなんかを作っておくと何かと便利でございます。

ファイルを開く

ランチャー機能の一例としてファイル操作をAppleScriptで行います。スクリプト「AppleScriptを実行」を使いますね。

「ファイルを開く」スクリプトステップを使わずAppleScriptでやります。「ファイルを開く」ではファイルが登録されてバックグラウンドで開いてしまう上に、名前でファイルを開くことができないからです。

AppleScriptを使うとファイル情報を得たりゴミ箱に捨てたりするのも同じやり方で応用できますしね。

Penguin icon パス指定による「ファイルを開く」は、他のファイルでもよく使います。他ファイルからこのブラウザファイルにざっくりリレーションを組んでおくことで、関連ファイルを登録することなく名前で開くことができるようになり、有用ですよ。

準備として、AppleScriptのスクリプトをフィールドに用意すると良いと思うんです。考え方の違いで二つのやり方があります。ひとつは、直接計算式として書いておくやり方、もうひとつはグローバルフィールドにテンプレートとして書いて実際のフィールドで置換して使用するやり方です。

計算式としてAppleScriptを仕込んでおく

POSIXフィールドの名前が「posix_field」とすると、AppleScript「ファイルを開く」のスクリプトをフィールドの計算式に書くとこうなります。

"tell application \"Finder\"" & ¶ &
" activate"& ¶ &
" open POSIX file \"posix_field \"" & ¶ &
"end tell"

こういう式を瞬時に作れるように Macで実行もできるFileMakerコード管理で書いたようなことをすでにやってるわけですが、このややこしさから解放されるには一手間掛けてテンプレートを使うとスマートかも。

テンプレートを使う

AppleScriptのテンプレートをグローバルフィールドに仕込みます。「ファイルを開く」だとこうですね。普通に書いていいんです。

tell application "Finder"
 activate
 open POSIX file "$パス"
end tell

ただし、どのファイルを開くのかの変数部分を判りやすい文字列にしておきます。例では$パスです。

実際に使用するスクリプトのフィールドを作ります。そのフィールドでは計算でテンプレートの置換を行うだけです。

Substitute ( AppleScriptファイルを開くテンプレートフィールド ; "$パス" ; posix_field )

$パスをposix_fieldに置き換えました。

こんな感じでスクリプトを実行させます。これらはフィールドである必要はないのですが(スクリプト内の変数で良いですのでね)、他のAppleScriptも使うことだし、可視化出来て判りやすいかなと。

というわけでランチャーとしても使える関連ファイルブラウザが出来ました。ついでに、ファイル修復ユーティリティの機能も持たせましょうというのが今回の趣旨です。

修復

わざわざ書くのも憚られますがスクリプトステップ「ファイルの修復」を実行するだけでございます。パスはもうありますから変数に仕込んで、修復スクリプトステップを実行させます。

修復のあと、ファイル操作に移ります。やりたいことは単純です。修復前のファイル名を変更し、修復されたファイルから「(修復)」を取っ払い元のファイル名と同じにします。

ファイル名を変更する

簡単に考えていたんですが、AppleScriptでファイル名を変更するというのが意外と難しく、難儀しました。答えのひとつはこうでした。

tell application "Finder"
 set FilePath to POSIX file "$posix_path" as alias
 set name of FilePath to "$変更後の名前"
end tell

変数FilePathに、パスを alias でsetするという、意味はわからないがこうすることで名前を変更できました。

ターミナルコマンドで名前を変更するのは、移動を行う mv コマンドを使うそうです。

mv 移動元 移動先

こう書くので、パスの末尾、ファイル名のところだけ変えてやればいいようです。mv コマンドのほうが楽ちんっぽいので、 do script with command “” を使ってもいいでしょう。

tell application "Terminal"
 activate
 do script with command "ここにコマンド"
end tell

どういうやり方にせよ、「AppleScriptを実行」でファイル名を変更するテンプレートが出来上がりました。「ファイルを開く」と同じく、グローバルフィールドにテンプレートを仕込みます。

このテンプレートには、AppleScriptの場合「変更前のパス」と「変更後の名前」、ターミナルコマンドの場合は「変更前のパス」「変更後のパス」の二つの変数があります。

必要な計算フィールドを作成し、ふたつの変数をいろいろ入れ替えることで、元のファイル名を変更したり、新たに作られた「(修復)」ファイル名を変更する作業が行えます。

ファイル修復フィールド定義
参考までにフィールド化して可視化したフィールド定義

修復されたファイルは名前に法則がありますので「修復ファイルのposix」が計算で取得できます。あとは随意工夫して、最終的に修復されたファイルを元のファイル名に変更します。

元のファイルをどうするかはお好みで色んな処置を施せばいいと思います。例では日付を加えています。参考に、流れがわかるレイアウトでも出しておきます。

ファイル名変更の流れ
ファイル名変更の流れ(一例)変更済みファイル名はスクリプトで作成、他は計算式フィールドです。

修復→修復前のファイルの名前を変更→修復されたファイルの名前を元に戻す

これだけのことでした。本来すっごく複雑な処理を、事前にFileMaker側でデータを準備することで簡単に実現できました。

このスクリプトをさらにループさせて、ファイル群を一気に修復できます。

ループさせる前に全ファイル修復するのか、特定分類から 修復するのか、現時点でリストされているファイルだけ修復するのか、そういうことも選択できるようにしておくことで使用感もアップします。

という、以上、自動修復後処理についてでした。

特に工夫を懲らすでもなく、特に際立ったTipsを披露したわけでもなく、ただ単に普通のことを並べて自動化させただけの話で、こんな投稿に意味あるのかと考えはじめると何も出来なくなるので気にせず投稿します。

ファイル群.fmp12
ファイル群.fmp12

実際に使ってるのはこんなのです。ただのランチャーですが「名前でファイルを開く」の要としても活躍していました。修復はオマケで最近取り付けただけなんです。快適便利になったんですよ。

※ FileMaker 18 以降は、ファイル操作が可能になりました。名前を変更したり、ゴミ箱に捨てたりできるようです。ここで書いた面倒な操作の大半が楽に実現します。