マスターページを差し替えるスクリプト

[6375]マスターページを差し替えるスクリプト | 投稿者:Subi | 投稿日:2011/12/19(Mon) 18:38:39
InDesign CS5(ver 7.0.4), Windows XPです。

文章を選択した状態で、その文章があるページのマスターページを差し替えるスクリプトを作成しました。

var myDoc  = app.activeDocument;
var myPage = myDoc.selection[0].parentTextFrames[0].parentPage;
myPage.appliedMaster = myDoc.masterSpreads.item("B-マスター");

ここまではできたのですが、この文章をドキュメント全体から検索して処理していくやり方でつまづいています。
ご助言いただけると幸いです。よろしくお願いします。
» 1
[6378]Re: マスターページを差し替えるスクリプト | 投稿者:オメガ | 投稿日:2011/12/20(Tue) 01:44:33
Subi様

スクリプトでどういった処理を目標としているのか、ゴール点がいまいち見えないので、あくまで想像ですが...

特定の文字列を検索して、検索に引っかかったページに特定のマスターを適用する、といった処理をされたいのでしょうか?

たとえば、ページ上のテキストフレームに"B-マスター"とか"C-マスター"とか、"Aパターン""Bパターン"と入れておき、スクリプトを実行すると、それぞれのページに特定のマスターが適用される、みたいな。

で、まずは文字列を選択しているページに特定のマスターを適用することができましたが、ドキュメント全体から特定の文字列を検索して文字を選択させる方法がわかりません、ということでしょうか?
» 2
[6384]Re: マスターページを差し替えるスクリプト | 投稿者:Subi | 投稿日:2011/12/20(Tue) 10:36:06
オメガ様、ありがとうございます。

>で、まずは文字列を選択しているページに特定のマスターを適用することができましたが、ドキュメント全体から特定の文字列を検索して文字を選択させる方法がわかりません、ということでしょうか?

すみません、説明不足でした。その通りです。
具体的にはこのような状態です。

・横組みの本文にA-マスターを適用している状態
・ページ下部にInDesignの機能で脚注を入れています。
・脚注参照番号はページ毎に*1~*9以内で上付き文字(スタイルではない)
・脚注には「脚注」という段落スタイルを適用しています。

ここから、脚注があるページのマスターページをB-マスターに変更したいのです。
最初はテキスト*1~*9を正規表現検索で検索して該当ページに適用、という方向で考えていましたが、段落スタイルや上付き文字を検索する方法もあると掲示板に書き込んだ後で気づきました。
これ以外のアプローチでもかまいませんので、いい方法がありましたらアドバイスをお願いします。
» 3
[6390]Re: マスターページを差し替えるスクリプト | 投稿者:流星光輝 | 投稿日:2011/12/21(Wed) 00:55:03
1)上付でも段落スタイルでも、どちらでもいいので、Scriptで検索する
2)見つかった個数ループさせて、該当箇所のページを取得(どんな方法でもいいです)
3)上記2)のページに対して、適用するマスターを設定

こんな感じですね。あとは、コードに落としこむだけですね。
出来るだけ御自身で書いてみて、行き詰まったら、コード出して再質問してください。
» 4
[6392]Re: マスターページを差し替えるスクリプト | 投稿者:オメガ | 投稿日:2011/12/21(Wed) 07:10:37
脚注は使ったことがないのですが、段落スタイルなどで特定できるのであれば検索置換(厳密には検索機能)で処理するのが妥当かと思います。検索置換の方法はスクリプティングガイドにも載っていますし、ネット上でもすぐに見つかると思います。

検索置換で実装すれば、特定の文字列やスタイルなどを検索してマスターページを置換できるようになりますね。もちろん正規表現検索という手もありますし。文字入力欄を付けて、適用するマスターをドロップダウンで選べるようにするなど、工夫次第ではかなり便利なものになるのではないでしょうか。

脚注限定ならページ上のテキストフレームのfootnotes.lengthを調べていって0以上のものがあれば、そのページにマスターを適用、処理を抜けて次のページへ という方法もあると思いますが、検索置換を使った方が処理が速そうな気がします。
» 5
[6402]Re: マスターページを差し替えるスクリプト | 投稿者:Subi | 投稿日:2011/12/21(Wed) 17:45:41
流星光輝様、オメガ様、ありがとうございます。

脚注番号は番号がテキストで入っているのではなく、マーカーが挿入されていることにいまさら気づきました。

var myRange = app.selection;
myRange = (myRange.length > 0) ? myRange[0] : app.activeDocument;

app.findGrepPreferences = NothingEnum.nothing;
app.findChangeGrepOptions.includeLockedLayersForFind = false;
app.findChangeGrepOptions.includeLockedStoriesForFind = false;
app.findChangeGrepOptions.includeHiddenLayers = false;
app.findChangeGrepOptions.includeMasterPages = false;
app.findChangeGrepOptions.includeFootnotes = true;
app.findChangeGrepOptions.kanaSensitive = true;
app.findChangeGrepOptions.widthSensitive = true;

// 脚注参照マーカーで検索
// app.findGrepPreferences.findWhat = "~F";

