InDesign CS6を使っています。
ストーリー上で、アンカー付きオブジェクトが挿入されている位置に、
そのアンカー付きオブジェクトのパスやファイル名を、
任意の記号などで挟んでテキストとして置換したいのですが、
JavaScriptでできますでしょうか?
(まだJavaScriptを習い始めの者です)
[15228] 雪だるま (2013/02/06 Wed 13:43)
doc=app.activeDocument;
sel=doc.selection[0];
anchoredObj=sel.pageItems[0];
str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";
anchoredObj.parent.contents=str;
要領がつかめたらループに組み込むなど。
[15230] (z-) (2013/02/06 Wed 14:55)
(z-)さんに書いて頂いたものを参考に、
自分でループ処理を書いてみたのですが上手くいきませんでした。
doc=app.activeDocument;
sel=doc.selection[0];
anchoredObj=sel.pageItems[0];
for(var i=0; i<anchoredObj.length; i++){
str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";
anchoredObj.parent.contents=str;
}
3行目でエラーが起きてしまいます。
もしよろしければ、どこが間違っているのかご指摘願えないでしょうか?
よろしくお願いします
[15233] 雪だるま (2013/02/06 Wed 16:58)
テキストを選択しているのを前提で書いたので、テキストフレームを選択した状態からであれば
sel.parentStory.pageItems[0]、もしくは
sel.texts[0].pageItems[0] など書き替えてみては。
両者の違いは連結フレーム内のテキストまで手を出すかどうかです。
[15234] (z-) (2013/02/06 Wed 17:17)
doc=app.activeDocument;
sel=doc.selection[0];
anchoredObj=sel.parentStory.pageItems[0];
for(var i=0; i<anchoredObj.length; i++){
str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";
anchoredObj.parent.contents=str;
}
としたところ、3行目はクリア致しました。
ですが、”lengthをサポートしていません”とエラーが表示されます。
ループの構文が間違っているということでしょうか?
よろしくお願いします。
[15235] 雪だるま (2013/02/06 Wed 18:05)
> anchoredObj=sel.parentStory.pageItems[0];
> for(var i=0; i<anchoredObj.length; i++){
anchoredObjはpageItems[0]なので、pageItem です。
ありません、と叱られるのは、pageItemがlengthプロパティを持たないせいです。
3行目から「[0]」を削除してみたら動く気がします。
[15236] (z-) (2013/02/06 Wed 19:52)
doc=app.activeDocument;
sel=doc.selection[0];
anchoredObj=sel.parentStory.pageItems[0];
for(var i=0; i<anchoredObj.length; i++){
str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";
anchoredObj.parent.contents=str;
}
の3行目から”[0]”を削除したところ、
6行目(str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";)で
エラーがでました。
そこで、forの構文を直しました。
str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";
↓
str="○"+anchoredObj.allGraphics[i].itemLink.name+"○";
最終的に以下のスクリプトになったのですが、
”allGraphics”をサポートしていませんとエラーが出てしまいます。
doc=app.activeDocument;
sel=doc.selection[0];
anchoredObj=sel.parentStory.pageItems;
for(var i=0; i<anchoredObj.length; i++){
str="○"+anchoredObj.allGraphics[i].itemLink.name+"○";
anchoredObj.parent.contents=str;
}
[15237] 雪だるま (2013/02/06 Wed 21:28)
>allGraphics[i]
このiはpageItems.lengthに沿った変数なので、
pageItems.lengthが3ある時にallGraphics.lengthが1しかないと、
どうなりますかね。よくないんじゃないかなあ。。
エラーが出たら、エラーメッセージの内容をよく考えてみてください。
何かがありません、とかサポートしていません、とか出たら、
存在しない物に対して命令しちゃってるわけです。オブジェクトかプロパティか、どっちかがおかしい。両方おかしい場合もありますが。。
どうおかしいか、考えましょう。調べる手段を身に付けましょう。
エラーが出た瞬間のanchoredObjは何者なのか、把握しましょう。
エラーが出た瞬間のanchoredObjは…ただの配列です。
str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";
↓
str="○"+anchoredObj[i].allGraphics[0].itemLink.name+"○";
だと思いますが、いかがで。
ちなみにallGraphics[0]の決め打ちなので、アンカー付きオブジェクト内に複数の画像を含むグループが配置されていた場合、期待した結果にはならないかもしれません。
前どなたかにせっつかれて書いた、よくわかんない記事が参考になるとうれしいんですが
http://pub.ne.jp/ajabon/?entry_id=4309775
[15238] (z-) (2013/02/07 Thu 09:44) web
> http://pub.ne.jp/ajabon/?entry_id=4309775
を読ませていただきました。
恥ずかしながら、今までESTKを使っていませんでした。
私は「あまりに一足飛びなもので、いじる部分が至らない」の段階だと思います。
全く至らない状態ですが、勝手ながら(z-)さんに甘えさせていただきたいと思います。
> str="○"+anchoredObj.allGraphics[0].itemLink.name+"○";
> ↓
> str="○"+anchoredObj[i].allGraphics[0].itemLink.name+"○";
とご指摘いただいたところと、またfor構文を
> anchoredObj.parent.contents=str;
> ↓
> anchoredObj[i].parent.contents=str;
と直しましたところ、「1順」上手くいきました。
doc=app.activeDocument;
sel=doc.selection[0];
anchoredObj=sel.parentStory.pageItems;
for(var i=0; i<anchoredObj.length; i++){
str="○"+anchoredObj[i].allGraphics[0].itemLink.name+"○";
anchoredObj[i].parent.contents=str;
}
「1順」と書いたのは、1つ目のアンカー付きオブジェクトについては
上手くいったのですが、2順目、3順目、…というようにループできてないようです。
なぜループができていないのか分からない状態です。
宜しくお願いします。
[15245] 雪だるま (2013/02/07 Thu 17:04)
> 上手くいったのですが、2順目、3順目、…というようにループできてないようです。
訂正です。
1つ目、3つ目、5つ目、…のアンカー付きオブジェクトは処理できているのですが、
2つ目、4つ目、6つ目、…のものは処理できていない状態です。
(プレーン・テキストを処理)
今まで載せていなかった情報なのですが、
「表」内のアンカー付きオブジェクトを
スクリプトを利用して処理しようと考えています。
この場合、スクリプトでは処理できないのでしょうか?
以前、「InDesignの勉強部屋」で
「既存の表の体裁を保ったまま、テキストのみを差し替えることができません」
という記事を見たことがあり、もしやできないのでは?と思うのですが、
この点はどうなのでしょうか?
宜しくお願いします。
[15246] 雪だるま (2013/02/07 Thu 17:25)
これはー…
1つ目を処理した時点で1つ目はなくなり、
2つ目だった物が1つ目に、3つ目だった物が2つ目になってしまうからですね。
これを回避するには後ろから処理していくか、
while(anchoredObj.length){
/* anchoredObj[0]を処理 */
}
などの方法が思いつきます。
[15247] (z-) (2013/02/07 Thu 18:48) web
> 今まで載せていなかった情報なのですが、
> 「表」内のアンカー付きオブジェクトを
> スクリプトを利用して処理しようと考えています。
> この場合、スクリプトでは処理できないのでしょうか?
> 以前、「InDesignの勉強部屋」で
> 「既存の表の体裁を保ったまま、テキストのみを差し替えることができません」
> という記事を見たことがあり、もしやできないのでは?と思うのですが、
> この点はどうなのでしょうか?
こっちを忘れてました。。
体裁というのは文字や段落のスタイルの事でしょうかね。
まず、てきとうにやってみるといいです。
どういう「できません」なのか、自分のデータで確認するのが理解を深めるアレだと思います。
表内文字をいじるにはstoryではなく、story.tables[n].cell[n].texts[0] とかでいじります(自分は)。
ESTKで変数の値を見られるようになったら、storyの中のtextStyleRangesを調べてみるといいです。
[15248] (z-) (2013/02/07 Thu 19:08) web
whileを使って以下のようにしたところ、表内以外のアンカー付きオブジェクトは
テキスト化できました。
doc=app.activeDocument;
sel=doc.selection[0];
anchoredObj=sel.parentStory.pageItems;
while(anchoredObj.length){
str="○"+anchoredObj[0].allGraphics[0].itemLink.name+"○";
anchoredObj[0].parent.contents=str;
}
> 表内文字をいじるにはstoryではなく、story.tables[n].cell[n].texts[0] とかでいじります
具体的にどのように追加したらよいのでしょうか?
宜しくお願いします。
[15249] 雪だるま (2013/02/07 Thu 20:25)
> 具体的にどのように追加したらよいのでしょうか?
(z-)さんは充分すぎるくらいアドバイスされています。
あとはご自分で努力すべきでしょう。
[15250] Subi (2013/02/07 Thu 21:31)
Subiさんの仰る通りだと思います。
後は自分で考えたいと思います。
(z-)さん、大変長い間ありがとうございました。
[15251] 雪だるま (2013/02/08 Fri 10:17)
> 具体的に
何かてきとうに表を作り、各セルに違う文字列を入力し、
そのテキストフレームだけを選択し、
var myCells = app.activeDocument.selection[0]. parentStory.tables[0].cells;
for(var i=0; i<myCells.length; i++){
alert(myCells[i].texts[0].contents);
}
とか実行してみると、少しわかるでしょうか?
表のオブジェクト名がtableだ、とか、
tableの中にはcellsやrowsやcolumnsがあるんだねー、とか、
そういうのをESTKのデータブラウザやオブジェクトモデルビューア(ヘルプから出せます)や
その他便利なサイトなどで自力で見つけられるようになっておくとよいです。
CS5.5まででVB主体ですが、お〜まちさんの作ってくださった所などすごい便利です
http://www15.ocn.ne.jp/~preopen/iddomjs/domCS-CS55.html
[15256] (z-) (2013/02/08 Fri 13:01) web