ObjecTips

Swift & Objective-C で iOS とか macOS とか

AppleScript の JavaScript for Automation でテキストをファイルに保存する

StandardAdditions を使用する

保存ダイアログを表示するには StandardAdditions ライブラリに入っている chooseFileName 関数を使う。
JavaScript for Automation では StandardAdditions を使う前に includeStandardAdditions を有効にしてこのライブラリを使うという事を記述しなければならない。(AppleScript では記述は必要無い)

今回はファイルの書き出し自体はスクリプトエディタから行うので操作する対象のアプリケーションは

app = Application('Script Editor');

もしくは

app = Application.currentApplication();

で取得できる。

試しに StandardAdditions の beep 関数を使ってOSの警告音を鳴らしてみる。
以下のようなコードになる。

AppleScript では beep と一行書くだけでOK

保存ダイアログを表示する

保存ダイアログの表示には chooseFileName 関数を使う。
この関数にはいくつかオプションが容易されていて、ドキュメントによれば JavaScript for Automation ではこれらの名前付きパラメータ(named parameters)と呼ばれるパラメータをオブジェクト型で引数に渡してやるらしい。
例えば defaultName オプションはダイアログでデフォルトで使用されるファイル名を指定できる。

app.chooseFileName({
  defaultName: 'Untitled.txt'
});

また、defaultLocation オプションはデフォルト表示されるディレクトリパスを指定する事ができる。

app.chooseFileName({
  defaultLocation: app.pathTo('desktop')
});

pathTo 関数の引数に 'desktop' 'documents folder' など規定の値を渡す事で特定のディレクトリのパスを取得する事ができる。
chooseFileName 及び pathTo 関数で利用可能なオプションと定数についてはリファレンスを参照の事。

chooseFileName 関数はユーザによって選択されたパスを返すので、以下のようにしてパスを取得する。

テキストをファイルに保存する

ファイル保存を行うには openForAccess 関数で書き込み権限付きのファイル番号を取得する必要がある。
openForAccess 関数は第1引数にダイレクトパラメータ (direct parameter)、第2引数に名前付きパラメータ (named parameters) を持つ形になっている。名前付きパラメータ(named parameters)はオブジェクト型で渡すので、writePermission オプションを指定したファイル番号の取得は以下のようになる。

options = {
  writePermission: true
};
fileReferenceNumber = app.openForAccess(filePath, options);

ファイル番号が取得できたら write 関数で書き込みを行う事ができる。
write 関数も第1引数にダイレクトパラメータ (direct parameter) を持ち、第2引数に名前付きパラメータ (named parameters) を持つ形になっている。
名前付きパラメータ (named parameters) にオプション以外に必須パラメータも含まれているのがこれまでの関数と少し異なる。

必須パラメータの to を指定してテキストのファイル書き出しを行う処理は以下のようになる。

text = 'asdf';
options = {
  to: fileReferenceNumber
};
app.write(text, options);

最後に、openForAccess で利用したファイル番号は使い終わったら closeAccess 関数で閉じてやる必要がある。

app.closeAccess(fileReferenceNumber);

ファイルの読み書きが終わってから最後にこの処理を実行してやる。

まとめ

全体の処理をリファクタリングしてまとめたものが以下。
実行すると保存ダイアログが開き、ユーザが指定したパスにコード内で記述した文字列が書かれたテキストファイルが作成される。