« JavaScript for Automation (JXA)で色々やってみる | トップページ | JavaScript for Automation (JXA)でUTF-8テキストの読み書き »

2018年2月15日 (木)

JavaScript for Automation (JXA)でフォルダアクション

フォルダアクションスクリプトを JXA で書こうとしたがうまくいかない。

function addingFolderItemsTo(this_folder, {afterReceiving:added_items}) {
	//
}

というメソッドが実装されているはずなのだが、うまく動作しない。

ただ、上記のメソッドを記述しなくても

var finder = Application('Finder')
finder.includeStandardAdditions = true
var added_items = finder.selection()

のようなスクリプトを単にフォルダアクションとして登録するだけで、一応動作はするのだが、それだとそのフォルダから項目を取り除いた場合や、フォルダウィンドウを開いたり閉じたりしただけでも処理が行われてしまうので、実用的ではない。

そこで、Automator を介してフォルダアクションを動作させるという方法を試みた。

手順

Automator で「新規作成」する際フォルダアクションを指定する。

「JavaScriptを実行」アクションを追加して、その中にスクリプトを記述する。

app = Application.currentApplication();
app.includeStandardAdditions = true;
function run(input) {
	app.runScript('/Users/xxxxx/Library/Scripts/Folder Action Scripts/hogehoge.scpt', {withParameters:input});
}

この際注意すべきは、フォルダアクションで渡されるファイルのデータ(input という変数に格納されている配列)は Path("/Users/xxxxx/foo/bar") 型だということ。

実際にフォルダアクションを実行するスクリプト(この例では hogehoge.scpt)は以下のように書く。

var app = Application.currentApplication()
app.includeStandardAdditions = true
function run(input) {
	for (var i of input) {
		//ここにコード
	}
}

この場合、i は Path("/Users/xxxxx/foo/bar") 型なので、パスを得るには


var i_Path = i.toString()

項目の名前を得るには


var iName = i.toString().split("/").pop()

などとなる。



« JavaScript for Automation (JXA)で色々やってみる | トップページ | JavaScript for Automation (JXA)でUTF-8テキストの読み書き »

コメント

コメントを書く

(ウェブ上には掲載しません)

« JavaScript for Automation (JXA)で色々やってみる | トップページ | JavaScript for Automation (JXA)でUTF-8テキストの読み書き »