タグ付きテキストと表組とページについて

[5394]タグ付きテキストと表組とページについて | 投稿者:taka | 投稿日:2010/12/04(Sat) 16:34:25
OS:Windows7 , アプリ:InDesignCS3 , 言語:JavaScriptです。
質問ばかりで、申し訳ないのですが、
またJavaScriptでの自動組版について、教えていただきたいことがあるのですが、過去記事でも表組ではないですが、複数ページに渡って処理を行うプログラムがあり、それも参考にして行ってみたのですが、行き詰ってしまいました。

// あらかじめ表を作成し行数と列数を必要な数だけ設定すること
(function(){
   var TAB = String.fromCharCode(9);
   if (app.documents.length < 1) {
       alert("あらかじめドキュメントを開いてから実行してください");
       return;
       }
  var fileObj = File.openDialog("タブ区切りファイルを選択してください");
   if (fileObj == null)  return;    //キャンセルボタンが押されたときは処理しない
   var flag = fileObj.open("r");
   if (flag == false) {
       alert("タブ区切りファイルが開けません");
       return;    //ファイルが開けなかったので以後の処理を中止する
       }
   
   var pageNo = parseInt(prompt("割り付ける開始ページを指定してください",1))-1;
   if ((pageNo < 0) || (pageNo > app.activeDocument.pages.length-1)){
       alert("割り付けるページは存在しません");
       return;
       }
   app.activeWindow.activePage = app.activeDocument.pages[pageNo];
   
   var tfNo = parseInt(prompt("割り付けるテキストフレームを指定してください",""));
   var pageObj = app.activeDocument.pages[pageNo];
   pageObj.textFrames[tfNo].select();
     
{
   tableObj = app.selection[0];//自動レイアウトする項目の先頭番号
       
   var i = parseInt(prompt("iの値を入力してください",""));
   var count = 0;
   var No = 0;
   while(fileObj.eof == false){    //ファイルの終わりになるまで繰り返す
       text = fileObj.readln(); //一行読み込む
       while(true){    //無限ループ(breakで抜ける)
           if(pageNo > 2) break;   //終了ページを越えていたら無限ループから抜ける
           var tfObj = app.activeDocument.pages[pageNo].groups;    //
           //if (itemData[0] == "○"){    //掲載フラグがある場合だけ処理を行う
               var checkFlag = checkTextFrame(tfObj, "buhin"+No);
               //if (checkFlag == false) break;
               if (checkFlag) break;
               else{
                   pageNo++;   //pageNo = pageNo + 1と同じ(次のページへ)
                   }
               }
       var itemData = text.split(TAB); //タブコードで区切って配列に入れる
       
       while(itemData.length){
           for (j=0; j<i; j++){
               var contentsObj=itemData.shift();
               tableObj.tables[0].columns[count].cells[j].contents = contentsObj;
               }
count++;
}
}
}
})();

//割り付けるべきテキストフレームがあるかどうか調べる。あればtrueを返しなければfalseを返す
function checkTextFrame(tfObj, tfLabel){
   for ( var i=0; i<tfObj.length; i++){
       if(tfObj[i].label == tfLabel) return true;
       }
   return false;
   }

今回行き詰ってしまった箇所は、
あらかじめ、複数のページに、0番目のテキストフレームの表組と1番目のテキストフレームの表組を作っておきます。
そして、スクリプトを起動すると、
タグ付きテキストを選ぶ処理をする→
次に、開始するページを選ぶ→
どのテキストフレームに張り付けるか選ぶ→
表のi行目まで行くと持ち越して次の列に行くようにする。
となっているのですが、これを、例えば、2ページ目のテキストフレーム[0]にタグ付きテキスト1行目にし、3ページ目のテキストフレーム[0]にタグ付きテキスト2行目にすることは可能なのでしょうか。

var text = fileObj.readln();をfor文でかめばいけるかと思ってたんですが、うまいこと行かなく、行き詰ってしまいました。
どうかよろしくお願いします。
» 1
[5398]Re: タグ付きテキストと表組とページについて | 投稿者:(z-) | 投稿日:2010/12/05(Sun) 04:05:06
>あらかじめ、複数のページに、0番目のテキストフレームの表組と1番目のテキストフレームの表組を作っておきます。
 構文内で分岐に使われているグループオブジェクトやスクリプトラベルについてここでは記載がありませんが、どうなっていますか?
takaさんのお手元のテスト用ドキュメント内にはラベルつきのグループオブジェクトがあるんでしょうか?

できれば毎回、正常に動作した結果の想像図をでっち上げた画像を添付できますか? 画像を提示される際は、成功予想図または失敗した時の状態、どちらか片方だけでもあるとわかりやすいです。

思った通りの動作をしないスクリプトについては、なるべくどこでどうおかしくなるか教えて下さい。エラーメッセージの内容、ループから抜けられない、動くけど狙った通りでない、なんかわかんないけどずっと動いてる、などです。
中には調べもせずコードを試してみて強制終了するまでループ獄を味わうウカツな奴もいますから(自分ですw)

