質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2082閲覧

InDesignのJavaScriptで、特定のフォントが適用されたテキストフレームのタグだけが取得できない

morinokuma0621

総合スコア81

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/11/29 03:56

編集2018/11/29 07:36

JavaScript

1pg = app.activeDocument; 2for (j=0; j<pg.allPageItems.length; j++) 3{ 4 dType = pg.allPageItems[j].constructor.name; 5 dFont = pg.allPageItems[j].lines[0].appliedFont.fontFamily; 6 7 if (dType == "TextFrame" && dFont == "A-OTF 新ゴ Pro") 8 { 9 alert(pg.allPageItems[j].lines[0].associatedXMLElements[0].markupTag.name); 10 } 11}

InDesignのデータ上に、テキストフレームが複数あります。その中の1つにだけ、"A-OTF 新ゴ Pro"のフォントが設定されていて、『税込』のタグが設定されています。

その状態で上記のスクリプトを実行すると、本来なら"A-OTF 新ゴ Pro"の適用されたテキストフレームを見つけたらそのフレームのタグを読み込んでアラートで表示する、というプログラムになるはずでした。

が、これを実行するとalertは表示されず、下図のエラーが表示されます(つまり、if文の中には入れています)。
イメージ説明
ここで不思議なことに、そのフレームのフォントと下記のスクリプト部分、両方とも"MS Pゴシック"に変えると、このエラーがでずにalertで正しく『税込』が表示されることに気が付きました。

しかも、"小塚ゴシック Pro"でも正常に表示されましたが、ここを"小塚明朝 Pro"に変えると、今度はalertで『税込』が表示されるのに、そこでOKを押すとまた上図のエラーが表示されることがわかりました。

大した違いのないフォントなのに、なぜこのようなことが起こるのか・・・。JavaScriptは素人同然のレベルなので、一体何が起こっているのかが全く見当がつきません。何をどうしたら、どのフォントでも正しくタグを読み込めるようになるでしょうか。ご助力お願いいたします。

【---追記---】
小塚明朝にしたときだけエラーが出る件に関して、alertの後ろにbreakを付ければ出なくなりました。ということは、ループしていることで何かエラーが出ているのだと思います。それがなぜ小塚明朝では起こって小塚ゴシックだと起こらないのかといった疑問は残りますが。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

どこか別のテキストフレームで「A-OTF 新ゴ Pro」や「小塚明朝 Pro」を使っているところがいて
尚且つそのテキストフレームの1行目にはassociatedXMLElementsがない

「A-OTF 新ゴ Pro」のテキストフレームは拾いたいテキストフレームより前に
「小塚明朝 Pro」のテキストフレームは拾いたいテキストフレームより後ろにある

ifでpg.allPageItems[j].lines[0].associatedXMLElements.lengthも確認

投稿2018/11/29 14:09

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuhiroHatano

2018/11/29 14:26

老婆心ながら、allPageItemsは非表示のレイヤーのアイテム、マスターページのアイテム、入れ子になっているアイテム、インラインのアイテムも含みます、結構使いどころを考えるやつです 対象としたいテキストフレームのいる場所がおよそ決まっているならTextFramesプロパティからで拾った方が、というか拾えるようにしといた方が無難です
morinokuma0621

2018/11/30 00:46

ご返答ありがとうございます。ご助言いただいたようにlengthをif文に組み込むことで、解決することができました!allPageItemsなどについてはどこからかコピペして作っており、正直よくわかっておりませんが、ただ元になっているInDesignファイルはフレーム数が10個程度の小さい小組ですので、今回はひとまずこれで進めようと思います。本当にありがとうございました。
guest

0

頂いた助言を参考に、次のように作り変えました。

JavaScript

1 for (j=0; j<pg.allPageItems.length; j++) 2 { 3 dType = pg.allPageItems[j].constructor.name; 4 if (dType == "TextFrame") 5 { 6 dFont = pg.allPageItems[j].lines[0].appliedFont.fontFamily; 7 if(dFont == "A-OTF 新ゴ Pro" && pg.allPageItems[j].lines[0].associatedXMLElements.length > 0) 8 { 9 var tagz = pg.allPageItems[j].lines[0].associatedXMLElements[0].markupTag.name; 10 if (tagz == '税込') 11 { 12 pg.allPageItems[j].lines[0].contents = resul; 13 break; 14 } 15 } 16 } 17 }

タグのない場所からタグを取ろうとしていたり、テキストフレームではない場所からフォント名を取ろうとしていたがために、上記のようなエラーがでていたようです。

そこで、まずテキストフレームかどうかを判断、テキストフレームならフォント名を取得し、そのフォント名が特定のフォントで且つタグが入っていれば次に進む、と丁寧にIF文を入れることで改善できました。

ただ、フォントを変えただけで出てくるエラーが変わる理由まではわかりませんでした。

投稿2018/11/30 00:51

morinokuma0621

総合スコア81

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問