表組について

[5374]表組について | 投稿者:taka | 投稿日:2010/12/02(Thu) 11:19:14
はじめまして、最近、InDesignとJavaScriptの勉強をしているのですが、タブ区切りテキストと表組についての質問をさせてもらいます。

こちらの環境は、OS:Windows7,アプリ:InDesignCS3,言語: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;    //ファイルが開けなかったので以後の処理を中止する
       }
{
   pageObj = app.selection[0];//自動レイアウトする項目の先頭番号
   var count = 0;
   while(fileObj.eof == false){    //ファイルの終わりになるまで繰り返す
       text = fileObj.readln(); //一行読み込む
       var itemData = text.split(TAB); //タブコードで区切って配列に入れる
       for (i=0; i<itemData.length; i++){ // 項目数繰り返す

           pageObj.tables[0].columns[count].cells[i].contents = itemData[i];

}
count++;
}
}
})();

色んなサイト、本を参考にさせてもらい、
上記のスクリプトを起動させると画像の上記の結果になるのですが、真ん中にあるような、タブ区切りテキストを、
下記のようにすることは可能でしょうか。

else if文でiの部分をif(i == 1)などで、命令を加えても、
思っているような結果にならなく、こちらに質問させていただきました。

どうか、よろしくお願いいたします。
» 1
[5375]Re: 表組について | 投稿者:(z-) | 投稿日:2010/12/02(Thu) 12:39:59
表の2行目まで入れたら次の列に持ち越したい、ということでしたら、
for文の i をcellsに使い回しせずに

for (i=0; i<itemData.length; i++){
for (j=0; j<2; j++){
pageObj.tables[0].columns[count].cells[j].contents = itemData[i];
}
count++;
}

とかでいけませんかね
» 2
[5376]Re: 表組について | 投稿者:taka | 投稿日:2010/12/02(Thu) 13:31:10
(z-)様、返信ありがとうございます。

(z-)様の方法で、cellsとitemDataでiの使い回しをしないでcellsをj、itemDataをiにしてみたのですが、

次の列に持ち越しせずに、
あいうえお→あいうえお→かきくけこ→かきくけこ→さしすせそ→さしすせそ→たちつてと→たちつてと、と処理が行われ、次の列に移行し、なにぬねの→なにぬねのと、繰り返され、最終的に画像のような結果になってしまいました。
» 3
[5377]Re: 表組について | 投稿者:(z-) | 投稿日:2010/12/02(Thu) 13:52:35
あ縲怐Aあぁ。以下に訂正で。失礼おば。

var itemData = text.split(TAB); //タブコードで区切って配列に入れる
while(itemData.length){
for (j=0; j<2; j++){
var contentsObj=itemData.shift();
pageObj.tables[0].columns[count].cells[j].contents = contentsObj;
}
count++;
}
}
}
})();
» 4
[5380]Re: 表組について | 投稿者:taka | 投稿日:2010/12/02(Thu) 16:42:26
(z-)様、早い返信ありがとうございます。

上記のやり方を試したところ、うまい具合に処理ができました。
.shift();で、配列の最初の要素から値を削除して、繰り返しを行えば良かったんですね。とても、参考になりました。

これを少し改良すれば、scanfみたいなので、繰り返し回数を決めて処理するのは可能でしょうか。質問ばかりで、申し訳ないです。
» 5
[5381]Re: 表組について | 投稿者:(z-) | 投稿日:2010/12/02(Thu) 17:34:16
scanf、ケツがエフだから大方Cか?と思いぐぐってきました。ユーザからの入力を受ける命令のようですね。知りませんけど "^;
BASICでいうところのinkey$とimput$どちらに相当するかまではチラ見ではわかりませんでしたが、
JavaScriptではprompt()が妥当ではないでしょうか。
ちょっと、任意の回数ぶん「何を」繰り返したいのか文面から読み取れませんでしたが、

var obj=prompt("繰り返し回数を入力してください", "1", "Harou Waarudo");
if(obj==null){ exit();}
if(obj.match(/[^0-9]/)){ exit();}
if(eval(obj)==0){ exit();}

とかで得た数値を、繰り返したい「何か」に使ってみてはいかがでしょうか。
この機会にぜひお勉強してみて下さい。
» 6
[5382]Re: 表組について | 投稿者:taka | 投稿日:2010/12/02(Thu) 18:24:55
(z-)様、へんしんありがとうございます。

かなり文章下手で申し訳ございませんでした。
scanfはCの書式付き入力関数です。
こちらも、色々ググって探して、自己解決してしまいましたが、言いたかったことは、j<2の繰り返し回数を、j<aか何かにしておき、スクリプトを起動したときに、タグ付き.txtを選択→aの数字を入力してくださいみたいな感じにしたかったのですが、
a=prompt("Aの値を入力してください","");
とj<2をj<aで普通に解決してしまいました。
(z-)様には、かなりお手数をおかけしました。
本当にありがとうございます。
JavaScriptの根本的なところから、もう少し勉強してみたいと思います。
また、お世話になるとは思いますが、どうかよろしくお願いいたします。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)