4

JXA を使用してAlfred 2のワークフローのスクリプトを作成していますが、最近、別のスクリプト内からスクリプトを実行しようとしました。スクリプト間でテキストを渡す必要があるため、パラメーターを使用することにしましたが、文字列、数値、配列など、オブジェクトではないものを渡そうとすると、エラー " Error on line 4: Error: An error occurred." が発生します。オブジェクトを渡すと、2 番目のスクリプト (最初のスクリプトによって実行されるスクリプト) は、渡されたオブジェクトではなく、空のオブジェクトを受け取ります。最初のスクリプトが AppleScript の場合も同じことが起こりますが、2 番目のスクリプトが AppleScript の場合は、すべて完全に機能します。osascriptコマンドラインから引数を渡すことも機能します。API が壊れているのでしょうか、それとも間違っているのでしょうか?

最初のスクリプト:

var app = Application.currentApplication();
app.includeStandardAdditions = true;

app.runScript(new Path("/path/to/second/script.scpt"), { withParameters: "Hello World!" });

2 番目のスクリプト:

function run(args) {
    return args;
}

編集:

2 番目のスクリプトを次のように編集すると、ダイアログは表示されますがrunScript、最初のスクリプトのメソッドは依然としてエラーを返します。

function run(args) {
    var app = Application.currentApplication();
    app.includeStandardAdditions = true;

    app.displayDialog(args.toString());

    return args;
}

編集2:

パラメータのrunScript問題以外は、関数は実際には完全に機能しているようです。エラーは実際にスローされるのではなく、スクリプト エディターによって表示されるだけであり、呼び出しの後、runScript何も起こらなかったかのように実行が続行されます。パラメータが機能していないにもかかわらず、戻り値も完全に機能します。

Alfred 2 ワークフローに関する注意事項

Alfred 2 でコードを実行するには (検索、キーボード コマンドなどによってトリガーされます)、ファイルではなく、アプリのボックスに入力する必要があります。 コードを入力するボックスは非常に小さく、構文が強調表示されないため、コードの編集が難しく煩わしくなります。ファイルが小さい場合は問題ありませんが、ファイルが大きい場合は、短いスクリプトを使用してスクリプト ファイルを実行する方が簡単です。最も単純なオプションである Bash を試しましたが、Alfred 2 には一重引用符をエスケープするオプションがありません。また、スクリプト ライブラリを使用することもできません (私の知る限り、間違っている場合は訂正してください)。これは、コードがスクリプト バンドルに含まれておらず、必要なすべてのファイルが同じフォルダー内にある必要があるためです (エクスポートの理由により)。

4

1 に答える 1

0

エラーを回避する方法はわかりませんがrunScript、別のアプローチを提案できます。スクリプトをスクリプト ライブラリとしてロードします。

スクリプト ライブラリの使用

スクリプトをライブラリに変換するのは、スクリプトを に保存するのと同じくらい簡単~/Library/Script Librariesです。スクリプト ファイルに名前が付けられscript.scpt、実行ハンドラーがあり、それをScript Librariesフォルダーに保存する場合、次のように別のスクリプトから呼び出すことができます。

Library("script").run(["Hello, world!"])

スクリプト ライブラリは、OS X 10.10 の JXA リリース ノート、JXA を紹介するWWDC 2014 セッション ビデオ、およびAppleScript 言語ガイドに記載されています。

スクリプト バンドル内にスクリプト ライブラリを埋め込む

Script Librariesスクリプト ライブラリに関する AppleScript 言語ガイドのドキュメントによると、フォルダーを検索するための検索ポリシーがあります。最初に検索する場所は次のとおりです。

ライブラリを参照するスクリプトがバンドルの場合、スクリプトのバンドル Resources ディレクトリ。これは、スクリプトが使用するライブラリとともにパッケージ化され、配布される可能性があることを意味します。

これを質問の例に適用するには、最初のスクリプトをスクリプト バンドルとして再保存し、2 番目のスクリプトを最初のスクリプト内に埋め込む必要があります。

たとえば、最初のスクリプトを として再保存すると、2 番目のスクリプトを にscript.scptd保存できます。を使用してスクリプト ライブラリにアクセスできるようになります。embedded.scptscript.scptd/Resources/Script Libraries/embedded.scptLibrary('embedded')

既存のスクリプトをスクリプト バンドルとして再保存するには、スクリプト エディタのメニュー項目を使用するか、オプションを押しながらメニューをFile > Export...選択してメニュー項目を表示します。ポップアップ メニューでフォーマットを選択できます。FileFile > Save As...File FormatScript bundle

スクリプト バンドルを開いたら、Show Bundle Contentsメニュー項目またはツールバー ボタンを使用してバンドル コンテンツ パネルを表示できます。次に、歯車メニューを使用してScript Librariesフォルダー内にフォルダーを作成しResources、スクリプトをそのフォルダーにドラッグできます。

于 2016-01-29T18:06:17.957 に答える