GUIから実行する印刷スクリプト

[8638]GUIから実行する印刷スクリプト 投稿者:クリスと修 投稿日:2015/06/22 10:54:10
Indesign、win、CS6を使用し、
選択したフォルダ内の全てのインデザインファイルを
選択したプリントプリセットで印刷するスクリプト、
を作成したいのですが、GUIで上手く動作させることができませんでした。

以下のスクリプトを書いてみました。
問題点教えていただければとても助かります。

―――――――――――――――――――――――――――――

(function(){
/*---------------------------------------------------------
GUI処理部分
---------------------------------------------------------*/
var winObj = new Window("dialog","フォルダを選択して印刷する", [0,0,320,240]);
var btnObj1 = winObj.add("listbox",[50,100,270,200],["B4横 見開 グレー","A3横 見開 グレー","3番目","4番目"]);
var btnObj2 = winObj.add("button",[50,10,270,30],"フォルダを選択");
btnObj2.onClick = function(){
insatuB4mihiraki();
}
winObj.center();
winObj.show();
/*---------------------------------------------------------
ファイルオープンと印刷
---------------------------------------------------------*/
function insatuB4mihiraki(){
var btnSel = btnObj1.selection.index;
if(btnSel != null){
switch(btnSel){
case 0:
alert("B4が選択されて印刷");
var folderObj = Folder.selectDialog("フォルダを選択して下さい");//フォルダ選択ダイアログ
if(folderObj){
fileList = folderObj.getFiles("*.indd");//フォルダ内のInDesignファイルのみ選択
if (fileList == 0){
alert("最初に選択したフォルダーにInDesignファイルが入っていません");
}else{
for(i = 0 ; i<fileList.length ; i++){
fileObj = new File(fileList[i].fsName);//fileObjにファイルのパスを代入
alert(fileObj);
app.open(File(fileObj));//ファイルを開く
app.activeDocument.printPreferences.pageRange = PageRange.ALL_PAGES ;
app.activeDocument.printPreferences.activePrinterPreset = "B4横 見開 グレー";
app.activeDocument.print ( false ) ;
app.activeDocument.close(SaveOptions.no);//保存しないで閉じる
}
}
}
break;
default:
alert("B4以外が選択されて印刷");
break;
}
}
}
})();

――――――――――――――――――――――
「B4横 見開 グレー」を選択し、フォルダを選ぶと
alert(fileObj);
までは実行されるのですが、それ以降が動作しませんでした。
[8641]Re: GUIから実行する印刷スクリプト 投稿者:(z-) 投稿日:2015/06/23 12:23:07
じっさいに走らせておりませんが、
fileObjは既にFileオブジェクトなので、
app.open(File(fileObj));

app.open(fileObj);
でよろしいのでは。
[8642]Re: GUIから実行する印刷スクリプト 投稿者:クリスと修 投稿日:2015/06/24 08:34:47
(z-)様

さっそくのご対応ありがとうございました!
ご指摘のように書き換えてみましたが、
どうやら問題はそこだけではなかったようです。

