0

整理するために、.applescript ファイルを別のファイルに分けようとしています。

私は JS AppleScript ファイルTest.applescriptを実行しようとする JS AppleScript ファイルを呼び出していますGroup Tracks Dependency.applescript。私がやりたいことは、パラメーターを依存関係スクリプトに渡し、そこから戻り値を取得することです。(iTunes トラックの配列の配列を作成します)。

Test.applescript

(function() {
    var app = Application('iTunes');
    app.includeStandardAdditions = true;

    app.doShellScript('Group Tracks Dependency.applescript');

    return "Done";
})();

// For quick logging
function log(obj) {
    this.console.log(obj);
}

グループ トラック Dependency.applescript

(function(selection) {

    return getGroupsOfTracks(selection);

    function getGroupsOfTracks(originalTracksArray) {
        if (originalTracksArray == null || originalTracksArray.length == 0) 
            return null;

        var tracks = originalTracksArray.slice();
        var groups = [];
        while (true) {
            var group = [];
            group.push(tracks[0]);
            tracks = tracks.slice(1);

            while (true) {
                if (!tracks[0]) break;
                if (tracks[0].album() != group[0].album())
                    break;
                if (tracks[0].artist() != group[0].artist())
                    break;
                if (tracks[0].discNumber() != group[0].discNumber())
                    break;
                group.push(tracks[0]);
                tracks = tracks.slice(1);
            }

            groups.push(group);
            if (!tracks[0]) break;
        }

        return groups;
    }
})();

Test スクリプトを実行しようとすると、次のエラーが表示されます (5 行目がそのapp.doShellScript行です)。

Error on line 5: Error: A privilege violation occurred.

これを回避する方法はありますか?また、将来的には他の人がこれらのスクリプトをダウンロードして、独自の iTunes ライブラリで実行できるようにしたいと考えています (現在のところ、ユーザー フレンドリーではありません)。

これを回避する方法がない場合、別の JS AppleScript ファイルをインポートすることはできますか?

4

3 に答える 3

1

.doShellScript では勝てない戦いをしているのかもしれません。

Apple の方法は、https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/OSX10-11.html#//apple_ref/doc/uid/で定義されているスクリプト ライブラリを使用することです。 TP40014508-CH110-SW1

残念ながら、スクリプト ライブラリには、単純な変数しか渡せないという制約があります。

もう 1 つの方法は、 https://github.com/dtinth/JXA-Cookbook/wiki/Importing-Scriptsのようなコードで定義できる require を使用することです。

于 2016-05-12T04:12:10.033 に答える
0

あなたが何を達成しようとしているのかはわかりませんが、OSX 10.11.4 で Script Editor 2.8.1 (183.1) を使用すると、これが機能します。

  1. メインの JXA スクリプト ファイルを作成する
  2. JXA スクリプト ライブラリ ファイルを作成する

これらの両方をコンパイル済みスクリプト ファイル (.scpt) として保存する必要があります。

「残念ながら、スクリプト ライブラリには、単純な変数しか渡せないという制約があります」というのは正しくありません。

スクリプト ライブラリ ファイル内の任意の関数を任意の JXA スクリプトから呼び出すことができます。

Get iTunes Group Selection.scpt「 」と呼ぶ MAIN スクリプト ファイルでは、次のように指定します。

var app = Application('iTunes');
app.includeStandardAdditions = true;

var myLib = Library("My JXA Lib")

var selectionArr = app.selection()   // ### Change as needed ###
var groupArr = myLib.getGroupsOfTracks(selectionArr)
groupArr

~~~~~~~~~~~~~~~~~~~~~

次に、別のスクリプト ファイルに次のように保存します。 ~/Library/Script Libraries/My JXA Lib.scpt

function getGroupsOfTracks(originalTracksArray) {
        if (originalTracksArray == null || originalTracksArray.length == 0) 
            return null;

        var tracks = originalTracksArray.slice();
        var groups = [];
        while (true) {
            var group = [];
            group.push(tracks[0]);
            tracks = tracks.slice(1);

            while (true) {
                if (!tracks[0]) break;
                if (tracks[0].album() != group[0].album())
                    break;
                if (tracks[0].artist() != group[0].artist())
                    break;
                if (tracks[0].discNumber() != group[0].discNumber())
                    break;
                group.push(tracks[0]);
                tracks = tracks.slice(1);
            }

            groups.push(group);
            if (!tracks[0]) break;
        }

        return groups;
 }

于 2016-05-12T22:54:02.393 に答える