【JavaScript】アクティブスプレッドの偶数ページのノンブル取得方法

[8100]【JavaScript】アクティブスプレッドの偶数ページのノンブル取得方法 投稿者:ねこ 投稿日:2014/03/17 12:38:51
MACOSX10.9.1、CS6を使用しています。

アクティブになっているスプレッドの偶数ページにあるオブジェクトを
選択し、そのページのノンブルを取得するJavaScript
書きたいのですが書き方がいまいちよくわかりません。

他の方が書かれたものを繋いでみたのですが、これですとドキュメントの
先頭スプレッドのノンブルを取得するだけなので上記の事を実現できる
書き方をどなたか教えていただけないでしょうか。
よろしくお願いします。

if (app.activeDocument.pages[0].side == PageSideOptions.leftHand){
app.selection = app.activeDocument.pages[0].pageItems;

var my_sel = app.documents[0].selection[0];
var my_page = my_sel.parentPage;
alert (my_sel.parentPage.name)

}
なぜスプレッドを使わずに選択してページを辿ってノンブル取得しようと?
設計を見直した方が解決しやすいと思うのですが…
念のため…

activeDocumentなのかdocuments[0]なのか…

selectionを使う意味は? ページオブジェクトはスプレッドから辿れるので、
activeSpreadからpagesを拾えば良いのでは?

あと、最終的に何がしたいか読み切れなかったのですが、
その辺を書いていただけると他の方からもレスもらえる気がします。
ねこさんのコードに沿うなら、以下のように書けます。

var myPagesLength = app.activeDocument.pages.length;
for(var myPageNumber = 0 ; myPageNumber<myPagesLength ; myPageNumber++){
var myPageCurrentName = app.activeDocument.pages[myPageNumber].name;
if(myPageCurrentName%2 == 0){
app.selection = app.activeDocument.pages[myPageNumber].pageItems;
alert(myPageCurrentName);
}
}

ちなみに、PageSideOptionsクラスは、当該ページが見開きの右か左か、
あるいは見開きではないかを調べるもので、奇数ページ、偶数ページを調べるものではありません。
> sekita さん

myPageCurrentNameがあたかも数字であるような書き方をされていますけれど、page.nameは必ずしも数字であるとは限りません。ページ番号のスタイルでローマ数字や漢数字を選んだり、プレフィックスを使用すると数字にはなりません。

それと、ページ数分ループしてますので、16ページの冊子の場合は8回アラートが出ます。これだと標題にある「アクティブスプレッド」にはなりませんね。

(sekita さん、責めてるわけではありませんので、お気になさらないでください)

*************************************

activeSpreadの取得方法って、ほとんどどこにも掲載されていないんじゃないでしょうか。一応ヒントになるものを出しておきます。
知ってのとおり、InDesignでは1つのドキュメントに対し、いくつもウィンドウを表示することができます。(メニューからだと[ウィンドウ]―[アレンジ]―[新規ウィンドウ])
ですから、activeSpreadってのはウィンドウごとにあるんです。それを理解しないと「document→activeSpread???(ないぞ)」ってなります。

var myWindow = app.activeWindow;
var mySpread = myWindow.activeSpread;
var myDocument = mySpread.parent;

こんな関係になります。
流星光輝さん、sekitaさん、お~まちさんレスありがとうございました。

◎やりたいこと
indesign上で選択中のページを見開き状態でPDFファイルに書き出し
PDFファイル名は見開きの各ページのノンブルにする(009-010.pdfのような感じ)
(偶数ページ云々や、なんでアイテムを選択状態にしてるのか等は考えすぎて
思考があらぬ方法に行ってしまっていたのでその当たりは忘れていただけると幸いです…)

選択中のページを含むスプレッドの各ページのノンブルを取得する方法が
わからなかったので、選択中のページのノンブルが偶数だった場合は1を足して(奇数は-1)
反対側のページのノンブルとすることで一応やりたい事は出来たのですが、確かにこのやり方だと
アラビア数字以外のノンブルが使われていた場合に上手くいきませんね…。

アラビア数字以外のノンブルにも対応できる、もっと上手い書き方がありましたら
引き続きアドバイスを頂けると大変助かります。
よろしくお願いします。



var saveObj = Folder.selectDialog("保存先のフォルダを選択してください") ;
var saveObj = saveObj + "/" ; //末尾に区切りのスラッシュが抜けているので足しておく


var pagename = app.activeWindow.activePage.name;
// 選択しているページのノンブルを取得


if(pagename % 2 == 0){
//選択したページのノンブルが偶数だった場合、以下の処理を行う
var i = "1";
var pagename2 = parseInt(pagename) + parseInt(i) ;
//見開きの反対側ページのノンブル取得

var a=pagename;
var rightpagename=("00"+a).slice(-3); //ノンブルの頭に0をつける処理

var b=pagename2;
var leftpagename=("00"+b).slice(-3); 



var savePDFName = new File(saveObj + rightpagename + leftpagename + ".pdf") ;
//PDFファイルを保存する場所とファイル名を確定
}


else {  //ノンブルが奇数だった場合、こちらに分岐

var i = "1";
var pagename3 = parseInt(pagename) - parseInt(i) ;

var a=pagename;
var rightpagename=("00"+a).slice(-3);

var b=pagename3;
var leftpagename2=("00"+b).slice(-3);


var savePDFName= new File(saveObj + leftpagename2 + rightpagename + ".pdf") ;
}