まだいろいろ不明瞭なのでなんとも言えませんが、
columnsの番目を指定するcountに上限がないです。
それと、if (checkFlag) break; でループを抜けた後って pageNo++; しなくていいんですかね。
» 2
[5399]Re: タグ付きテキストと表組とページについて | 投稿者:taka | 投稿日:2010/12/06(Mon) 00:01:39
すいません、(z-)様、返答が遅れました。
少し、説明の仕方が雑になり甘かったので、一度、整理して、もう一度、書きなおしますので、その際は、よろしくお願いします。
» 3
[5405]Re: タグ付きテキストと表組とページについて | 投稿者:taka | 投稿日:2010/12/06(Mon) 15:08:33
>>できれば毎回、正常に動作した結果の想像図をでっち上げた画像を添付できますか? 画像を提示される際は、成功予想図または失敗した時の状態、どちらか片方だけでもあるとわかりやすいです。

完成予想図を描きましたので、それを参照してもらいたいのですが、言っていることが違ってたらすいません。

// あらかじめ表を作成し行数と列数を必要な数だけ設定すること
(function(){
   var TAB = String.fromCharCode(9);
   if (app.documents.length < 1) {
       alert("あらかじめドキュメントを開いてから実行してください");
       return;
       }
  var fileObj = File.openDialog("タブ区切りファイルを選択してください");
   if (fileObj == null)  return;    //キャンセルボタンが押されたときは処理しない
   var flag = fileObj.open("r");
   if (flag == false) {
       alert("タブ区切りファイルが開けません");
       return;    //ファイルが開けなかったので以後の処理を中止する
       }
   
   var pageNo = parseInt(prompt("割り付ける開始ページを指定してください",1))-1;
   if ((pageNo < 0) || (pageNo > app.activeDocument.pages.length-1)){
       alert("割り付けるページは存在しません");
       return;
       }
   
   var tfSubNo = parseInt(prompt("割り付けるテキストフレームを指定してください",""));

{

   var i = parseInt(prompt("iの値を入力してください",""));
   var count = 0;
   var No = 1;
   while(fileObj.eof == false){    //ファイルの終わりになるまで繰り返す
       text = fileObj.readln(); //一行読み込む
       var itemData = text.split(TAB); //タブコードで区切って配列に入れる
       while(true){    //無限ループ(breakで抜ける)
           if(pageNo > 2) break;   //終了ページを越えていたら無限ループから抜ける
           var grObj = app.activeDocument.pages[pageNo].groups;
               var checkFlag = checkTextFrame(grObj, "item"+No);
               if (checkFlag) break;
               else{
                   pageNo++;   //次のページへ
                   }
               }
            if (pageNo > 2) break;    //終了ページを越えていたらwhileループから抜ける
            try { var tfSubObj = grObj.item("item"+No).textFrames; }catch(e){}

       
       while(itemData.length){
           for (j=0; j<i; j++)
               if(tfSubNo == 1){
               var contentsObj=itemData.shift();
               tfSubObj.item("sample").tables[0].columns[count].cells[j].contents = contentsObj;
               }else if (tfSubNo == 2){
               var contentsObj=itemData.shift();
               tfSubObj.item("test").tables[0].columns[count].cells[j].contents = contentsObj;
               }
count++;
No = No+1;
}
}
}
})();

//割り付けるべきテキストフレームがあるかどうか調べる。あればtrueを返しなければfalseを返す
function checkTextFrame(grObj, tfLabel){
   for ( var x=0; x<grObj.length; x++){
       if(grObj[x].label == tfLabel) return true;
       }
   return false;
   }

処理結果なんですが、sample.txt(タブ区切り)を選択してあげると1ページ目のスクリプトラベル"sample"にタブ区切り1行目が張り付いてくれますが、2ページ目、3ページ目と反映してくれません。エラーは、起こっていません。

countの上限はNo = No + 1;でやってみたのですが、
1行だけ読んで処理が終わっているので、
もうちょっと違うやり方を試したいのですが、思いつかない状態です、、、どうか、知恵を貸してください。
お願いします。
» 4
[5406]Re: タグ付きテキストと表組とページについて | 投稿者:(z-) | 投稿日:2010/12/06(Mon) 16:14:18
count++;
No = No+1;  のすぐ下に
alert("count="+count+"No="+No);

と1行入れてみて、挙動を確認してみてください。
1ページ目の5行目まで入れたところでNoは5まで増えてませんでしょうか。

count++;
No = No+1;
}



count++;
}
No = No+1;

としてみるとかですかね。
» 5
[5407]Re: タグ付きテキストと表組とページについて | 投稿者:taka | 投稿日:2010/12/06(Mon) 17:01:15
(z-)様、ご返答ありがとうございます。

処理してみたところ、上下ともにNo=5は処理されずに終了してしまう感じになってます。
» 6
[5408]Re: タグ付きテキストと表組とページについて | 投稿者:(z-) | 投稿日:2010/12/06(Mon) 17:36:16
変数Noが何のために定義してあるのか、どの段階で+1されればいいのか、
countの上限はcolmns.lengthと比較して然り、
みたいな事をふまえ

count++;
if(count==tfSubObj.item("test").tables[0].columns.length-1){count=0; No++;break;}
}
}
}
})();
» 7
[5409]Re: タグ付きテキストと表組とページについて | 投稿者:taka | 投稿日:2010/12/06(Mon) 18:26:40
(z-)様、ご返答ありがとうございます。

処理結果として、うまいこと、2ページ目と反映されていました。
ただ、私自身は、なんとなくでしか理解していないので、これから、分析に参ろうかと思います!!!

本当にありがとうございました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)