app.findGrepPreferences.findWhat = "";
app.findGrepPreferences.appliedParagraphStyle = "脚注";

var f = myRange.findGrep();

for(var i = f.length-1; i > -1; i--){
   var myPage = f[i].parentTextFrames[0].parentPage;
   try {        
           myPage.appliedMaster = app.activeDocument.masterSpreads.item("B-マスター");
   } catch(e){
   }
}

おかしい点などありましたらご指摘よろしくお願いします。
また、テキストの編集などでページが動いた後に、脚注がなくなったBマスターのページをAマスターに戻す処理が必要になりますね...
上の処理の前に、全ページにAマスターを適用する処理を追加する、という感じでOKでしょうか。
» 6
[6403]Re: マスターページを差し替えるスクリプト | 投稿者:流星光輝 | 投稿日:2011/12/21(Wed) 18:03:32
提示されたコードで動作したと理解しますね。

>また、テキストの編集などでページが動いた後に、脚注がなくなったBマスターのページをAマスターに戻す処理が必要になりますね...
>上の処理の前に、全ページにAマスターを適用する処理を追加する、という感じでOKでしょうか。

全ページにAマスターを適用しても良ければいいんでしょうが,
私的には,
・マスターが何枚あるのか分からない点
・マスター「なし」がページに適用されていないか・それは変更してはいけないマスター適用なのではないか
等を考慮しつつ,
このスクリプトを一回でも実行した場合,
Bマスターが適用されているページが1以上あるはずなので,
まずはBマスターの適用されているページにAマスターを適用します。
その上で,提示してくださったコードの処理を行えばいいのではないかと思います。
» 7
[6404]Re: マスターページを差し替えるスクリプト | 投稿者:Subi | 投稿日:2011/12/21(Wed) 18:46:51
・もしBマスターのページがあればそのページにAマスターを適用する
・その上でAマスターのページのみに上の処理をかける
このように改良しようと思います。
あとは、オメガ様の案の検索文字入力欄と適用するマスターをドロップダウンで選ぶダイアログを出せればなおよいですね。
» 8
[6405]Re: マスターページを差し替えるスクリプト | 投稿者:オメガ | 投稿日:2011/12/21(Wed) 20:41:28
>・もしBマスターのページがあればそのページにAマスターを適用する
>・その上でAマスターのページのみに上の処理をかける
AマスターとBマスターのみの場合は問題ないでしょうけど、もしCマスターなどがあって、脚注がAマスター以外のページに行ってしまう場合、
>・その上で"Aマスターのページのみ"に上の処理をかける
だとCマスターなどAマスター以外のページの脚注が処理されません。もしそういう構成ならドキュメント全体で処理をしないとまずいです。

このスクリプト専用の処理になりますが、提示されたコードに(ドキュメント全体を検索する場合に)一旦BマスターをAマスターにする処理を組み込んでおけば1つのスクリプトで済むのではないでしょうか。
(私が言ったことなので恐縮ですが...)今のスクリプトにダイアログをつけて検索文字列が変更できるような汎用性を持たせるのであれば、BマスターをAマスターに直す処理を別のスクリプトで書かないとなりませんね。
» 9
[6407]Re: マスターページを差し替えるスクリプト | 投稿者:Subi | 投稿日:2011/12/24(Sat) 12:56:30
マスターページを選択する処理がうまくいかず、参考になるスクリプトを検索していたところ、そのものズバリすぎるスクリプトを見つけました。

*http://toolbox.brunoherfst.com/2010/apply-master-pages/

入れ替え元のマスターを指定することもできます。完璧です。
検索オプションで脚注が検索対象に入っていなかったので、includeFootnotes = falseをtrueに書き換えて問題なく動作しました。

皆様、ありがとうございました。
» 10
[6408]Re: マスターページを差し替えるスクリプト | 投稿者:オメガ | 投稿日:2011/12/24(Sat) 14:03:53
すごいですね、本当にそのものズバリすぎる...。驚きました。
*http://toolbox.brunoherfst.com/2011/replace-masterpages/
ではマスター同士を差し替えられますし。
こちらのサイトには他にも役立つ&参考になるスクリプトがたくさんありそうですね。
私も活用させていただきます。ありがとうございます。
» 11
[6411]Re: マスターページを差し替えるスクリプト | 投稿者:Subi | 投稿日:2011/12/26(Mon) 18:25:57
var changeMaster = app.activeDocument.masterSpreads.item("B-マスター");
var replaceMaster = app.activeDocument.masterSpreads.item("A-マスター");

for(var myCounter = 0; myCounter < app.activeDocument.pages.length; myCounter++){
   myMaster = app.activeDocument.pages.item(myCounter);
   if (myMaster.appliedMaster == changeMaster){
       myMaster.appliedMaster = replaceMaster;
   }
}

オメガ様の宿題、B-マスターをA-マスターに差替えるスクリプトです。これを前に書き込んだスクリプトの頭に加えて、とりあえず自分が作りたかった形になりました。
しかし、やはり見つけたスクリプトの方が使い勝手がいいですね^_^;
オメガ様、お付き合いありがとうございました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)