どうしたものでしょうか。。。
[8643]Re: GUIから実行する印刷スクリプト 投稿者:流星光輝 投稿日:2015/06/24 10:48:11
ScriptUIのダイアログの影響でしょうかね。
モーダルダイアログもしくは警告…の通知がESTK左下に出ています。InDesignのDialog使うようにしてみましたが、ちゃんと(doc.print(false);の前までは)動くのを確認しました。(元ソースのプリントプリセットの部分などは書き直しました。インデントのため、\x{3000}で埋めてあるので\x20に置換してESTKにペーストしちゃってください。)
// --------------
#target indesign
(function(){
  // プリントプリセットが存在しない時は[デフォルト]が1つだけ存在するので処理しない
  if(app.printerPresets.length===1){ return; }
  // プリントプリセットの名称を取り出す
  var arr=app.printerPresets.everyItem().name;
  // ダイアログ生成
  var dlg=app.dialogs.add();
  var dlg2=dlg.dialogColumns.add();
  var dlg3=dlg2.dropdowns.add();
  // ドロップダウンコントロールにプリントプリセットの名称を設定
  dlg3.stringList=arr;
  dlg3.selectedIndex=1; // 2つ以上存在するハズですから
  if(dlg.show()){
    var flg=false;
    // OKされたとき
    //フォルダ選択ダイアログ
    var folderObj = Folder.selectDialog("フォルダを選択して下さい");
    // キャンセルされたときは、処理しない
    if(folderObj===null){ return; }
    // フォルダ指定された場合は、含まれるinddファイルを列挙
    var fileList=folderObj.getFiles("*.indd");
    if(fileList.length===0){
      alert("最初に選択したフォルダーにInDesignファイルが入っていません");
      return; // 処理できない。抜ける
    }
    // ダイアログで選ばれたプリントプリセットを取得
    var PrstStr=dlg3.stringList[dlg3.selectedIndex]
    for(var i=0; i<fileList.length; i++){
      var doc=app.open(File(fileList[i])); //ファイルを開く
      doc.printPreferences.pageRange=PageRange.ALL_PAGES; // 全ページ対象に
      doc.printPreferences.activePrinterPreset=PrstStr; // プリセットの名称を渡す
      doc.print(false); // プリントのダイアログを非表示で印刷を実施だったかしら?
      doc.close(SaveOptions.no); //保存しないで閉じる
      flg=true; // 印字したフラグをONに
    }
    if(flg){
      alert("印字しました。");
    }
  }else{
    // キャンセルされたとき
    return;
  }
})();
[8644]Re: GUIから実行する印刷スクリプト 投稿者:流星光輝 投稿日:2015/06/24 10:50:51
> インデントのため、\x{3000}で埋めてあるので\x20に置換してESTKにペーストしちゃってください。
インデントは書き込み時に消えてしまったようなので、無視しちゃって下さい。
[8645]Re: GUIから実行する印刷スクリプト 投稿者:(z-) 投稿日:2015/06/24 13:24:36
そうそう、見落としてました。
dialogは閉じないとアプリケーションは処理を続行できないのです。
しかし、どこのタイミングでwinObj.close()を入れてみてもエラー出ますねこれ(親記事のコード)
解決にちょっと時間ください(忙)
[8646]Re: GUIから実行する印刷スクリプト 投稿者:クリスと修 投稿日:2015/06/25 00:00:35
流星光輝様

ご回答いただきましてありがとうございます。
回答いただくだけでなく、正しく動作するスクリプトを作っていただき、とても感謝します。

独学で作ってみたものの、動かず途方にくれていました。
私の書いたスクリプトと同じくらいの長さなのに機能が多くまた読みやすかったです。

人の書いたコードを読むのってとても大切なのですね。
if returnの使い方など、勉強させていただきました。
[8647]Re: GUIから実行する印刷スクリプト 投稿者:クリスと修 投稿日:2015/06/25 00:10:24
(z-)様

お忙しい中、続けてご回答いただきありがとうございます。

「dialogは閉じないとアプリケーションは処理を続行できないのです。」
と書いていただいたことで、意味がわからず読み飛ばしてしまっていた「モーダルダイアログ」の意味を調べてみるきっかけになりました。

ありがとうございます!

続けてのご検証に関しましては、流星光輝様からご回答もいただけましたので、本当にお暇になった時で構いませんので!
[8648]Re: GUIから実行する印刷スクリプト 投稿者:あるふぁ 投稿日:2015/06/26 02:29:42
ダイアログのイベントとして呼び出されてる処理の中でダイアログ閉じた後のことまでやろうとしてるのが無理あるっぽいですね。下記のように書き換えてみたら動きました。

元のスクリプトでfileListにvarが付いてないのは単なる書き忘れかと思いますが、こっちでは付いてないことがとっても大事なポイントになってたり

(function(){
/*---------------------------------------------------------
GUI処理部分
---------------------------------------------------------*/
var winObj = new Window("dialog","フォルダを選択して印刷する", [0,0,320,240]);
var btnObj1 = winObj.add("listbox",[50,100,270,200],["B4横 見開 グレー","A3横 見開 グレー","3番目","4番目"]);
var btnObj2 = winObj.add("button",[50,10,270,30],"フォルダを選択");
btnObj2.onClick = function(){
insatuB4mihiraki();
}
winObj.center();

/*---------------------------------------------------------
ファイルオープンと印刷
---------------------------------------------------------*/
if(winObj.show()==1){
for(i = 0 ; i<fileList.length ; i++){
fileObj = new File(fileList[i].fsName);//fileObjにファイルのパスを代入
alert(fileObj);
app.open(File(fileObj));//ファイルを開く
app.activeDocument.printPreferences.pageRange = PageRange.ALL_PAGES ;
app.activeDocument.printPreferences.activePrinterPreset = "B4横 見開 グレー";
app.activeDocument.print ( false ) ;
app.activeDocument.close(SaveOptions.no);//保存しないで閉じる
}
}

function insatuB4mihiraki(){
var btnSel = btnObj1.selection.index;
if(btnSel != null){
switch(btnSel){
case 0:
alert("B4が選択されて印刷");
var folderObj = Folder.selectDialog("フォルダを選択して下さい");//フォルダ選択ダイアログ
if(folderObj){
fileList = folderObj.getFiles("*.indd");//フォルダ内のInDesignファイルのみ選択
if (fileList == 0){
alert("最初に選択したフォルダーにInDesignファイルが入っていません");
}else{
winObj.close(1);
}
}
break;
default:
alert("B4以外が選択されて印刷");
break;
}
}
}
})();
[8649]Re: GUIから実行する印刷スクリプト 投稿者:(z-) 投稿日:2015/06/26 09:54:00
おはようございます。
手元でscriptsngine定義してpaletteに書き換えてみても動かなかったので棚上げにしておりました。

