指定したフォルダ内のドキュメントを全部開く(InDesign & Illustrtor)

某企業内で行った今日のスクリプト講習の中で「指定したフォルダの中(サブフォルダも含めて)にあるinddファイルを全部開くにはどうしたらいいんですか」と聞かれた。

10分で書けるけど、それを初心者に教えるのは3時間ぐらいかかるよ。再帰関数は理解しにくいし「でもやりたいんです」ということで、まあ、それならやってみなさい、一応答えは用意しておくから。

ということで、答えをブログに書きます。ただ折角書くんだから自分なりにひと工夫したいなあということで、InDesign & Illustrtor両対応のスクリプトにしました。CC2017でしか確認してないけど、大概のバージョンで動くでしょ。ちょっと改造すればPhotoshopでも動くでしょ、きっと。それにしてもIllustrtorのスクリプトなんて何年ぶりだろ、CS2以来じゃないか?

なるべく初心者でもわかるように基礎的な書き方をしたつもりなんだけど、それでも理解してもらうのは大変だわな。

//ファイルリストを格納する配列
var theList = [];
//拡張子を格納する変数
var ext;

if (app.name == "Adobe InDesign") {
    ext = ".indd";
    main();
} else if (app.name == "Adobe Illustrator") {
    ext = ".ai";
    main();
} else {
    alert("このアプリケーションには対応していません");
}

function main() {
    //フォルダの選択
    var selFolder = Folder.selectDialog("フォルダを選択してください");
    if (selFolder == null) {
        alert("フォルダの指定がキャンセルされました。スクリプトを終了します");
        return;
    }
    
    //再帰関数を呼び出す
    getFF(selFolder);
    
    //実行の確認
    var res = confirm(theList.length + "個のファイルが見つかりました。\n開きますか?");
    if (res == false) {
        alert("キャンセルされたのでスクリプトを終了します");
        return;
    }
    
    //ファイルを開く
    for (var j = 0; j < theList.length; j++) {
        app.open(File(theList[j]));
    }
}

//再帰関数
function getFF(tFolder) {
    //フォルダ内のファイルとフォルダの一覧を取得
    var ffList = tFolder.getFiles();
    
    for (var i = 0; i < ffList.length; i++) {
        //Fileオブジェクトであれば
        if (ffList[i].constructor.name == "File") {
            //拡張子が一致すればフルパス名を配列に追加
            var lastDot = ffList[i].name.lastIndexOf(".");
            if (ffList[i].name.slice(lastDot) == ext) {
                theList.push(ffList[i].fsName);
            }
        //Folderオブジェクトであれば
        } else {
            //自身の関数を呼び出す
            getFF(ffList[i]);
        }
    }
}