4 返信 最新の回答 日時: Aug 30, 2010 9:03 AM ユーザー:nobusann

    スクリプトで文字列のある範囲を一度に処理する方法

    nobusann

      InDesignのスクリプトで、なかなか解決方法が見つからずに、悩んでいますので、もし、よい方法をご存じのかたがいましたら、

      アドバイスをよろしくお願いいたします。

       

       

      InDesignはCS2とCS3で作業しています。

       

      今回の質問としましては、スクリプト言語はAppleScript以外であれば、問いませんので、よろしくお願いいたします。

       

       

      文字列としてたとえば1000文字がテキストフレームにあるとします。

       

      その文字列を1~50文字までが90%の長体として、51~1000文字までを80%にしないといけないと仮定した場合に

      すべてのCharacterをLoopしながら属性を与えていくのはできるのですが、それだと、あまりにも処理時間がかかってしまっています。

       

      フレームの数、文字列の数もそうとうな場合に上記のようなLoop以外の方法がありますと、とても助かります。

       

      1~50文字までのCharacterと、51~1000文字までのCharacterを、それぞれ一気に処理することはできるのでしょうか?

       

       

      AppleScriptの参照のように

       

      set properties of text from character A to character B to {color:RED,size:S}

       

      などのように

       

      ●●~●●の範囲の属性を一度に与えるというやり方をご存じのかた、アドバイスよろしくお願いいたします。

        • 1. Re: スクリプトで文字列のある範囲を一度に処理する方法
          milligramme Level 3

          var sel = app.selection[0];
          sel.characters.itemByRange(0,49).horizontalScale = 90;
          sel.characters.itemByRange(50,999).horizontalScale = 80;

          でどうでしょうか

          • 2. Re: スクリプトで文字列のある範囲を一度に処理する方法
            bykamo

            milligrammeさんの回答に、

             

            >AppleScriptの参照のように

            >set properties of text from character A to character B to {color:RED,size:S}

             

            の部分を加えると

             

            sel.characters.itemByRange(0,49).properties = {horizontalScale:90,fillColor:RED,pointSize:S};
            sel.characters.itemByRange(50,999).properties = {horizontalScale:80,fillColor:RED,pointSize:S};

             

            という形になるでしょうか。

            1 人が役に立つと言っています
            • 3. Re: スクリプトで文字列のある範囲を一度に処理する方法
              nobusann Level 1

              milligramme 様、アドバイスありがとうございました。

               

               

              itemByRangeで出来るのですね!

               

              とても参考になりました。

               

              明日、会社で記述をして確認させていただきます。

               

               

              Rangeが使えるのと使えないのとでは、相当処理効率に差は出てくると思います。

               

               

              とても大きな成果につながるアドバイスをしていただき、本当に感謝しています。

               

               

              今まで、処理時間でかなりストレスを感じていた部分を、この記述の仕方で書き直せば

              相当のスムーズな処理になるものがたくさんあります。

               

              今まで作ったものを、改良するのが楽しみです。

               

               

              本当にありがとうございました。

              • 4. Re: スクリプトで文字列のある範囲を一度に処理する方法
                nobusann Level 1

                bykamo 様、アドバイスありがとうございました。

                 

                とても感謝しています。

                 

                 

                なかなかこの問題に関しては、調べても答えが長い間、得られなかったため、今回アドバイスいただいて

                本当に助かりました。

                 

                byKamo様のアドバイスでは、こちらが記述しましたサンプルに対しての記述を教えていただき、とてもわかりやすかったです。

                 

                これから、今回のアドバイスでいただいたitemByRangeを使って、今まで作ったものを改良したいと思います。

                 

                この記述を使えば、相当な動作の改善になると思います。

                またソース自体もスッキリとしますし、改善するのが楽しみです。

                 

                とてもアドバイス、感謝しています。

                 

                本当にありがとうございました。

                 

                 

                P.S ただ、このサイトの仕組みが少し理解不足なところがあり、bykamo様のほうもmilligramme様と同じく、Correct answerっていうのを押したかったのですが、

                押せなくなってしまったので、helpful answerというのを押させていただきました。