あるふぁさんのおっしゃる点、見落としてました。。
>ダイアログのイベントとして呼び出されてる処理の中でダイアログ閉じた後のことまでやろうとしてるのが無理あるっぽい

元コード内でどこにwinObj.close()を入れてもエラーになったのは、dialogを閉じる前に入った関数から抜けてないせいなんですね。
やっぱり人のコードは難しいw 勉強になりました。
[8650]Re: GUIから実行する印刷スクリプト 投稿者:あるふぁ 投稿日:2015/06/26 13:44:57
close()がウィンドウを即閉じるという意味ではなくて、「一連のイベントが終了したら閉じてshow()の所に戻ってくるよフラグ」を立てるって意味だと解釈するのがよいかもしれません。んでこのときclose()の引数に整数値を入れておくとshow()の戻り値として返ってくると。

ってまあ私も流星さんのようにInDesignのDialogオブジェクトの方を使うのがオススメなのですが
[8654]Re: GUIから実行する印刷スクリプト 投稿者:クリスと修 投稿日:2015/06/29 09:23:41
あるふぁ様

私の拙いコードに手を入れていただきありがとうございました。

自分で読み返してみると、
if(btnSel != null)がいらなかったり、関数名が処理の内容と違っていたり、
ダメダメですね。

最初、書いていただいたスクリプトを読んで「show()がない!?」
と、混乱しましたが、追記していただいた文書で理解することができました。
ありがとうございます。


ご質問させていただきたいのですが、私が書いたスクリプトで使ったダイアログは、
InDesignのダイアログではなかったのでしょうか?
流星さんに書いていただいたスクリプトのダイアログの方が正式?ということなのでしょうか?

また、これは自分で勉強しなくてはいけないことなのかもしれませんが、
「varが付いていないことが大事なポイント」という言葉の意味が、
私のレベルでは理解できませんでした。

せっかく書いていただいたのすみません。もっと勉強が必要ですね。
[8655]Re: GUIから実行する印刷スクリプト 投稿者:クリスと修 投稿日:2015/06/29 09:26:35
(z-)様

またまた、私のわからない部分をフォローしていただく書き込みをしていただく形になり、
大変ありがとうございます!
[8657]Re: GUIから実行する印刷スクリプト 投稿者:(z-) 投稿日:2015/06/29 10:44:42
>ご質問させていただきたいのですが、私が書いたスクリプトで使ったダイアログは、
>InDesignのダイアログではなかったのでしょうか?

最初に書かれたのはESTKのScriptUIクラスのdialogですね。
PhotoshopIllustratorにも使えます。
InDesignは、これとは別にDialogクラスを持っています。
一長一短あります。
[8658]Re: GUIから実行する印刷スクリプト 投稿者:あるふぁ 投稿日:2015/06/29 21:41:02
>「varが付いていないことが大事なポイント」という言葉の意味が、私のレベルでは理解できませんでした。

fileListは関数insatuB4mihiraki内で定義して、関数の外側から参照してるので、もしvarが付いてたらうまくいかないってことが言いたかったのです。詳しくは『javascript スコープ』とかでググってみて下さい。

ダイアログについては(z-)さんの書かれてる通りで、どっちが正式とかいうことはありません。
InDesignのDialogはせいぜい値を選択または入力してOKボタンを押すくらいの事しかできませんが、その分簡潔に書けて挙動も明快です
自由度はScriptUIの方がだんぜん高いです。たとえば今のスクリプトを発展させて、「複数のフォルダをリストボックスに追加していって、一括でプリントする」みたいなことをやろうと思ったらScriptUIの方じゃないとできません。
[8662]Re: GUIから実行する印刷スクリプト 投稿者:クリスと修 投稿日:2015/07/02 00:04:27
(z-)様 あるふぁ様

ダイアログに関して教えていただきありがとうございした。
それぞれの特性に応じて使い分けることが大切ですね。

Varの件教えていただきありがとうございます。
いただいたヒントから調べました。
完全に理解はできていないと思いますが勉強になりました。

重ねてありがとうございます!
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)