[ 掲示板に戻る ]

記事No.9142に関するスレッドです

JavaScriptでのフレーム調整オプション設定 / chirico
アドビ製品の製品名とバージョン番号
オペレーティングシステムの種別とバージョン番号
エラーメッセージの全文
問題が発生した時の操作状況

JavaScriptでフレーム調整オプションがうまく動作しません

InDesign CS5
Mac OSX 10.6.8

JavaScriptの質問です。
画像フレームを新規作成し、フレーム調整オプションの整列位置を天地左右センターにする
という目的で下記のスクリプトを作りました。
CS4までは問題なく動作しましたが、CS5以降ではフレーム調整オプションの部分でエラーが発生します。(添付画像参照)
回避策として、フレームを指定し直すことで一応動くようにはなりました。これはCS5以降で仕様が変わったという事でしょうか。
もっと根本的な解決方法があれば、ご教示のほどよろしくお願いいたします。

また、このスクリプトでは先頭ページにフレームが作成されます。画面上のページに作成する方法はありますでしょうか。

以上、よろしくお願いいたします。

var myFrame = app.activeDocument.textFrames.add();
myFrame.visibleBounds = ["10mm","10mm","287mm","200mm"];
myFrame.contentType = ContentType.GRAPHIC_TYPE;
//CS5以降は次の行をコメントアウトしないと動かない?
//myFrame = app.activeDocument.allPageItems[0];
myFrame.frameFittingOptions.fittingAlignment = AnchorPoint.CENTER_ANCHOR;

No.9142 2017/03/08(Wed) 16:50:59
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:48.0) Gecko/20100101 Firefox/48.0

Re: JavaScriptでのフレーム調整オプション設定 / たう
別に「テキストフレームを画像フレームに変換」がやりたいわけじゃないんですよね?
最初からtextFramesじゃなくてrectangles.add()を使えばcontentTypeを変える必要もないし、バージョンに依存するようなこともなくなるかと思います。

No.9143 2017/03/08(Wed) 19:32:27
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0

Re: JavaScriptでのフレーム調整オプション設定 / chirico
たう様
早速のご返答、ありがとうございます。

>別に「テキストフレームを画像フレームに変換」がやりたいわけじゃないんですよね?
はい、その通りです。あくまで必要なのは画像フレームです。
いきなり画像フレームを作成する命令がなかったので、テキストフレーム→画像フレームという流れにしました。
rectangles.add() を使わなかったのは、InDesignのデフォルトカラー設定ではフレームに枠線がついてしまうためです。textFrames.add() の場合は線なしになるので、こちらを使った次第です。
ヒントをいただけたので、もう少し検証することといたします。

自分の投稿を改めてみたら、最初の4行(アドビ製品〜)は下書きの削除漏れでした。お恥ずかしい限りです。

No.9144 2017/03/09(Thu) 11:01:06
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:48.0) Gecko/20100101 Firefox/48.0

Re: JavaScriptでのフレーム調整オプション設定 / (z-) URL
CS5以降で動作しなかった点は他の神様に譲るとしてw

var myFrame = app.activeDocument.textFrames.add();
のところ、
var myFrame = app.activeWindow.activePage.textFrames.add();
とすることで、おさわり中のページ上に作成されます。
表示状況によってはアクティブなページではなくスプレッドの左上に作成されますが。。環境設定「定規の開始位置」を「スプレッド」にしてしのいでください。

No.9145 2017/03/09(Thu) 12:16:17
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; ja-jp) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

Re: JavaScriptでのフレーム調整オプション設定 / uske_s
アクティブなページにフレームを作るやり方はz-さんのコードをさんしょうしていただくとして、
肝心のCS5以降でエラーになる件です。

contentTypeを変更した後に
alert(myFrame.constructor.name);
を挟んでみると「TextFrame」と返ってきます。
このことから、contentTypeを変更しても、textFrames.add()で生成されたオブジェクト自体の属性は、
そのスクリプト上では変更されません。
(コンストラクタとインスタンスについては僕も詳しくないので、この方面に明るい方に譲ります)

さて、エラーになるframeFittingOptionsですが、
CS3とCS4ではTextFrameオブジェクトに対してもプロパティが与えられていました。
しかしCS5以降、このframeFittingOptionsはTextFrameオブジェクトには対応しなくなっています。
(現行最新版のCC2017まですべてです)
ここがCS5以降でエラーになる原因で、お察しのとおり仕様が変更されたためです。

