InDesignのスクリプトで質問があります。
複数アイテムを選択してスクリプトを動かすと、
テキストフレームに入っている文字を
黒色に変えるスクリプトを作りましたが、
多重にグループ化されたアイテムがあると希望通り動作しません。
どのようにすれば、多重グループ化されたアイテムに対しても処理できるのでしょうか?
お教え下さい。
作ったスクリプトは下記の通りです。
var docObj = app.activeDocument;
sel = docObj.selection;
for (i=0; i<sel.length; i++){
if ( sel[i] .constructor.name == "Group" ){
myGroup = sel[i].allPageItems;
for ( j=0; j<myGroup.length; j++ ){
if ( myGroup[j].contentType == 1952412773 ){
for( k=0; k<myGroup[j].paragraphs.length; k++ ){
myGroup[j].paragraphs[k].fillColor = "Black";
}
}
}
}else{
if ( sel[i].contentType == 1952412773 ){
for( t=0; t<sel[i].paragraphs.length; t++ ){
sel[i].paragraphs[t].fillColor = "Black";
}
}
}
}
使用しているInDesignはMacのCS4です。
使用するスクリプト言語はJavaScriptです。
よろしくお願いします。
[11101] けんけん (2010/12/09 Thu 16:38)
allPageItemsで拾えるオブジェクトの中にcontentTypeというプロパティをもたないものがあるとエラーで止まります。
スクリプトでエラーが起きても止めずに処理するには、エラーが起きることが予測できる部分をtry{}の中に置き、その中でエラーが起きた場合の処理を、続くcatch(e){}の中に書くようにします。
次のようなスクリプトで希望の処理ができないでしょうか?(ただし、表組があるとセル中の文字までは処理されないか……)
var sel = app.selection;
for (var i=0; i<sel.length;i++){
var pItems = sel[i].allPageItems;
for (var j=0; j<pItems.length; j++){
try {
pItems[j].texts[0].fillColor = "Black";
} catch(e){}
}
}
[11102] ななし (2010/12/09 Thu 18:38)
ご回答ありがとうございます。
後ほどお教えいただいた方法を試してみます。
自分でも多重グループ化されたアイテムに対しての対処方法が
掲載されているサイトを見つけたのですが、
うまく組み込むことができませんでした。
Googleで
「Gyonilog: 【InDesign】テキストフレームを全選択」
と検索すると、一番上に表示されるサイトです。
こちらの再帰処理を組み込む方法をお分かりの方がいましたら、
アドバイスいただけると助かります。
よろしくお願いします。
[11107] けんけん (2010/12/10 Fri 10:53)
子、子の子、あるいは、親、親の親、と順に辿っていく場合には再起処理を使う必要がありますが、allPageItemsで自分より下のPageItemすべて(子だけではなく孫、ひ孫など)を拾えますので、再起処理にする意味はないと思いますよ。
allPageItemsのところをpageItems(そのオブジェクトの子のpageItemのみ)に変えて、順に再帰呼び出しで処理することも出来なくはないでしょうが、煩雑になるだけで意味がないです。
再起処理する方を考えている仮定で、[11102]で挙げたスクリプトの穴が見つかってしまいました。選択されているオブジェクト自身の文字色が変えれないですね。以下のように修正します。(相変わらず、表組のセル内の文字色は考慮の外ですが)
var sel = app.selection;
for (var i=0; i<sel.length;i++){
try {
sel[i].texts[0].fillColor = "Black";
} catch(e){}
var pItems = sel[i].allPageItems;
for (var j=0; j<pItems.length; j++){
try {
pItems[j].texts[0].fillColor = "Black";
} catch(e){}
}
}
[11108] ななし (2010/12/10 Fri 14:23)
どうもこんばんは
texts[0]だとオーバーフローしている分には色がつかないのでparentStoryに置き換えてみてはどうでしょう?
(見えないとこだからどうでもいいのかも知れませんが ^; )
[11113] (z-) (2010/12/11 Sat 00:54) mail web
> texts[0]だとオーバーフローしている分には色がつかないのでparentStoryに置き換えてみてはどうでしょう?
そうですね。このあたりはスクリプトで何をしたいか?によって変わってくる部分ですよね。
「選択したフレーム群の中の文字色を変える」ということを優先すると、parentStoryではテキストフレームがリンクされている時に、選択されていないフレーム内の文字まで文字色が変わることになりますから。
また、[11107]で、けんけんさんが挙げられている「Gyonilog: 【InDesign】テキストフレームを全選択」でのスクリプトでは、アンカー付オブジェクト(インラインフレーム含む)や、角丸フレーム内に配置されたテキストフレーム(この作り方を私自身は結構やります)は選択されませんから(InDesignの機能として、これら全てを同時に選択状態にできない)、実際にスクリプトで何をしたいのかによって、どういうふうなスクリプトがいいのか、どういう方法が使えるのか(再帰的呼び出しが使えるか)は変わってくると思います。
[11114] ななし (2010/12/11 Sat 11:11)
ななしさん、(z-)さん、ありがとうございました。
お教えいただいた下記のスクリプトで希望することが実現できました。
var sel = app.selection;
for (var i=0; i<sel.length;i++){
try {
sel[i].parentStory.fillColor = "Black";
} catch(e){}
var pItems = sel[i].allPageItems;
for (var j=0; j<pItems.length; j++){
try {
pItems[j].parentStory.fillColor = "Black";
} catch(e){}
}
}
今回、いかに自分のスクリプトに無駄が多いかを認識できました。
try{}なんて、便利なものがあったのですね。
今後、頻繁に活用できそうです!
自分は、テキストボックス内のテキストを
まとめて選択する方法が分かりませんでしたので、
あんなお恥ずかしい方法をとりました。
探したのですが、見つけられなかったのです。
texts や parentStory というものがあることを知れて、良かったです。
それにしても、みなさんはどのように調べているのでしょうか?
自分は「InDesign自動処理実例集」という本やAdobeのマニュアルを見たり、
ウェブサイトを検索して調べますが、いつも苦戦しています。
オブジェクトの辞書的な資料があれば良いのですが、ないですよね。
何か良い調べる方法がありましたら、お教えいただければ幸いです。
よろしくお願いいたします。
[11121] けんけん (2010/12/13 Mon 17:23)
>それにしても、みなさんはどのように調べているのでしょうか?
>自分は「InDesign自動処理実例集」という本やAdobeのマニュアルを見たり、
>ウェブサイトを検索して調べますが、いつも苦戦しています。
>オブジェクトの辞書的な資料があれば良いのですが、ないですよね。
自分の場合はInDesign CS2からですので、「InDesign CS2 スクリプトリファレンス.pdf」という(辞書的な)ドキュメントが付いていたので、まず最初はこれであたりをつけていますが、CS4だとExtendedScript Toolkit CS4のオブジェクトモデルビューアくらいしかないんでしたっけ?
お〜まちさんのオブジェクトモデル図で探すのがいいと思います。
>texts や parentStory というものがあることを知れて、良かったです。
texts[0]でセル内やフレーム内のテキストすべてを掴めることは、掲示板でのやり取りで知ったことでして、私もそれまではfor文で回していました。
やはり、いろいろ試行錯誤してスクリプトを書くことで覚えていく部分が多いと思います。それから、もとから入っているサンプルスクリプトも参考になる部分が多いです。InDesignのスクリプトを書き始めた頃はサンプルスクリプトを随分と真似させてもらいました。
[11129] ななし (2010/12/14 Tue 12:38)
ご丁寧なご回答、ありがとうございます。
CS3とCS4には、スクリプティングガイドとスクリプティングチュートリアルなどがあります。自分はCS3版を見ましたが、情報量が少なく必要な情報を得られませんでした。
お〜まちさんのオブジェクトモデル図はよく見るのですが、見方を理解できていないようで、必要なものをどう探せば良いのかが分からず、途方に暮れてしまうパターンが多いです。もう少し勉強したいと思います。
今回、掲示板の情報が貴重だということが再認識できました。ありがとうございました。
サンプルスクリプトは見てませんでしたので、これから見てみます。
このたびは貴重なアドバイスを何度もいただきまして、誠にありがとうございました。
[11130] けんけん (2010/12/14 Tue 19:41)
こんばんは。
私はCS2の出始めの頃にスクリプトを覚えたのですが、やはりリファレンスとお〜まちさんのHP、古旗さんのHPを参考にさせていただきました。
ななしさんのおっしゃるようにサンプルスクリプトもなかなか参考になります。
スクリプトは正解の書き方が特に決まってないので、書かれた方の癖が出てくるので、最初はなかなか読み解きづらいですよね。
私が勉強し始めた頃はごく一部の方しか情報を公開されておらず、かつ個々人の書き方の癖で結構苦労した覚えがあります。
とりあえず手っ取り早いのは他人の書かれたスクリプトをコピペして動かしてみて一行ずつ内容を解読するのがいいと思います。
次にちょっとだけ改変してみる。
大体思い通りに動かせるようになったら、0から自分で書いてみる。
そんな行程を踏むと効率的だと思います。
あとはWEBで検索するときにJavaScriptにこだわらずAppleScriptやVBScriptで書かれたものもみてみるといいと思います。
VBScriptはJavaScriptとわりと似通った部分があるので意外と簡単にJavaScriptに書き換えられます。
AppleScriptは文法が全然違いますが、ちょっとでもかじっておくと潰しがきいて後々自分が楽できます。
あとはごくたまーにスクリプトのセミナーとかもあるので参加してみるとか。
セミナー終わった後に講師を捕まえて質問攻めにしてみるのも楽しいですよ!
私もやったことありますw
[11134] こうちゃん犬猫まみれ (2010/12/15 Wed 01:14)
アドバイス、ありがとうございます。
AppleScriptやVBScriptで書かれてものは、見ても意味がないと思い毎度スルーしてました。今度、ウェブで検索するときは参考にしてみます!
スクリプトのセミナーなんてのがあるのですね。
見つけたら、自分も今度参加してみます。
ありがとうございました。
[11146] けんけん (2010/12/15 Wed 20:08)