空のページを削除するスクリプト

[5127]空のページを削除するスクリプト | 投稿者:犬山健 | 投稿日:2010/10/14(Thu) 15:21:07
InDesignで空のページを削除するスクリプトを作りたいのですが、プログラムがよくわかりません。

(function () {
   app.activeDocument.pages[1].remove();//2ページ目を削除
   })();

↑だと、ページ指定をしないと削除ができなくて困っています。

また、空の長方形フレームを消すようにスクリプトで処理したいのですが、長方形フレームツールに対してのJavaScriptはないのでしょうか。


環境はOSX 10.6.3・InDesign CS4、CS5です。
どなたか分かる方、返信を頂けると幸いです。
» 1
[5128]Re: 空のページを削除するスクリプト | 投稿者:いき | 投稿日:2010/10/14(Thu) 17:04:41
細かいところに突っ込んですみません。
長方形フレームツールではなく、長方形フレームですね。

選択オブジェクトについて
constructor.name=="Rectangle"
で一致するかどうかで調べることが出来ます。

もし空の長方形フレームのContentTypeがGRAPHIC_TYPEなら、ちょっと厄介です。
下記スレッドを参照してください。

*http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=4351



テキストフレームであれば下記スクリプトで削除可能です。
全ページのテキストフレームについて、中身が空っぽなら削除します。

var pageObj = app.activeDocument.pages;

for (var i=0; i<pageObj.length; i++){
   for (var j=0; j<pageObj[i].textFrames.length; j++){
       while (pageObj[i].textFrames[j].contents == ""){
           pageObj[i].textFrames[j].remove();
       }
   }
}
» 2
[5129]Re: 空のページを削除するスクリプト | 投稿者:いき | 投稿日:2010/10/14(Thu) 17:50:52
ああ、すみません。
スレッドタイトルにもなっている空ページ削除についてはスルーしてしまっていますね、私。
CS3用ですが、以下のページが参考にならないでしょうか。

*http://jsid.blogspot.com/2008/07/delete-empty-pages-i-often-get-into.html
» 3
[5130]Re: 空のページを削除するスクリプト | 投稿者:犬山健 | 投稿日:2010/10/14(Thu) 19:53:00
>いき様

早々に返信ありがとうございます。

>選択オブジェクトについて
のところですが、スクリプト作成が初めてなもので、すごく突拍子もない質問をしますが、下記のスクリプトは、空の画像フレームを削除するという指示に全然かすってもいないでしょうか?

(function(){
   var docObj = app.activeDocument;
   for (var i = 0; i<docObj.pages.length; i++)
   {
       var tfObj = docObj.pages[i].rectangles;
       for (var j = tfObj.length-1; j>=0; j--)
       {
           if (tfObj[j].contents.name == "rectangles")
           {
               tfObj[j].remove();
               }
           }
       }
   })();



また、空ページ削除についての参考情報もありがとうございます。
早速試してみましたが、うまく反応しませんでした。
といっても、そのままコピペしただけなので、何かが違うのかもしれないので、検証してみます。
» 4
[5132]Re: 空のページを削除するスクリプト | 投稿者:犬山健 | 投稿日:2010/10/15(Fri) 09:24:55
>いき様

空の画像フレーム削除のスクリプトがわかりました!!!
データ結合元の削除予定のフレームにスクリプトラベル当てておくと書いてあるのに意味がわかっていなかったです。

あとは空のページの削除のスクリプトの検証をしたいと思います。
» 5
[5136]Re: 空のページを削除するスクリプト | 投稿者:いき | 投稿日:2010/10/15(Fri) 10:11:27
実は空ページ削除については私も未検証のまま紹介してしまいました。こちらでも時間ができたら検証してみます。

画像フレーム削除については、過去スレッドでも指摘したように、たとえ内容が空でも必要な飾りとしてのページアイテムである可能性があるため、単純な削除は難しいと思っています。
そこで、mgさんが提案してくださったようにラベルを使うという手段があるわけですが、あれはデータ結合を利用することにより、予めラベルを設定すべきアイテムの数が少ないからこそ有効な手段だと思います。
ランダムに配置されたアイテムの中から目的のオブジェクトを削除するのであれば、ラベルを設定するかわりに手動で削除してしまえば済む話ですから。

それはさておき、No.5130で提示していただいたスクリプトについて、そのままでは当然動きません。

var tfObj = docObj.pages[i].rectangles;

これはtextframesの間違いですね。

if (tfObj[j].contents.name == "rectangles")

constructor.nameです。

ただ、これでは内容が空という条件を満たしておらず、単に矩形アイテムを選択しているだけです。
» 6
[5139]Re: 空のページを削除するスクリプト | 投稿者:(z-) | 投稿日:2010/10/15(Fri) 12:33:13
部分的ですみませんが手助けになれば幸いです。

for (var i = 0; i<docObj.pages.length; i++)
 これは後で i 番目のページを参照する目的だというのはもうおわかりと思います。0から始まりページ数ぶん処理します。
 対して、こちら
var tfObj = docObj.pages[i].rectangles;
for (var j = tfObj.length-1; j>=0; j--)
 は、(長方形の個数-1)番目から0番目へ向けて処理します。
 これは途中で「条件を満たすので削除してしまえ」とした時、以後の長方形の番目が繰り上がってしまい困るからです。なので、ページも削除する予定であれば変数 i も降順に処理した方が無難です。


ここでいう「空の長方形フレーム」は、
・塗り、線、効果、リンク、ストーリーなど一切なしという意味でしょうか?
» 7
[5140]Re: 空のページを削除するスクリプト | 投稿者:犬山健 | 投稿日:2010/10/15(Fri) 14:15:27
>(z-)様

わかりやすい説明ありがとうございます。

空の長方形フレームの件ですが、塗り、線、効果、リンク、ストーリーなど一切なしという意味でした。
説明不足で申し訳ありませんでした。

しかし、いき様からご紹介頂いたスレッドより空の長方形フレームを削除するスクリプトはできました。

空のページ削除の方はまだ模索中なので、(z-)様のいう変数 i も降順に処理?も参考に検証してみます。
» 8
[5141]Re: 空のページを削除するスクリプト | 投稿者:いき | 投稿日:2010/10/15(Fri) 14:31:41
> 犬山健さん
No.5136 のレスでは混乱させるようなことを書いてすみませんでした。

> (z-)さん
フォローありがとうございます!


空ページ削除については別のアプローチでも検討中です。(いつになるかわからないけど)
» 9
[5159]Re: 空のページを削除するスクリプト | 投稿者:いき | 投稿日:2010/10/18(Mon) 17:34:49
> 別のアプローチ

えーと、マスターアイテムだけのページも削除してしまうので運用には要注意ですが......。
なお、空ページおよびマスターアイテムだけのページしかないドキュメントで実行すると、アラートを表示して1ページだけ残ります。


pageObj = app.activeDocument.pages;
for (i=0; i<pageObj.length; i++)
{
total = pageObj[i].pageItems.length;
// alert((1+i)+"ページには項目が"+total+"あります");
if(total==0){
pageObj[i].remove();
i=i-1;
}
}
alert("処理が終了しました")
» 10
[5161]Re: 空のページを削除するスクリプト | 投稿者:犬山健 | 投稿日:2010/10/18(Mon) 18:56:50
>いき 様

大変ありがとうございます!!

FileMakerからのアプローチも考えていたところだったので、本当に助かりました!ありがとうございます!
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)