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();
でも既存のドキュメントに設定する方法は見つかりませんねえ。手動でするしかないかなあ。