//PDFとして書き出すページ範囲やプリセットの指定
app.pdfExportPreferences.pageRange = pagename; //ページ範囲を指定
app.activeDocument.exportFile(ExportFormat.pdfType, savePDFName, false, “PDF_test”);
あ、そうでしたね。。。page.nameにはローマ数字や漢数字、アルファベット等がありました。
また、標題はアクティブスプレッドでしたね。
お~まちさん、ご指摘ありがとうございます!
以下のように修正すればいいでしょうか。
特殊なスプレッドでなければ、OKだと思うのですが。

var mySpread = app.activeWindow.activeSpread;
var mySpreadPagesLength = mySpread.pages.length;
for(var myPageOffset = 0 ; myPageOffset<mySpreadPagesLength ; myPageOffset++){
var myPageNumber = mySpread.pages[myPageOffset].documentOffset+1;
var myPageCurrentName = mySpread.pages[myPageOffset].name;
if(myPageNumber%2 == 0){
app.selection = mySpread.pages[myPageOffset].pageItems;
alert(myPageCurrentName);
}
}
横からすみません。
複雑な構造でも対応する(はず、な)ようにしてみました。
セクションを見に行って、セクション開始ページが偶数か、対象ページが同じ側か、を見ます。

var mySpread = app.activeWindow.activeSpread;
for(var i = 0; i< mySpread.pages.length; i++){
pepsi(mySpread.pages[i]);
}

function pepsi(pageObj){
var coca = pageObj.side == pageObj.appliedSection.pageStart.side;
if(pageObj.appliedSection.pageNumberStart%2==0 && coca == true
|| pageObj.appliedSection.pageNumberStart%2==1 && coca == false){
alert("page "+pageObj.name+" is.");
}
}
やりたいことの記述、ありがとございます。

>・indesign上で選択中のページを見開き状態でPDFファイルに書き出し
についてですが、
ページパネル上の選択状態は取得できないので、その辺が気になりましたが、
activeSpreadを対象とすることでOKなら全然問題ないと思います。

で、(z-)さんが書いてくださったコードで、
漢数字ノンブルでも問題なく、偶数判定できますので、
それを参考にしていただいて…

あと、parseIntでintegerにキャストしていますが、
そこに引っかかるので、その辺の処理とかを足してですかね。
(z-)さんのコードの通り、セクション開始ページが偶数か奇数かを見なければ、
元も子もありませんでしたね。。。
(z-)さんありがとうございます!

ちなみに(z-)さんのコードで、
「セクション開始ページが偶数で当該ページが同一側」と
「セクション開始ページが奇数で当該ページが反対側」とを
論理OR(||)で繋げている部分は、以下のように、それぞれの論理式をパーレンで囲む必要があると思います。

if((pageObj.appliedSection.pageNumberStart%2==0 && coca == true) ||
(pageObj.appliedSection.pageNumberStart%2==1 && coca == false)){
alert("page "+pageObj.name+" is.");
}
>ちなみに(z-)さんのコードで、
>「セクション開始ページが偶数で当該ページが同一側」と
>「セクション開始ページが奇数で当該ページが反対側」とを
>論理OR(||)で繋げている部分は、以下のように、それぞれの論理式をパーレンで囲む必要があると思います。

あああすみませんおっしゃる通りですorz 直感で書き散らかしてしまいましたごめんなさい
レスが遅くなり申し訳ありません。

(z-)さんのコードを参考にしてアラビア数字以外のノンブルを取得するところまでは
出来ました。
ありがとうございます!
大変心苦しいのですが私の説明が悪くやりたい事と若干違う結果になってしまったので、
改めて補足させて頂いてもいいでしょうか?

例えば縦組のドキュメントでノンブルが漢数字だった場合。
90ページを選択していた場合、反対側の91ページのノンブルも取得して
九十_九十一.pdfのようなファイル名でPDFファイルとして書き出したいです。


よろしくお願いいたします。
結局のところ、ページが右か左か、偶数か奇数かは関係なく、アクティブスプレッドのノンブルを取得できれば良いのですよね。

if(app.layoutWindows[0].activeSpread.pages.length>1){
alert(app.layoutWindows[0].activeSpread.pages[0].name+"-"+app.layoutWindows[0].activeSpread.pages[-1].name);
}else{
alert(app.layoutWindows[0].activeSpread.pages[0].name);
}

あとついでに補足ですが、(この場合)activeWindowを使うのは良くありません。
activeWindowにはlayoutWindowだけでなくstoryWindowも該当してしまう為です。
(ストーリーエディターで編集で、編集ウィンドウが前面にある場合、activeSpreadが取得できずエラーになります)
望み通りのものが出来ました!!

他の方に書いて頂いたものも別の仕事で使えそうなので、
参考にさせていただきます。
本当にありがとうございました。


var saveObj = Folder.selectDialog("保存先のフォルダを選択してください") ;
var saveObj = saveObj + "/" ;
//末尾に区切りのスラッシュが抜けているので足しておく

var pagename = app.layoutWindows[0].activeSpread.pages[0].name
+"-"+app.layoutWindows[0].activeSpread.pages[-1].name
//選択したページが含まれるスプレッドの各ページのノンブルを取得

var savePDFName = new File(saveObj + pagename + ".pdf") ;
//PDFファイルを保存する場所とファイル名を確定

//PDFとして書き出すページ範囲やプリセットの指定
app.pdfExportPreferences.pageRange = pagename;
app.activeDocument.exportFile(ExportFormat.pdfType, savePDFName, false, "PDF_test");
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)