0

私はかなり新しいプログラマーです。私はかなり高度なことを試みていますが、良い挑戦を楽しんでいます。:~) Adob​​e の ESTK (ExtendScript Toolkit) を使用して、InDesign CS6 用の複雑なスクリプトを作成しています。ほとんどのチュートリアルを完了し、かなりのことを学びましたが、今は壁にぶつかっています。

特定のフォルダーが特定の基準を満たしているかどうかを検出するスクリプトが必要です。満たされている場合は、そのフォルダーを詳しく調べ、そのすべてのサブフォルダーを数え、それらの各サブフォルダー内の各 .indd ファイルを開き、実行します。それぞれのタスク。今日スクリプトを開始したばかりで、これまでのところ次のとおりです。

var getDataDialog = app.dialogs.add({name:"Job Info"});
with(getDataDialog){
    // Add a dialog column.
    with(dialogColumns.add()){
        // Create the order number text edit box.
        var orderNumTextEditBox = textEditboxes.add({minWidth:80});
        }
    }
// Show the dialog box.
var dialogResult = getDataDialog.show();
if(dialogResult == true){
    // Get the order number and put it in the variable "orderNum".
    var orderNum = orderNumTextEditBox.editContents;
    // Get the first three numbers of the order number and put it in "orderPrefix".
    var orderPrefix = orderNum.substr(0,3);
    // Remove the dialog box from memory.
    getDataDialog.destroy();
    // Store the folder prefix into "folderPrefix".
    var folderPrefix = "/g/ ArtDept/JOBS/" + orderPrefix + "000-" + orderPrefix + "999/"
    // Open the document with the order number.
    var myDoc = app.open(File(folderPrefix + orderNum + " Folder/" + orderNum + ".indd"), true);
    }
else{
    getDataDialog.destroy();
    }

したがって、入力された注文番号が「405042」の場合、「405000-405999」フォルダを検索し、次に「405042 フォルダ」というパッケージ化されたフォルダを検索し、その中の .indd ファイルを開きます。問題は、フォルダー内に複数のパッケージがある場合があることです。たとえば、次のようになります。

405000-405999/405007/405007_N10/405007_N10.indd
405000-405999/405007/405007_C12/405007_C12.indd
405000-405999/405007/405007_Orange/405007_Orange.indd

スクリプトでこれらの各ファイルを順番に開き、それらに対していくつかのタスクを実行する必要があります。可能だと確信していますが、それをコーディングする方法を知る必要があるだけです。

4

1 に答える 1

2

あなたの問題を正しく理解していれば、次の 2 つの部分があります。

パート 1: 特定の条件を満たす特定のフォルダーを検索します。(あなたはこれをカバーしているようです。)

パート 2: このフォルダーの子孫である InDesign ドキュメントごとに、それを開いて何らかの処理を行います。

以下のサンプルでは、​​トップ フォルダーを検索するコードと、各ドキュメントを操作するコードを追加する必要がある場所にラベルを付けました。サンプルをそのまま実行すると、スクリプトの親フォルダーが最上位フォルダーとして使用され、子孫ドキュメントごとにその名前がログに記録されます。

// TODO: (Part 1) Put code here that determines the top folder.
var topFolder = (new File($.fileName)).parent; // Change me. Currently the script's folder.
forEachDescendantFile(topFolder, doStuffIfdocument); // Don't change this line.

/**
 * Does stuff to the document.
 */
function doStuff(document) {
    // TODO: (Part 2) Put code here to manipulate the document.
    $.writeln("Found document " + document.name);
}

/**
 * Opens the given file if it ends in ".indd". Then calls doStuff().
 * 
 * @param {File} oFile
 */
function doStuffIfdocument(oFile) {
    if (matchExtension(oFile, "indd")) {
        var document = app.open(oFile);
        try {
            doStuff(document);
        }
        finally {
            document.close(SaveOptions.YES);
        }
    }
}

/**
 * Calls the callback function for each descendant file of the specified folder.
 * The callback should accept a single argument that is a File object.
 * 
 * @param {Folder} folder The folder to search in.
 * @param {Function} callback The function to call for each file.
 */
function forEachDescendantFile(folder, callback) {
    var aChildren = folder.getFiles();
    for (var i = 0; i < aChildren.length; i++) {
        var child = aChildren[i];
        if (child instanceof File) {
            callback(child);
        }
        else if (child instanceof Folder) {
            this.forEachDescendantFile(child, callback);
        }
        else {
            throw new Error("The object at \"" + child.fullName + "\" is a child of a folder and yet is not a file or folder.");
        }
    }
}

/**
 * Returns true if the name of the given file ends in the given extension. Case insensitive.
 *
 * @param {File} iFile
 * @param {String} sExtension The extension to match, not including the dot. Case insensitive.
 * @return {boolean}
 */
function matchExtension(iFile, sExtension) {
    sExtension = "." + sExtension.toLowerCase();
    var displayName = iFile.displayName.toLowerCase();
    if (displayName.length < sExtension.length) {
        return false;
    }
    return displayName.slice(-sExtension.length) === sExtension;
}
于 2013-05-14T19:12:02.140 に答える