10 返信 最新の回答 日時: Sep 7, 2006 4:29 PM ユーザー:(てんてん-19980238)

    ExtendScript Toolkitの使いかた

    Level 1
      IndesignCS2(windows)でExtendScript Toolkitを使いはじめた者です。
      OSはWindows2000です。

      ExtendScript Toolkitの使いかた&Javascriptを勉強するために

      1. 実働を確認したサンプルscriptを用意する。
      2. 1が動くファイルをアプリケーション側で開いておき
      ExtendScript Toolkitからデバッグをスタートする。

      すると、頻繁に
      「undefined がオブジェクトでありません」
      とエラーメッセージが表示され、そこでデバッガが停止してしまいます。

      これを回避する方法として、スプリプテッングガイドのP52に「try/catchが良く使用される」と案内されておりますが、この例文を真似て記述すると今度は、「関数の外側に不正な're turn'ステートメントがあります」と、しかられてしまいました。

      たとえばこんな感じです。

      docObj = app.documents.add(); 

      ↑ここで止まるので

      var docObj;
      try{
      docObj = app.documents.add();
      }
      catch (error){
      docObj = -1;
      }
      return docObj;
      }

      と記述してみました。…だめでした。

      Javascript自体が良く理解できていないので、おそらく文法がヘンなんだと思いますが、正しい文例などはどのあたりで探していらっしゃいますか?
      また、みなさんは、どのようにデバッグされていますか?

      #そもそも実際に動くScriptなのに、ExtendScript Toolkitで止まるのはなぜなんだろう…
        • 1. Re: ExtendScript Toolkitの使いかた
          k-ooishi Level 1
          InDesignのスクリプトについては下記の古籏一浩さんのサイトが詳しいです。
          InDesign CS2自動化作戦 with JavaScript
          http://www.openspc2.org/book/InDesignCS2/index.html
          Adobe CS2 バージョンJavaScript ファレンス
          http://www.openspc2.org/reibun/AdobeJS/index.html

          try catchは
          http://www.openspc2.org/reibun/AdobeJS/CS2/inst/try/index.html
          に書式があります。returnは関数の内側でなければ書けないのでは?

          >#そもそも実際に動くScriptなのに、ExtendScript Toolkitで止まるのはなぜなんだろう…

          ウチはCSなのでExtendScript Toolkitというのがなくて、よくわからないのですが、
          「2. 1が動くファイルをアプリケーション側で開いておき」

          「app.documents.add();」が結びついていないということ、つまり
          ExtendScript Toolkitが介入したために、「1が動くファイル」が直接スクリプトから見えなくなってしまったということではないでしょうか?
          だから、スクリプトの中で、そのファイルのオープンを記述してやれば正常に動くのでは?
          しかし、adobeさんのスクリプトのサポートはなんにもないですね。苦労してます。
          オブジェクトの性格を理解するのに時間がかかります。トホホ。
          なんとかならんものか…。
          • 2. Re: ExtendScript Toolkitの使いかた
            Level 1
            私もExtendScript Toolkitはエディタ程度の使い方しかしていませんで、あわてて、Bridge JavaScript Reference.pdfの中の10 ExtendScript Tools and Featuresを読んだところでして、適切なアドバイスはできないと思いますが。

            まず、「undefined がオブジェクトでありません」というメッセージについてですが、これはターゲットとなるInDesign CS2が立ち上がっていない為に表示されるのだと思います。
            対策としては、InDesign CS2を立ち上げておくか、あるいは、スクリプトの最初に

            #target indesign

            と宣言しておくと回避できると思います。

            また、2つめの「関数の外側に不正な'return'ステートメントがあります」に関しては、そのものずばり、
            return docObj;
            }
            の2行が余分です。スクリプティングガイドの例文はfunctionですので、それを呼び出すmainの部分があり、そこへとreturnで値を返しています。

            以下のようにスクリプトを変えればエラーを出さずに実行できると思います。

            #target indesign
            docObj = app.documents.add(); 
            var docObj;
            try{
            docObj = app.documents.add();
            }
            catch (error){
            docObj = -1;
            }
            • 3. Re: ExtendScript Toolkitの使いかた
              Level 1
              ExtendScript ToolkitのターゲットとしてInDesign CS2が指定されていないためだと思います。
              ExtendScript Toolkitのメニューの下のコンボボックスからAdobe InDesign CS2を選んでみて下さい。(起動時はExtendScript Toolkitが選択されていると思います)
              このときInDesign CS2が立ち上がっていなければInDesign CS2を起動しますかというメッセージがでるので、最初にInDesignを起動しておく必要はありません。
              • 4. Re: ExtendScript Toolkitの使いかた
                Level 1
                k-ooishiさま、お〜まちさま、 by鴨さま>

                みなさんに教えていただいた内容で、すべて解決いたしました。
                書き込んだ当初「あまりにも初歩的な質問だったりすると、質問の稚拙さにスルーされちゃうかも…」と、ちょっと心配だったのです。

                やはり初歩的なミスだったのですね。
                お恥ずかしい…。

                ご丁寧に教えていただき感謝です。
                本当にどうもありがとうございました!

                これからもよろしくお願いいたします。
                • 5. Re: ExtendScript Toolkitの使いかた
                  Level 1
                  てんてんです。

                  お礼を申しあげてからヘンな話なのですが、このトピックをもう少し続けさせていただけますでしょうか。

                  実はいま、外部データをIndesignに取り込む方法を探しています。
                  XMLデータを読み込むなど、いくつか方法があるのを確認中ですが、できれば外部のデータベースと連係したものが希望です。

                  私が試したのは、MySQLとMySQLのODBCドライバーをインストールしたマシンでIndesignからScriptを使用してデータベースに接続させる方法です。

                  VBScriptですと、
                  -----------------------ここから----------------------------
                  Option Explicit
                  Dim objADO
                  Dim objWShell
                  Dim objRS
                  Dim WScript

                  'アラート用オブジェクトを作成
                  Set objWShell = CreateObject("WScript.Shell")

                  'ADOオブジェクトを作成
                  Set objADO = CreateObject("ADODB.Connection")

                  'ADOを使いADRSODBCというデータソースを開く
                  objADO.Open "DSN=MySQL; UID=ODBC; PWD=hoge;"

                  objWShell.popup"接続しました"

                  'SQLの実行
                  Set objRS = objADO.Execute("select * from bmx")

                  'データが無くなるまで表示
                  Do Until objRS.Eof = True

                  'フィールド値の表示
                  objWShell.popup "Item_no:" & objRS("Item_no") & " Maker:" & objRS("Maker") & " name:" & objRS("name") & " our_price:" & objRS("our_price") & " photo:" & objRS("photo") & " touroku:" & objRS("touroku")

                  'カーソルを次の行へ
                  objRS.MoveNext
                  Loop

                  'ADOをクローズします
                  objADO.Close

                  objWShell.popup"接続を解除しました"

                  Set objADO = Nothing
                  -----------------------ここまで----------------------------

                  というような方法で接続できることを確認しました。
                  そこで次に、これと同様な結果をJavaScriptで実現したく、
                  次のように簡単な接続テストをしてみました。

                  -----------------------ここから----------------------------
                  //ExtendScript Toolkitを使うときのおまじない
                  #target indesign

                  //ADOオブジェクトを作成します
                  //↓この記述方法だと、ActiveXObject dose not have a constructorというエラーで停止する。
                  //var objADO = new ActiveXObject("ADODB.Connection");

                  //objADO = new ActiveXObject("ADODB.Connection");
                  var objADO;
                  try{
                  objADO = new ActiveXObject("ADODB.Connection");
                  }
                  catch (error){
                  objADO = -1;
                  }

                  //ADOを使いMySQLというデータソースをオープンします

                  objADO.Open("DSN=MySQL";UID=ODBC; PWD=hoge;");

                  //ADOをクローズします
                  objADO.Close();

                  objADO = null;

                  -----------------------ここまで----------------------------

                  実行すると、objADO.Openの行で「objADO.Open is not a function」とエラーが出て止まります。
                  また例によって、記述がおかしいのかもしれません。もし何か気づいたことがあれば、お知恵をかしていただけると幸甚です。
                  よろしくお願いいたします。
                  • 6. Re: ExtendScript Toolkitの使いかた
                    Level 1
                    さきほどのコードに怪しげな"が入っていたので、try文も含めて修正を施したものを、アップさせていただきます。

                    --ここから--
                    //ExtendScript Toolkitを使うときのおまじない
                    #target indesign

                    //ADOオブジェクトを作成します
                    //↓この記述方法だと、ActiveXObject dose not have a constructorというエラーで停止する。
                    //var objADO = new ActiveXObject("ADODB.Connection");

                    var objADO;
                    try{
                    objADO = new ActiveXObject("ADODB.Connection");
                    }
                    catch (e){
                    alert("エラー内容("+e+")");
                    }
                    finally
                    {
                    alert("エラーが発生しました");
                    }

                    //ADOを使いMySQLというデータソースをオープンします
                    try{
                    objADO.Open("DSN=MySQL; UID=ODBC; PWD=hoge");
                    }
                    catch (e){
                    alert("エラー内容("+e+")");
                    }
                    finally
                    {
                    alert("エラーが発生しました");
                    }

                    //ADOをクローズします
                    try{
                    objADO.Close();
                    }
                    catch (e){
                    alert("エラー内容("+e+")");
                    }
                    finally
                    {
                    alert("エラーが発生しました");
                    }

                    objADO = null;

                    --ここまで--

                    実行してみると、各Try文でエラーが発生しているのがわかるため、VBSと違い、Javascriptの場合は、このアプローチ自体がダメなのかもしれませんね。

                    #こちらのソースは、「6.3 ORACLEのDBを開く - VBScript & JScript(JavaScript) Tips for WSH」
                    http://www.happy2-island.com/vbs/cafe02/capter00603.shtml
                    を参考にさせていただいております。
                    • 7. Re: ExtendScript Toolkitの使いかた
                      Level 1
                      私の会社で使用しているのはMac InDesignCS2でして、WinXP InDesignCSもありますが使っていません。また、XMLデータを扱った経験がありませんので、詳しい方に譲るとしまして、

                      まず、try/catchはエラーを回復できる魔法の呪文ではありませんので、try文中の処理で生じたエラーに対する代替の処理をcatch文中で行う必要があります。

                      最初のtry文中で「ActiveXObject dose not have a constructor」(ActiveXObjectがコンストラクタを持っていない)というエラーを出しているわけですから、ActiveXObjectオブジェクトは生成されず、ob jADOはnullのままです。ですから、以降のobjADO.OpenやobjADO.Closeはエラーになります。

                      問題は、ExtendScriptはCS2用にアドビ社によって拡張されたJavaScriptであり、JavaScriptと100%イコールと言うわけではないということでしょうか。(ち ょっとわかりません)

                      実行エンジンもExtendScript用のものを使っていますので、ActiveXObjectというクラス(?)が使えないということでしょう。

                      対処法としては、
                      1.ExtendScript Toolkitでのデバッグをあきらめ、拡張子をjsに変えて、InDesignのスクリプトパレットから実行してみる。(なんとなく上手くいかないような気がします。)
                      2.ExtendScriptに用意されている、XML関係のクラスを利用する。
                      と、いうくらいでしょうか。
                      • 8. Re: ExtendScript Toolkitの使いかた
                        Level 1
                        by鴨様

                        早々にありがとうございました。

                        >問題は、ExtendScriptはCS2用にアドビ社によって拡張されたJavaScriptであり、JavaScriptと100%イコールと言うわけではない

                        おっしゃるとおりかもしれません。
                        InDesignのスクリプトパレットからの実行については、やはりActiveXObjectがコンストラクタを持っていないというエラーが出ていました。
                        ちなみに今回の実験はXMLベースである必要はないと考えています(対応できれば尚いいですが)。

                        普通のSQLデータベースにSQL文をなげて情報を取得し、それをIndesign上のテキストボックスに書き込んでやる作業が自動化できると、大掛かりなシステムを導入できない仕事でも、か なり効率化できるのでは?と思いつき試してみた次第です。

                        いま、Webの世界でAjaxという技術も流行しているようですね。ベースのひとつにJavascriptが採用されていますので、ひょっとするとIndesignにも応用できるのでは?と思 ったのですが。ちょっと無理かな。
                        • 9. Re: ExtendScript Toolkitの使いかた
                          Level 1
                          InDesign内部からスクリプトを実行する場合はCOMなどの外部からのオブジェクトを引っ張ってくることはできなかったはずです。
                          外部のデータと連携するのであればVBやWSHなどでInDesignを外部から操作するかプラグインを作成するかのどちらかになるかと思います。
                          • 10. Re: ExtendScript Toolkitの使いかた
                            Level 1
                            kabuさん>

                            VBScriptの場合は、確かにきちんと呼び出されているようです。
                            昨日のものはアラートにデータベースの内容が表示されるだけでしたが、ちょっと気になったので、その情報がIndesignにレイアウトされるかも確かめてみました。結果はOKでした。

                            できることがわかっただけでも嬉しいですが、まったく触ったことのないVBScriptをあらためて勉強することになりますね。

                            一般的な情報はネット等にも公開されているようですが、突っ込んだところはAdobeのリファレンスとスクリプティングガイドだけかと思うと、ちょっと気が重いです。

                            リファレンスは読み方すらよくわからないので、まず読み方を勉強する必要もありそうですね。