FileMakerのデータビューアの式の編集をバックアップ
2021-03-26 ダブルクォートが正しくエスケープされるように修正
はじめに
カスタム関数を作る際に必須と言っていいデータビューアの式の編集。
FileMaker使いなら大事に育てた計算式群がアプリケーションのクラッシュとともに消え去り、枕を濡らしたことが一度や二度ではないはずです。
クラッシュに巻き込まれて消える仕様を改善していただきたいところですが、今日明日に解決するということはないのでスクリプトを書いてみました。
アイデアをくださった高岡さんに感謝!
どんなスクリプト?
式の編集ウインドウの式を取得しテキストファイルに保存していきます。
新しく保存する式をファイルの上部にタイムスタンプ付きで追記していきます。
あらかじめFileMakerで保存したい式の式の編集ウインドウを開いておきます。
後述のスクリプトを実行。
このようにファイルに保存されます。
テキストファイルはドキュメントフォルダ/formura/formura.txtに保存します。
(あらかじめ作っておく必要はありません)
別のフォルダやファイル名にしたい場合はこの辺りの名前を変更してください。
--ドキュメントフォルダ/formura/formura.txt
set documentsPath to path to documents folder
set saveFolderName to "formura"
set formuraFileName to "formura.txt"
起動しているFileMakerのバージョンに関係なく共通してこのファイルに保存します。
バージョンはスクリプトで取得できるのでバージョンごとにファイルを分けてもいいかもしれません。
Automatorのクイックアクション(旧サービス)で作成すればショートカットが割り当てられるので1アクションで式のバックアップが可能です。
クイックアクションへの登録
次のリンク先を参照してください(手抜き
選択フォルダ内にフォルダを作るサービス(AppleScript)
コード
(*
FileMakerの式の編集をテキストに保存するスクリプト
2012-03-24 1.00 リリース
2012-03-26 1.10 ダブルクォートのエスケープ処理
*)
--区切り用
set separator to "──────────────────────"
--ドキュメントフォルダ/formura/formura.txt
set desktopPath to path to documents folder
set saveFolderName to "formura"
set formuraFileName to "formura.txt"
--保存ファイルのチェック
set formuraPath to my chkFilePath(desktopPath, saveFolderName, formuraFileName)
--式の編集取得
set formulaValue to my getValue()
--書き込む情報の生成
set writeText to separator & "\\" & linefeed & my getTimestamp() & "\\" & linefeed & my myDelimiters(formulaValue, "\\\"", "\\\\\"") & "\\" & linefeed & "\\" & linefeed
--ファイルの先頭に追記
set shcmd to "sed -i '' '1s/^/" & writeText & "/' " & quoted form of POSIX path of formuraPath
do shell script shcmd
shcmd
--保存ファイルのチェック
on chkFilePath(desktopPath, saveFolderName, formuraFileName)
try
set formuraPath to (desktopPath as string) & saveFolderName & ":" & formuraFileName as alias
on error
set shcmd to "mkdir -p " & quoted form of POSIX path of (desktopPath as string) & saveFolderName
do shell script shcmd
set formuraPath to (desktopPath as string) & saveFolderName & ":" & formuraFileName
set shcmd to "echo '式の編集' > " & quoted form of POSIX path of formuraPath
do shell script shcmd
end try
return formuraPath
end chkFilePath
--FileMakerから式の編集の取得
on getValue()
tell application "System Events"
tell process "FileMaker Pro Advanced"
tell window 1 --"式の編集"
tell text area 1 of scroll area 1 of splitter group 1 of splitter group 1
try
set calculationFormula to value
on error
tell application "FileMaker Pro Advanced" to display dialog "式の編集ウインドウを開いてから実行してください" buttons {"OK"} default button "OK" with icon 0
error number -128
end try
end tell
end tell
return calculationFormula
end tell
end tell
end getValue
--タイムスタンプ
on getTimestamp()
return do shell script "date +%Y-%m-%d_%H:%M:%S"
end getTimestamp
on myDelimiters(myText, searchTxt, replaceTxt) --置換専用
set oldDel to AppleScript's text item delimiters --デリミタを保存しておく
set AppleScript's text item delimiters to searchTxt --渡されたサーチワードをデリミタにする
set myText to every text item of myText --分解して
set AppleScript's text item delimiters to replaceTxt --渡された置換ワードをデリミタにする
set myText to myText as string --つなぐ
set AppleScript's text item delimiters to oldDel --デリミタを元に戻す
return myText
end myDelimiters
改修前 2021-03-26
(*
FileMakerの式の編集をテキストに保存するスクリプト
2012-03-24 1.00 リリース
*)
--区切り用
set separator to "──────────────────────"
--ドキュメントフォルダ/formura/formura.txt
set documentsPath to path to documents folder
set saveFolderName to "formura"
set formuraFileName to "formura.txt"
--保存ファイルのチェック
set formuraPath to my chkFilePath(documentsPath, saveFolderName, formuraFileName)
--式の編集取得
set formulaValue to my getValue()
--書き込む情報の生成
set writeText to separator & "\\" & linefeed & my getTimestamp() & "\\" & linefeed & formulaValue & "\\" & linefeed & "\\" & linefeed
--ファイルの先頭に追記
set shcmd to "sed -i '' '1s/^/" & writeText & "/' " & quoted form of POSIX path of formuraPath
do shell script shcmd
--保存ファイルのチェック
on chkFilePath(documentsPath, saveFolderName, formuraFileName)
try
set formuraPath to (documentsPath as string) & saveFolderName & ":" & formuraFileName as alias
on error
set shcmd to "mkdir -p " & quoted form of POSIX path of (documentsPath as string) & saveFolderName
do shell script shcmd
set formuraPath to (documentsPath as string) & saveFolderName & ":" & formuraFileName
set shcmd to "echo '式の編集' > " & quoted form of POSIX path of formuraPath
do shell script shcmd
end try
return formuraPath
end chkFilePath
--FileMakerから式の編集の取得
on getValue()
tell application "System Events"
tell process "FileMaker Pro Advanced"
tell window 1 --"式の編集"
tell text area 1 of scroll area 1 of splitter group 1 of splitter group 1
set calculationFormula to value
return calculationFormula
end tell
end tell
end tell
end tell
end getValue
--タイムスタンプ
on getTimestamp()
return do shell script "date +%Y-%m-%d_%H:%M:%S"
end getTimestamp
最後に
「書き出しができるなら書き戻しもできるでしょ?」
そんな声が聞こえてきますが、できないことはないけどGUIスクリプトになるのであまりやりたくない。というのが正直なところ……
次のようなコードで書き戻しはできると思いますが、タイミングをdelayしないとうまく動作しなさそう……
tell application "FileMaker Pro Advanced"
activate
tell application "System Events"
tell process "FileMaker Pro Advanced"
-- データビューア表示
click menu item 3 of menu 1 of menu bar item 10 of menu bar 1
delay 0.5
--式の追加をクリック
click UI element 6 of tab group 1 of window 1
--ここで式を挿入
--監視ボタンクリック
click UI element 7 of window 1
end tell
end tell
end tell
Discussion