終了

テキストフレームのスプレッドを取得

積極的な参加者 ,
Jun 22, 2022 Jun 22, 2022

ExtendScriptでテキストフレームのスプレッドを取得する方法が知りたいです。

// スプレッド取得(オブジェクト)
function getSpread(hierarchyObject){

    // Spread、または、MasterSpreadの場合
    if(hierarchyObject.constructor.name == "Spread" || hierarchyObject.constructor.name == "MasterSpread"){

        // 戻す
        return hierarchyObject;

    // 文字(アンカーオブジェクト)の場合
    }else if(hierarchyObject.constructor.name == "Character"){
        
        // 再帰処理(親のテキストフレーム)
        hierarchyObject = getSpread(hierarchyObject.parentTextFrames[0]);

    // 以外の場合
    }else{
        
        // 再帰処理(一つ上の階層のオブジェクト)
        hierarchyObject = getSpread(hierarchyObject.parent);
    }
    
    // 戻す
    return hierarchyObject;
}

の様な方法を考えてみたのですが、これで良いものか・・・

 

スマートな取得方法はありますでしょうか?

キーワード
スクリプティング
851
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 22, 2022 Jun 22, 2022
function getSpread(obj){
    var reg = new RegExp(/Spread/);
    while(reg.test(obj.reflect.name) == false){
        //$.writeln(obj);
        if(obj.parent.reflect.name == "Story"){ //アンカーオブジェクト対策のつもり
            obj = obj.parentTextFrames[0];
            }
        obj = obj.parent;
        }
    return obj;
    }

alert(getSpread(app.selection[0]));

 

とりあえずセル内文字とアンカーオブジェクト内文字には対応できたようなので、いけると思うんですが(スマートかどうかわかりませんが)

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Jun 23, 2022 Jun 23, 2022
最新

testとreflectを使う方法、興味深く拝見させて頂きました。
参考に成りました。

 

有難うございます。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Jun 23, 2022 Jun 23, 2022

私の考えは、琥珀 猫太郎と同じ下から辿っていく方法ですが、「文字(アンカーオブジェクト)の場合」の処理を、テキストリンクや表内のアンカーオブジェクトを考慮します。

 

「文字(アンカーオブジェクト)の場合」の処理関数を記載しておきます。

 

// 親テーブルの取得
function GetParentTable(pageItem)
{
	var	ret = null;

	if (pageItem != null) {
		var parentItem = pageItem.parent;
		var szParent = parentItem.constructor.name;
		if (szParent == "Table") {
			ret = parentItem;
		} else {
			// 親テーブルの取得
			ret = GetParentTable(parentItem);
		}
	}
	return ret;
}

// Characterの親テキストフレームの取得
function GetParentTextFrame(characterItem)
{
	var	ret = null;
	var	nFrameCnt, nFramePos;
	var	nCharCnt, nCharPos;

	if (characterItem != null) {
		var parentItem = characterItem.parent;
		var szParent = parentItem.constructor.name;
		if (szParent == "Story") {
			nFrameCnt = characterItem.parentTextFrames.length;
			if (nFrameCnt > 0) {
				for (nFramePos = 0; nFramePos < nFrameCnt; nFramePos++) {
					var textFrame = characterItem.parentTextFrames[nFramePos];
					nCharCnt = textFrame.characters.length;
					for (nCharPos = 0; nCharPos < nCharCnt; nCharPos++) {
						var frameCharacter = textFrame.characters[nCharPos];
						if (frameCharacter == characterItem) {
							ret = textFrame;
							break;
						}
					}
					if (nCharPos < nCharCnt) {
						break;
					}
				}
				if (ret == null) {
					ret = characterItem.parentTextFrames[0];
				}
			}
		}
		else if (szParent == "Cell") {
			// 親テーブルの取得
			ret = GetParentTable(parentItem);
		}
	}
	return ret;
}

 

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Jun 23, 2022 Jun 23, 2022

parentPageプロパティが便利です(CS5以降の実装です)。

 

app.activeDocument.textFrames[0].parentPage.parent

 

Pageオブジェクトの親がSpreadになるので、基本はこれで取得できます。 

 

選択したオブジェクトが対象なら、これも使えます。

 

app.activeWindow.activePage.parent

 

選択している=アクティブなページから親をたどるだけです。

 

もしCS5よりも古いバージョンのInDesignだと、他の方が工夫されているように割と面倒なアプローチが必要です。

parentPageが実装されて、オブジェクトとページの紐付けがやりやすくなりました。

 

Yusuke S.
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Jun 23, 2022 Jun 23, 2022

parentPageですが、ページ外の部品はnullなので、その場合のルールを考えておかないといけません。

 

 

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Jun 23, 2022 Jun 23, 2022

それは確かにそうですね。

ペーストボード上のオブジェクトを対象としてどういう処理を行うか、スクリプトの仕様次第というところでしょうか。

Yusuke S.
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Jun 23, 2022 Jun 23, 2022

ページ内にあると限定した場合はparentPageが良いですね

 

選択がある場合は、activeWindow.activeSpreadでも良いかもですね

activeWindowを使う方法は全く思いつきませんでした。

 

有難うございます。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines