JavaScriptにて表内やセル内の段落スタイル適用/正規表現置換をしたい

[4090]JavaScriptにて表内やセル内の段落スタイル適用/正規表現置換をしたい | 投稿者:五月 貴 | 投稿日:2010/01/27(Wed) 21:29:39
MacOS10.5.8 InDesignCS3 5.0.4を使用しています。

表題の件ですが,JavaScriptにて流し込んだWordデータの
正規表現による置換を行おうとプログラムを組んでいます。
テキストのみを選んだ場合(テキストフレーム選択ではなく,流したテキストをドラッグして選んでいます)は正規表現と段落スタイルの適用がうまくいったのですが,うまくできない場所があり,その箇所を選択したところ属性が「Table」や「Cell」になっていました。

試しにCell内のデータにも同じ処理を施してみたのですが,
段落スタイルを適用させようとすると
「applyParagraphStyleが関数ではありません」
というエラーになります。
要はセルやテーブルのテキストを選んだ後,段落スタイルパレットをダブルクリックして任意のスタイルを適用させるところまで自動で行いたいのですが,行き詰まってしまいました。


抽象的で恐縮ですが,お力をお貸しいただければ幸いです。
» 1
GUI操作のイメージでそのまま
???.cellObj.applyParagraphStyle(??)と書いているなら

cellObjのあとにtextsなりparagraphsなりを入れてあげるか
セルスタイルでcellObj.appliedCellStyle=???
でどうだろう?
» 2
mg様

コメントありがとうございました。
ですが当方の力量不足で,割り当て方がどうしても理解できませんでした。

以下,ソースを公開します。
(所々alertが入っているのは内容を表示させて確認するためです)

selObj = app.activeDocument.selection;
var pStyle=app.activeDocument.paragraphStyles.item("基本");
var len = selObj.length;
if(!len){
   alert("テキストか表組を選択してください。");
   exit;
}else{
   alert("要素数:"+len+"個");
   for (z=0; z<len; z++)
       {
           var elemNam = selObj[z].constructor.name;
           // 表を選んだ場合の処理
           if(elemNam == "Table"){
               alert("要素名:"+elemNam);
               tblObj = selObj[z];
               alert(tblObj);
               var row = tblObj.bodyRowCount;
               var col = tblObj.columnCount;
               alert(row+"列×"+col);
               for(x=0; x<tblObj.rows.length; x++){
                   for(y=0; y<tblObj.rows[x].columns.length; y++){
                       var txt = tblObj.rows[x].contents;
                       alert(txt);
                       tblObj.rows[x].contents = txt.replace(/[0-9A-Za-z、<><>]/g,repFunc);
                       alert("置換後:"+tblObj.rows[x].contents);
                       tblObj.rows[x].contents.applyParagraphStyle(pStyle);
                   }
               }
           }else{
               if(elemNam == "Cell"){
               // セルを選んだ場合の処理
               alert("要素名:"+elemNam);
               CellObj = selObj[z].contents;
               alert(CellObj);
               CellObj = txt.replace(/[0-9A-Za-z、<><>]/g,repFunc);
               alert("置換後::"+selObj[z].contents);
               selObj[z].paragraphs.applyParagraphStyle(pStyle);

           }else{
               if(elemNam == "Paragraph" || elemNam== "Text"){
               alert("要素名:"+elemNam);
               txt = selObj[z].contents;
               selObj[z].contents = txt.replace(/[0-9A-Za-z、 +-<><>]/g,repFunc);
               alert("置換後::"+selObj[z].contents);
               selObj[z].applyParagraphStyle(pStyle);
               for(ln=0; ln<selObj[z].length; ln++){
                   selObj[z].characters[ln].applyParagraphStyle(pStyle);
               }
           }
       }
   }
   }
}


function changeTxt(searchTxt){
   alert("置換前text:"+searchTxt);
   searchTxt.replace(/[0-9A-Za-z、<><>]/g,repFunc);
   alert("置換後のtext:"+searchTxt);
   return searchTxt;
}


// 正規表現置換
function repFunc(chr,ptr,allStr)
{
   var hankaku = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789, +ー/()[]{}〈〉〈〉";
   var zenkaku = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789、 +-/()[]{}<><>";
   var n = zenkaku.indexOf(chr);
   return hankaku.charAt(n);
}
» 3
とりあえずセルの処理で止まっているので、その部分のヒント。

セル、表を選択したなら、app.selection.length=1になります。
なので、selObj=app.documents[0].selection[0]とかにして、
zのforループがいらないです。

オブジェクトと文字列がごっちゃになっています。
セルや文字列に段落スタイルはあてられません。
あてられるのはテキスト系のオブジェクトです、TextsとかParagraphsとか...

階層はまずは順番に潜ったほうがいいです。
選択=表obj>行obj>セルobj>テキストobj>文字列
//var txt = tblObj.rows[x].contents;
//tblObj.rows[x].contents = txt.replace(/[0-9A-Za-z、<><>]/g,repFunc);
//tblObj.rows[x].contents.applyParagraphStyle(pStyle);

var txt = tblObj.rows[x].cells[y].contents;
tblObj.rows[x].cells[y].texts[0].contents = txt.replace(/[0-9A-Za-z、<><>]/g,repFunc);
tblObj.rows[x].cells[y].texts[0].applyParagraphStyle(pStyle);

セルについてはselObj.cellsのためのforループが必要になります。
選択=セルobjの集まり>セルobj>テキストobj>文字列
//CellObj = selObj[z].contents;
//CellObj = txt.replace(/[0-9A-Za-z、<><>]/g,repFunc);
//selObj[z].paragraphs.applyParagraphStyle(pStyle);

CellObj = selObj[0].cells;
for(var ccc=0; ccc<CellObj.length; ccc++){
   //セルの時のtxtが定義されていない
   txt = CellObj[ccc].contents;
   CellObj[ccc].texts[0].contents= txt.replace(/[0-9A-Za-z、<><>]/g,repFunc);
   CellObj[ccc].texts[0].applyParagraphStyle(pStyle);
   }
» 4
mg様

再び具体的なアドバイスをいただきまして本当にありがとうございます。
これを参考に週末改めて試してみたいと思います。
取り急ぎお礼まで。
» 5
ご教示いただいたスクリプト、無事動作しました。
本当にありがとうございました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)

このページをシェア