k_ikiの雑記帳

DTPのこと、創作のことなど、思いつくまま

placeText.jsx

InDesignの勉強部屋でのこの話題をもとに、InDesign上のテキストフレームにテキストファイルの内容を一行(一段落)ずつ配置していくスクリプトを書きました。
Windows版InDesign CS3で動作確認しました。他の環境でも動く可能性はあります。
ご利用に際しては自己責任でお願いします。
※このスクリプトはエラー処理の入れ方に問題があります。もしご利用なさる場合は改良版の方をお勧めします。
 
準備が大変です。まずはInDesign上のフレームに、配置したい順番にスクリプトラベルをつけてください。
ラベルは1から始まる半角算用数字です。
仮にフレームが300個あるなら、1〜300までちまちまとラベルをつけなきゃならないので、あんまり便利な感じがしないかも(^^;
ページ順ではなく、あくまでもスクリプトラベル順に一行ずつ配置していきます。
もし、ラベル1のフレームが10ページ目、2のフレームが1ページ目にあるなら、テキストファイルの最初の行が10ページ目、2行目が1ページ目に割り付けられる結果になります。
 
エラー処理を追加しました。
テキストフレームの方がテキストファイルの行数より少なければエラー終了します。
逆にフレームの方が多ければ、ラベル名と行数が一致するものは割り付けますが、以降はなにもしません。
 

var myDoc = app.activeDocument;
var myPage = app.activeDocument.pages;

filename = File.openDialog("テキストファイルを指定してください");
if (filename) {
	fileObj = new File(filename);
	flag = fileObj.open("r");
	if (flag == true) {
		lineCnt = 0;
		while (!fileObj.eof) {
			fileObj.readln();
			lineCnt = lineCnt + 1;
		}
	}
	flag = fileObj.open("r");
	if (flag == true) {
	lineCount = 1;
	if (myDoc.textFrames.length >= lineCnt) {
		while (!fileObj.eof) {
			for (i=0; i<myPage.length; i++) {
				for (j=0; j<myPage[i].textFrames.length; j++) {
					if (myPage[i].textFrames[j].label == lineCount.toString()) {
						myPage[i].textFrames[j].contents = fileObj.readln();
						lineCount = lineCount + 1;
					} 
				}
			}
		}
	} else {
		alert("割り付け可能なテキストフレームが不足しています");
	}
fileObj.close();
	} else {
		alert("ファイルが開けませんでした");
	}
}

 
今検証してて気付いた。
ページの若い順にスクリプトラベルと行数の一致するフレームにテキストファイルの内容を一行ずつ読んでは割り付けています。
その後、次の割り付け作業のために行数を加算しているので、もし同じスクリプトラベルのフレームがあったとしても、ページの若い方には割り付けるけどそれ以外のフレームは無視します。
同じページ内に同じラベル名のフレームがあったら、どれか一つに割り付けたら他のものは無視します。
座標とかオブジェクトIDとかを見てるわけじゃないから、同じページ内に同じラベルのフレームがあったらどれに割り付けるか予測できません><
【追記】 どうやら同頁・同ラベルなら、最初に描画したフレームに割り付けるくさい。
【追記2】すみません! フレームの数が足りてるのに、同じラベル名のフレームがあったり、ラベルなしフレームがあったりして、テキストファイル最終行の行数と一致するラベルを持つフレームがない状態だと、いつまで経ってもfileObj.eofにたどり着けず、InDesignがビジー状態になってしまいます。今のところ、このスクリプトを使う場合は、テキストファイルの各行数と一致するラベルを持つフレームがドキュメント上に必ず存在している状態にしてから実行してください。
 
……状況にもよるでしょうが、このスクリプトを利用するのと、「フレームを連結して、改行を改フレームに置換する」のとでは大して手間が変わらないような気がします(^^;
【追記3】 このスクリプトには改良版があります。このソースは過去の汚点として晒しておきます。