🖋️

FileMakerのデータビューアの式の編集をバックアップ

6 min read

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)

System Eventsを使っているので初回の起動時にアクセシビリティの許可が必要になる場合があります。

コード

(*
	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