Mac App StoreアプリケーションをAppleScriptで作ったときに、ファイル保存ダイアログを実装するのにchoose file nameコマンドでは拡張子の処理に問題があります(ユーザーが拡張子まで入力しなかった場合への対処を行うと逆効果に)。
choose file nameコマンド ユーザーが選択、入力したパス:Macintosh HD:Users:me:Desktop:aaaaa
Script側で拡張子を補足:Macintosh HD:Users:me:Desktop:aaaaa.kame --> エラー(Sandbox制限による)
その回避策としてありものを引っ張り出してきて手直ししたNSSavePanelベースのファイル保存ダイアログ表示サブルーチンです。
▲choose file nameコマンドで表示したファイル名入力ダイアログ。ダイアログ上でタグの選択はできるがchoose file nameにはタグ受信のための機能がない。また、拡張子が入力されていなかったらそのまま
▲本Scriptで表示したNSSavePanelによる保存ファイル名入力ダイアログ。タグの選択、指定した拡張子の指定などが行える。ユーザーが拡張子を入力していなくても自動で補える
choose file nameによるダイアログも、NSSavePanelによるダイアログも、見た目は同じで見分けはつきません。
普通にAppleScriptを書いて自分で実行している分にはchoose file nameコマンドでも問題はありません。
AppleScript名:ファイル保存ダイアログ(SavePanel)表示 |
— Original by Shane Stanley — Modified 2020-04-22 by Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property savePath : "" property saveTag : {} set savePath to "" set saveTag to {} set aParam to {extList:{"kame"}, saveMsg:"新規ファイルの名前と場所を指定", saveName:"Some name", initialDir:(POSIX path of (path to documents folder))} my performSelectorOnMainThread:"showModalSave:" withObject:(aParam) waitUntilDone:true return {savePath:savePath as string, saveTags:saveTag as list} –> {savePath:"/Users/me/Desktop/Some name.kame", saveTags:{"ブルー", "ヤンキー"}} on showModalSave:sender set tmpExt to extList of sender as list set tmpMsg to saveMsg of sender as string set defName to saveName of sender as string set tmpInit to initialDir of sender as string using terms from scripting additions set startURL to current application’s NSURL’s fileURLWithPath:(tmpInit) end using terms from set thePanel to current application’s NSSavePanel’s savePanel() tell thePanel its setMessage:(tmpMsg) its setAllowedFileTypes:(tmpExt) its setNameFieldStringValue:(defName) its setShowsHiddenFiles:false its setTreatsFilePackagesAsDirectories:false –its setDirectoryURL:startURL–指定しないほうが前回呼び出し時と同じフォルダが表示されて便利 set returnCode to its runModal() as integer end tell if returnCode = (current application’s NSFileHandlingPanelOKButton) as integer then set my savePath to thePanel’s |URL|()’s |path|() if (thePanel’s respondsToSelector:"tagNames") as boolean then set my saveTag to thePanel’s tagNames() end if else — cancel button error -1 end if end showModalSave: |