インデザインCC2014
表の内容を縦方向(列方向)へ改行続きのテキストを流し込むスクリプトを考えているところなのですが、うまく動かず苦戦しております。
「Table Replace.scpt」は行方向への流し込みですのでこれを流用すれば列方向にもいけるはず…?といろいろと触っている内に二進も三進もいかず…。
よろしければご教授願えませんでしょうか
市川せうぞー様「Table Replaceもどき より改変」
http://www.seuzo.jp/rubbs/search_html/msg01462.html
CR = String.fromCharCode(13); //改行
TAB = String.fromCharCode(9); //タブ
TBL = String.fromCharCode(0x16); //表組
if (app.selection.length == 1){
var tblObj = app.selection[0];
switch (app.selection[0].constructor.name){
case "Cell":
case "Table":
case "Column":
case "Row":
break;
default:
break label;
}
var clipAry = new Array();
var myDoc = app.activeDocument;
with (txtfrmObj = myDoc.textFrames.add()){
visibleBounds = ["0cm","0cm","18cm","21cm"];
contents = "ダミー";
app.selection = characters.itemByRange(0,-1);
app.paste();
while (characters[-1].contents == CR) characters[-1].remove(); //最後の改行を削除
var clipstr = "" + contents;
}
if (clipstr == TBL){
clipAry = txtfrmObj.tables[0].contents;
} else if (clipstr != ""){
var tmparray = clipstr.split(CR);
for (var i=0; i < tmparray.length; i++)
clipAry = clipAry.concat(tmparray[i].split(TAB));
}
txtfrmObj.remove();
if (tblObj.cells.length == clipAry.length){
var sel = app.activeDocument.selection;
var tblObjCol = sel.tables.columns.cells;
try {
tblObjCol.contents = clipAry;
}
catch(e) {
alert("表組への貼付けに失敗しました。");
}
}
label:
}
[20655] 双葉マークP (2021/10/25 Mon 17:25)
流し込み後のイメージとテキストの状態の画像を添付します
[20656] 双葉マークP (2021/10/25 Mon 18:01)
リンク先の元のスクリプトは目を通しました。
大元のAppleScriptを書かれたのはせうぞーさんですが、
それをJSで書かれたのは三島梅花藻さんですね。
>スクリプトを考えているところなのですが、うまく動かず苦戦しております
・どこまでやってみたのか
・うまく動かず → どんな結果になったのか
・動けばあとはどうでもいいのか、ちゃんとしたのを書けるようになりたいのか
は必要な情報です。
とりあえずスクリプトをテキスト比較にかけてみたらどこをいじったのかわかったので添削だけ。
・switch 内のColumn とRow を入れ替えてあるみたいですが、これは全く意味がありません。結果は改変前とおなじです。
var sel = app.activeDocument.selection;
変数 sel は配列です。下の行でエラーで止まってると思います。
冒頭で tblObj を宣言してあるところにならい、[0] をつけてやるとよいです。
var tblObjCol = sel.tables.columns.cells;
tables も columns も cells もコレクションオブジェクトです。
配列と同様に[0]とかつけて要素を指定する必要があります。
眺めただけですが、まず上記1点直してみてからですね。
あとたぶん上記クリアしても期待通りの結果にはなりません。
元のスクリプトがどんな動きをするか理解してからかなと思います。
[20657] (z-) (2021/10/27 Wed 09:58)
> リンク先の元のスクリプトは目を通しました。
> 大元のAppleScriptを書かれたのはせうぞーさんですが、
> それをJSで書かれたのは三島梅花藻さんですね。
失礼しました、三島梅花藻さんお世話になります。
指摘にあった通り元のスクリプトの動きを調べる事から始めました。
流し込む時【try】の動きを変更するだけはだめなんですね…
> ・どこまでやってみたのか
現在、問題箇所は分岐の中であると知って編集中です
新しく作ったテキストフレーム内の【改行】を無くして【タブ】で区切るという変換が行われているという認識に変わったのですが、ここの【タブ】で区切っている部分を【改行】に変えてみたのですが、変わらず行方向へ流し込みとなってしまいます。
txtfrmObj.remove();
以前の記述を変更してクリップボード内のテキストを改行にする試み。
} else if (clipstr != ""){
//新設テキストフレーム内文字が表組みでない時!
var tmparray = clipstr.split(CR);
//新設テキストフレーム内文字を改行で区切る
for (var i=0; i < tmparray.length; i++)
//新設テキストフレーム内文字の回数繰り返す
clipAry = clipAry.concat(tmparray[i].split(CR));
//改行で区切ったものを改行で区切る
}
splitでの分割を(TAB)から(CR)に変えてしまえば良いものかと思いましたが、(TAB)(CR)を入れ替えるだけでは意味がないんですね…
【タブ】で区切るから行方向への流し込みになるのだとしたら、
列方向に当たる記号があるのか…
それ以前に選択した表の列ごとのセル数を数えた方が良いのか…
> ・動けばあとはどうでもいいのか、ちゃんとしたのを書けるようになりたいのか
InDesignのJavaScriptは学び始めたばかりなので、ちゃんと書ける事を第一目標としています。これが動くようになった後は溢れた文字があれば長体をかけるなど、アレンジを加えて使っていくつもりです。
switchの宣言が入れ替わっていたのは書き直したからですね……隅々までの添削ありがとうございます。[0]への指摘を踏まえてsplitなどの解釈から初めてみます。
参考書などを切り貼りするだけでは初歩的なミスが多いのだと痛感しました。もう少し上記の箇所の試行錯誤を重ねながら正解を見つけていこうと思います!
現状は経過報告として…。また行き詰まった時には相談させていただくと思いますが、そのときはなにとぞよろしくおねがいします。
[20658] 双葉マークP (2021/10/27 Wed 17:11)
まだスクリプトの基本の理解が浅いようなので、表関係は少し難しいかも。
以下を実行すればどのようにコンテンツが格納されているかが理解しやすいです。
//セルを選択した場合はこちら
$.writeln(app.activeDocument.selection[0].contents);
//表を含むテキストフレームを選択した場合はこちら
$.writeln(app.activeDocument.selection[0].tables[0].contents);
[20659] -e (2021/10/27 Wed 17:49)
> 以下を実行すればどのようにコンテンツが格納されているかが理解しやすいです。
入門として選んだ物が悪かったのだろうとは思いましたが…勉学を進めていく内に表に関してはあまり掘り下げた教材となるものも少なく、動かし方よりもセルの扱いからのスタートからとなりそうですね
教えて頂いたスクリプトを走らせても、表の内容をコピーしてテキストに貼り付けたものと同じ形で抽出されたので、タブ区切りであるという事にも拘った方が良いのか…とも悩む次第ですね…
[20661] 双葉マークP (2021/11/02 Tue 14:30)
書き出されたテキストだけみると分かりづらいですが、
複数セルのコンテンツとして取り出す情報は単なる文字列の配列で、
タブもリターンも関係ありません。
この辺を理解すれば単純な表へ単に文字列の挿入する事は簡単です。
ExtendScriptToolKitなり、VSCodeなりでブレークポイントを設定して
変数の中身をチェックしながらデバッグすると捗ります。
[20663] -e (2021/11/02 Tue 16:34)
> 新しく作ったテキストフレーム内の【改行】を無くして【タブ】で区切るという変換が行われているという認識に変わったのですが、ここの【タブ】で区切っている部分を【改行】に変えてみたのですが、変わらず行方向へ流し込みとなってしまいます。
> splitでの分割を(TAB)から(CR)に変えてしまえば良いものかと思いましたが、(TAB)(CR)を入れ替えるだけでは意味がないんですね…
> 【タブ】で区切るから行方向への流し込みになるのだとしたら、
> 列方向に当たる記号があるのか…
> それ以前に選択した表の列ごとのセル数を数えた方が良いのか…
かいつまんで少しだけ。
変数 tblObj はスクリプト実行時に選択されているもので、
switch文で「セル、表、行、列 の時だけ動く」としてあります。
言い換えると、いずれかの「セル群」が選択されていることが動作条件ですね。
そのセル群に対して .contents = で流し込むデータはテキスト配列です。
スクリプト実行前に、クリップボードにタブ区切りテキスト(またはヨソの表)が入っている前提ですね。
これをそのままペーストすると動かないことがあるので、わざわざダミーのテキストフレームにペーストして、それを初めて変数に入れています。
ペーストで済むならタブ文字や改行文字の処理など不要なのですが、
contentsに値を入れるために改行文字とタブ文字で順序よく分割し、配列に連結しています。
タブ区切りテキストの場合、
1 2 3
4 5 6
という表のソースは
"1\t2\t3\n4\t5\t6"
ですが、ここで用意している配列は
["1", "2", "3", "4", "5", "6"]
となります。基本的に左上のセルから列方向に要素が入っていき、右端まできたら次行の左端の先頭セルに折り返して入っていきます。流し込み先の表が何列何行かを把握しなくてよくなるイメージです。
最後の処理でlengthの比較をしているのも、この配列の要素数ですね。
また、.contents = の流し込み順は変えられないので、タテヨコ逆をやるとしたらfor文でタテ方向にセルを指定しながら1こずつ配列の要素を取り出しながら入れていく、などする必要があります。でも連結セルがあると非常にめんどくさいのでおすすめできません。。
で、改行文字とタブ文字の処理を入れ替えると、どうなるか。
要素の並べ替えを塾講する必要があります。
ぶっちゃけ、この並べ替えさえ上手にやれば従来の流し込み順に沿って入れられそうな雰囲気ですが、
仕組みを把握できていなければ答えが出なかろうと思います。
文字列の配列化、配列の並び順の研究。
処理経過の変数の値をよく見守ることです。
[20660] (z-) (2021/10/29 Fri 13:07)
> 変数 tblObj はスクリプト実行時に選択されているもので、
> switch文で「セル、表、行、列 の時だけ動く」としてあります。
> これをそのままペーストすると動かないことがあるので、わざわざダミーのテキストフレームにペーストして、それを初めて変数に入れています。
> ペーストで済むならタブ文字や改行文字の処理など不要なのですが、
> contentsに値を入れるために改行文字とタブ文字で順序よく分割し、配列に連結しています。
> 最後の処理でlengthの比較をしているのも、この配列の要素数ですね。
switch文は理解の為にも置いてありましたが、ここの作業も複雑でしたが contents に格納している意味がようやく繋がりました。応用が利くように残しておくべきかとは思うのですが、まず理解を先決させて今作成しているものからは一旦消して考えてみます。
-eさんが言われていた「どのようにコンテンツが格納されているか」に関してもタブ区切りであるという認識を念頭に置く事が必要だったんですね…
この理解をする限り、わざわざタブへの変換を入れるよりも改行区切りの文字を順番に入れていく方が単純で確実そうですね!
> また、.contents = の流し込み順は変えられないので、タテヨコ逆をやるとしたらfor文でタテ方向にセルを指定しながら1こずつ配列の要素を取り出しながら入れていく、などする必要があります。でも連結セルがあると非常にめんどくさいのでおすすめできません。。
そうすると .contents ではなく、プレーンの改行区切りのままのテキストを列方向に流し込んで、流し込めなかった場合には次の列へ移動して列方向へと流し込む…という進め方が正しいのかな…
> 要素の並べ替えを塾講する必要があります。
> ぶっちゃけ、この並べ替えさえ上手にやれば従来の流し込み順に沿って入れられそうな雰囲気ですが、
> 仕組みを把握できていなければ答えが出なかろうと思います。
> 文字列の配列化、配列の並び順の研究。
> 処理経過の変数の値をよく見守ることです。
お忙しい中での助言ありがとうございます。励みになっています。
人の褌は立派でも褌の結び方も分からないのでは着けようがない…それを痛感している所ですが、考え方がぐるっと変わったおかげで方向性が定まりました。現状未だ書いている途中ですが、進み次第更新していく予定ですのでまた温かい目で見て頂ければ…と思います!
〈作業の方向性〉
1.プレーンな改行のみのテキストをクリップボードに格納
2.クリップボード内の改行の数だけ繰り返す(i=0;…length)
4.選択範囲へペースト(ただペーストする時は列方向に流れた為)
5.ペーストしきれなかった場合には次の列へ(if…)
[20662] 双葉マークP (2021/11/02 Tue 15:01)