特定のアイテムがどのスプレッド、もしくはページにあるのかを知りたいときがあります。

選択されているアイテムであれば、アクティブスプレッドかアクティブページを取得すれば済むかもしれません。

しかし、「アイテムがページ内にある場合はpage、ペーストボードにある場合はspreadが知りたい」といった目的は達成できません。もとより、選択されていないアイテムの場合はこの方法は使えません。

CS4までは親オブジェクト(.parent)をたどっていけばアイテムが置かれているページ、もしくはペーストボードのアイテムであればスプレッドが取得できました。

しかし、CS5からはオブジェクトの継承が変わってしまい、親ページを取得したい場合は「.parentPage」、親スプレッドは従来通りparentをたどって取得しなければなりません。

 

以下の関数(getPlace)は、マルチバージョンに対応したコンテナページ/スプレッドを取得するものです。

参照したいオブジェクトを引数として呼び出すと、そのオブジェクトが配置されているページか、ペーストボードにある場合はスプレッドを返します。PageItemに限らず、画像やテキストにも対応しています(ボタンや表には対応していない)。なお、ここでは現在選択されているオブジェクトに対して使用しています。

//ターゲットオブジェクトが配置されているページ/スプレッドを取得
function getPlace(obj) {
	try {
        var pntObj= obj.parent; //親オブジェクト
        var pntObjName= pntObj.constructor.name; //親オブジェクトのクラス名
        if (pntObjName=='Page') {return pntObj;} //そのまま返す
        if ( (pntObjName=='Spread')||(pntObjName=='MasterSpread') ) {
            if ( (parseInt(app.version)>=7)&&(obj.parentPage !== null) ) {
                return obj.parentPage;
            }
            return pntObj; //そのまま返す
        }
        //再帰呼び出し
        var targetObjName= 'InsertionPoint, TextStyleRange, Character, Word, Line, TextColumn, Paragraph, Story'; //テキスト系とみなすオブジェクト名
        if ( targetObjName.match(obj.constructor.name) ) {
            //オブジェクトがテキスト系だった場合
            var res= getPlace(obj.parentTextFrames[0]);
        } else {
            // それ以外なら...
            var res= getPlace(pntObj); //親オブジェクトで再帰呼び出し
        }
        return res;
    } catch(e) {
        return undefined;
    }
}
//メインコード
var selObj= app.activeDocument.selection[0]; //選択しているオブジェクト
var containerObj= getPlace(selObj);
var pntObjName= containerObj.constructor.name; //親オブジェクトのクラス名
$.writeln (pntObjName); //Page or Spread or MasterSpread

 

 

Joomla templates by a4joomla