続いて、myFrameを取得し直すとエラーにならない(下記の1行を追加するとエラーにならない)のは、
var myFrame = app.activeDocument.allPageItems[0];
InDesignが新たにオブジェクトを探し出すからです。
スクリプト上ではtextFrames.add()で生成されたオブジェクトですが、
InDesignが探し出したのはcontentTypeを変更されてグラフィックフレームになっているRectangleです。
これはInDesignで長方形フレームツールで作成した長方形オブジェクトと同じと判断され、
RectangleとしてmyFrameに参照されます。
結果、TextFrameではなくRectangleのプロパティを参照できるようになるということです。

以上より、解決の方法ですが、
1.var myFrame = app.activeDocument.allPageItems[0];のような方法で取得し直す
2.たうさんがおっしゃっているように、Rectangleとして生成する
3.スクリプトバージョンを落とす(CS4相当、つまり6.0などにする)

2については、懸念されているとおりInDesignのデフォルト設定を持ったままフレームを作成してしまうため、
プロパティひとつひとつを好みの設定に書き換えていくか、
グラフィックスタイルを用意してあてがう必要があります。

3については、非常に後ろ向きでおすすめできませんが、スクリプトのバージョンを下げるやり方です。
具体的には
app.scriptPreferences.version = 6.0;
と記述するのですが、これを記述した部分以降はすべてこのバージョンのスクリプトを参照します。
よく注意してお使いください。

No.9146 2017/03/09(Thu) 15:20:41
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

Re: JavaScriptでのフレーム調整オプション設定 / chirico
(z-)様
アドバイスいただき、ありがとうございます。
activePage指定を試してみました。バッチリです。現在開いているページ上に作成できます。マスターページ上でも同様に動きをしてくれました。これでほぼ希望通りになりました。
轟く本物の方にもちょくちょくお邪魔しますので、そちらでもよろしくお願いいたします。

uske_s様
検証のご報告と丁寧なご説明をいただきまして、ありがとうございます。スクリプト勉強中の私にはとても分かりやすくて助かりました。ホント大助かりです。
解決案も複数、提案していただきとても参考になりました。それぞれの利点・注意点も記載されているご配慮がうれしいです。
今回は、1.の案で乗り切る予定です。そもそも今回のスクリプトはInDesignを出力台紙として使うものなので、おそらくこれで問題ないかと思われます。あらかじめ、フレーム調整オプションのデフォルト設定をセンターにしておいても良いですし。
わからないのは、最初から画像フレームを作る graphicFrames.add() のような命令が用意されていないのはなぜでしょうかね。うーむ、不思議です。

という訳で皆様のアドバイスのおかげでほぼ解決いたしました。
本当にありがとうございました。

No.9147 2017/03/09(Thu) 17:15:16
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:48.0) Gecko/20100101 Firefox/48.0

Re: JavaScriptでのフレーム調整オプション設定 / たう
1.でいくならオブジェクトの再取得は
myFrame = myFrame.getElements()[0];
を使うとよいです。

ですけどやっぱり枠線をなくすためだけにわざわざテキストフレームにするというのはよろしくないと思います。rectanglesで作って、オブジェクトスタイル[なし]あたりを適用してやるのがスジかと。

graphicFrames.add() のようなのが無いのはグラフィックフレームもrectalge等のパスオブジェクトも実質的には同じものだからでしょう

No.9148 2017/03/10(Fri) 00:13:30
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0

Re: JavaScriptでのフレーム調整オプション設定 / chirico
たう様

補足、ありがとうございます。
再取得については、ご指摘通りでした。確認したところ、
myFrame = app.activeDocument.allPageItems[0];
では、先頭ページのフレームを取得していました。これではダメですね。

フレーム作成についてのご意見は、とても参考になりました。様々なアプローチがある中から、最適なものを見つけるのも面白いものです。もう少しいろいろ試してみます。

しかし、スクリプトは自分で書いてみないと、本当に理解しているか分からないものですね。思ったよりもわかっていませんでした。むむむ。

No.9149 2017/03/10(Fri) 16:16:18
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:48.0) Gecko/20100101 Firefox/48.0