InDesignスクリプトのプライマリテキストフレームがおかしい

久しぶりにオブジェクトモデルの質問が来ました。マスターページprimaryTextFrameプロパティの値が「PageItem, NothingEnum.NOTHING」なのはおかしいのではないか、ということです。

Adobeのドキュメントに間違いがあるのは今更指摘しなくても、ということなんですが、きちんと確認していなかったので調べてみました。

その前に「プライマリテキストフレーム」18.0(2023)から新規作成ダイアログでは「テキストフレームの自動生成」、環境設定では「自動生成されたテキストフレームに制限」という具合に表現が変更されています。今から説明する図17.0(2022)のものですので、18.0より後のバージョン(将来を見越して)では適宜読み替えてください。

で、プライマリテキストフレームなんですが、「テキストフレーム」といいつつ、パス上文字にも設定できます。

また、連結されたテキストフレームもプライマリテキストフレームに設定できます。ですからこのようなことも可能。

ですからスクリプト上で「プライマリテキストフレーム」というと「テキストフレームまたはパス上文字の集合(配列)」という形になると思うんですが、実際にスクリプトを動かしてみるとそうではありません。


次のコードを実行してプライマリテキストフレームの値を取得します。

var ms = app.documents[0].masterSpreads[0];
$.writeln(ms.primaryTextFrame);

プライマリテキストフレームが設定されていない場合:null(これNothingEnum.NOTHINGと同じです)

1つのテキストフレームが設定されている場合:[Object TextFrame]

1つのパス上文字が設定されている場合:[Object TextPath]

連結されている最初がテキストフレームの場合:[Object TextFrame]

連結されている最初がパス上文字の場合:[Object TextPath]

ということで、連結されていた場合は最初のものしか取得できません。AdobeのドキュメントにPageItemとあるのに実際には「TextFrame」「TextPath」ということになります。


続いて設定する方をやってみます。primaryTextFrameプロパティは読み書き可能なプロパティ(つまり読み取り専用ではない)なのでスクリプトから設定できるはずです。(読み書き可能かどうかは次のコードでも確認しました。)

var obj = app.documents[0].masterSpreads[0];
var prp = obj.reflect.properties;
for (var p in prp) {
	if (prp[p].name == "primaryTextFrame") {
		$.writeln(prp[p].type); // readwriteが書き込まれた
		break;
	}
}

まず、テキストフレームをプライマリテキストフレームに設定した状態で次のコードを実行します。

var ms = app.documents[0].masterSpreads[0];
ms.primaryTextFrame = NothingEnum.NOTHING;

すると「この要求に対して無効なオブジェクトです。」というエラーメッセージが出ます。NothingEnum.NOTHINGをnullにしても同様です。

次にプライマリテキストフレームを設定していない状態で、テキストフレームをプライマリテキストフレームに設定します。

var ms = app.documents[0].masterSpreads[0];
ms.primaryTextFrame = ms.textFrames[0];

この場合も「この要求に対して無効なオブジェクトです。」というエラーメッセージが出ました。

では次に、パス上文字をプライマリテキストフレームに設定します。

var ms = app.documents[0].masterSpreads[0];
var po = ms.polygons[0];
var tp = po.textPaths[0];
ms.primaryTextFrame = tp;

すると次のようなエラーメッセージが出ます(ExtendScript Toolkit)。

セットのプロパティ'primaryTextFrame'の値が無効です。予想される値は PageItem or NothingEnum enumerator ですが、値 TextPath を受け取りました。」

また、マスターページにテキストフレーム1つだけ置いて次のコードを実行しても「この要求に対して無効なオブジェクトです。」というエラーメッセージが返ってくるだけです。

var ms = app.documents[0].masterSpreads[0];
ms.primaryTextFrame = ms.pageItems[0];

ということで、プライマリテキストフレームを設定に成功しませんでした。

ExtendScriptだけの問題かなと思っVBAでもやってみましたが同様ですね。エラーが出てしまいます。

なお、新規ドキュメント作成時にはプライマリテキストフレームを設定できますので、その点はご心配なく。

app.documentPreferences.createPrimaryTextFrame = true;
var doc = app.documents.add();

でも既存のドキュメントに設定する方法は見つかりませんねえ。手動でするしかないかなあ。