InDesignのJavascriptには、everyItem()という謎なメソッドが存在する。API説明を見てみると:Returns every object(単数) in the collection

例:

TextFrames.everyItem(): Returns every TextFrame in the collection. 

Cells.everyItem(): Returns every Cell in the collection.

要すると:objects(複数).everyItem()-->object(単数)のlist/collectionが返ってくる。そのlistがメモリの中に格納され、後でobjectの属性を取得する時、爆速!

2つの例(昔実際に発生した案件中の一部の処理)で、どのぐらい早くなるかを検証してみる。 


 

例1:文字塗りに使っていけない色が存在するか。仮にDIC 582sを例に

//textFrame内の文字には、「DIC 582s」という特色を使っているかをチェック
var tf = app.selection[0];
var characters = tf.characters;
var len = characters.length;
var curChar;

//通常loopの場合
var start = new Date();
for (var c = 0; c < 100; c++) {//100回Loop
    for (var i = 0; i < len; i++) {
        curChar = characters[i];
        if (curChar.fillColor.name === "DIC 582s") {
            // $.writeln(curChar.contents);
        }
    }
}
$.writeln((new Date() - start) / 1000);//8秒程度

//
//everyItem()メソッドを使う場合
var start = new Date();
var fillColors = characters.everyItem().fillColor;//list[[object Color],...]
for (var c = 0; c < 100; c++) {//100回Loop
    for (var i = 0; i < len; i++) {
        if (fillColors[i].name === "DIC 582s") {
            // $.writeln(characters[i].contents);
        }
    }
}
$.writeln((new Date() - start) / 1000);//0.4秒程度 

8秒-->0.4秒:20倍程度早くなる 

※因みに、InDesign 2021には、色を検索する機能が搭載されました。

例2:表組から、セルの線幅が0.2mmのセルを探す

//通常loopの場合
var start = new Date();
for (var c = 0; c < 10; c++) {//10回Loop
    for (var i = 0; i < len; i++) {
        cell = cells[i];
        top = cell.topEdgeStrokeWeight;
        bottom = cell.bottomEdgeStrokeWeight;
        left = cell.leftEdgeStrokeWeight;
        right = cell.rightEdgeStrokeWeight;
        if (parseInt(top * 10) === 2 || parseInt(bottom * 10) === 2 ||
            parseInt(left * 10) === 2 || parseInt(right * 10) === 2) {
            // $.writeln(i + 1);
        }
    }
}
$.writeln((new Date() - start) / 1000);//5.5秒程度

//everyItem()メソッドを使う場合
var start = new Date();
var tmp = cells.everyItem();
var tops = tmp.topEdgeStrokeWeight;//list
var bottoms = tmp.bottomEdgeStrokeWeight;
var lefts = tmp.leftEdgeStrokeWeight;
var rights = tmp.rightEdgeStrokeWeight;
for (var c = 0; c < 10; c++) {//10回Loop
    for (var i = 0; i < len; i++) {
        if (parseInt(tops[i] * 10) === 2 || parseInt(bottoms[i] * 10) === 2 ||
            parseInt(lefts[i] * 10) === 2 || parseInt(rights[i] * 10) === 2) {
            // $.writeln(i + 1);
        }
    }
}
$.writeln((new Date() - start) / 1000);//0.13秒程度

5.5秒-->0.13秒:40倍程度早くなる