こんにちは。
AppleScript、InDesign、JavaScript、VBscript、PHPなんかについて書いていきます。
そのうちHPにサンプルでもあげるかも。
|
InDesignでJavaScript素人講座 その8
Googleで「InDesign JavaScript」で検索すると、結構いろいろな方がチャレンジされているようです。 自分より有用なものを書かれている方をみるとちょっぴりへこみます。 では、その8スタートです。 今回は「実際に受注された仕事をどうやって効率的にスクリプトで組んでいくか」をテーマにして書いていきます。 例として名刺を作るお仕事を受注したとしましょう。 受注内容としては「異なるデザインで10種類作り、数ヶ月ごとに追加発注」というもの。 現実にそんな仕事があるかどうかはわかりませんが、ものの考え方として捉えてください。 テキストは先方から統一フォーマットで作られたExcelで支給され、1人1列で必要な要素が記入されています。 要素は、会社名、役職、名前etc.です。 10種類のデザインで使う要素は同じだけどオブジェクトの位置やサイズ、フォント、文字修飾等はそれぞれが異なります。 さて、上記のような仕事をあなたならどのように進行しますか? この講座を読んでくださっているくらいだからきっとJavaScriptでやろうと考えるはず、そこまで思い切れなくても漠然と「手作業は嫌だな」ぐらいには考えるはずです。 そこでこの仕事を受注したとして私ならどうやって進めるか書いてみましょう。 1. 流し込むテキストを作る 支給されたエクセルを加工して流し込むテキストを作ります。 今回は統一されたフォーマットで毎回入稿されますから、一度整形したエクセルをテキスト整形フォーマットとして流用していきます。 あれこれ整形処理をしたあと、最後にエディタに持っていって、完成。 2. フォーマットを起こす 私の場合、納期短縮のため&スクリプト制作に時間をさくため、事前に他人にお願いしておきます。 ただデータとして起こしただけなのでいろいろ仕込む必要があります。 仕込む内容としては ●10個のフォーマットを1つのファイルにしてマスター化(1つのファイルにマスターが10個) ●テキストが流し込まれる部分はすべてスタイルを適用(文字スタイルも作っておくと後で楽です) ●カラーをスウォッチとして登録 ●オブジェクトにスクリプトラベルを付ける(同じ要素のオブジェクトは全フォーマットで同じラベル名にする) などなど。 3. JavaScriptを組む 2で作ったフォーマットを見ながら仕上がりを想像しつつJavaScriptを組んでいきます。 私の場合最初は予定の70%ぐらいの出来の、まずちゃんと動くものを目指して組んでいきます。 残りの30%は残った時間と手間を鑑みて調整していきます。 90%ぐらいなら上出来だと考えておくのが、過度にJavaScriptに期待して挫折しないコツだと思います。 120%ぐらいのものができて自画自賛できる楽しみも残りますし(笑) いままで散々書いてきましたが「なんか動かないんだけど」というときはスペルや頭小文字になっているか確認してください。 文法は簡単な部類の言語なので相当とんちんかんな人でない限り文法ミスってことはないと思います。 ExtendScript Toolkitも叱ってくれますしね。 あとはIF文やwhile文などは条件分岐がちゃんとされているか確認するためにこまめにalert()を入れて確認することがキモですね。 さてこの工程で一番大事なこと。 『テキストフレームや画像フレームに同じラベル名をつけておけばまったく同じスクリプトですぐに10種類の名刺ができあがります』 だからスクリプトは一個しか作らなくてOK! 4. ポチっとする InDesignのパレットから作ったJavaScriptをポチっとしましょう。 これで10種類の名刺が流し込まれ、あとは手動で微調整が必要なことがあれば直して完成です。 どうですか? 簡単でしょ? フォーマットとテキストに共通のルールさえ持たせれば、全然違うデザインのものがすぐに作れちゃうんですよ。 楽しくないですか? その後の展開として ●10種類作った後に「やっぱフォントは同じフォントで統一したい」と言われても同じスクリプトでさくっと終わります ●「写真を入れたい」と言われてもスクリプトを一個作って10種類に合わせた座標値を実行前に入れるだけでOK ●同じテキストを利用&簡単な自己紹介の書かれた新テキストが支給され「新人歓迎用のカード的なものが作りたい」と言われても名刺と同じ構成で作っておけば自己紹介の部分の処理を加えるだけですぐに完成 すごく簡単な例ですが実際私の仕事ではこんな感じで動かしてます。 上記の「その後の展開として」の3番目のようなお仕事で私は月100万程度稼いでいます(その後の修正作業などもありますが) 制作作業で一番時間のかかるであろう新規組版をさくっと終わらせることができれば利益率もぐっとあがりますよね。 QuarkXpress+AppleScript時代には「こんな機能がないからできない」「処理を多く書きすぎて実用的じゃない」なんて思って悶々としてましたが、いまでは逆に「スクリプトの中身はシンプルに」「処理は関数化して速度を犠牲にしても他の業務に転用できるように」って考えて書いてます。 スクリプターにはデザイナーと違ったデザイン力が必要だと思いますね。 「現実的じゃないところは切り捨てて手でやっちゃおう」って心意気が上達の秘訣と私は思います。 ここら辺はブログで書いてたり書いてなかったりしてますが。 こんな感じでその8はおしまいです。 その9のネタはまだ未定です。 |
|
InDesignでJavaScript素人講座 その7。
その6で「次は『「いま開いているドキュメントのオブジェクトに指示を与えてみよう」的ななにか』をやります」と告知してましたが、予定を変更して与太話を。 では、その7スタートです。 世間ではPAGE2008という印刷系の恒例イベントが開催されていた模様です。 私は仕事のため行けませんでしたが。 そこで行った人のブログ(主にスクリプト系のセミナーの感想など)を見ていて、ちょっと思った事を書き連ねてみます。 これを読んだ人にとってプラスになるかどうかはわかりませんが、お付き合いください。 さて突然ですが。 『スクリプティングにもデザインセンスが必要だ』 そんなことを私は提唱します。 グラフィックではなくプロダクトのほうね。 企画から実際に運用されるまでをトータルで視野に入れておかないといいものはできないよ、という話。 まー、そうはいっても思いついたときが吉日でなんの見通しもないままスクリプトを組んじゃう事のほうが多いと思います。 そんな人は下記だけ守っていれば後で後悔することが減るはず。 ●極力汎用性を持たせる(一回しか使えないスクリプトは非効率的) ●100%全自動を目指さない(汎用性を犠牲にしちゃいけない) ●メイン部分は関数化する(汎用性を持たせたい) ●時間がないときは余計な機能を実装しようとしない(非効率的) カッコ内を読むとわかると思いますが、汎用性を持たせつつ効率よく組んでいきましょうってこと。 とかくDTP業界は自動組版に幻想を抱きすぎなのですよ。 これは経営陣に多いね。 そりゃー、ン百万とかン千万とかかけて外注すればぼーっと見てるだけで完全自動生産ロボット的なものができあがると思いますが、それってもうスクリプトじゃなくてプログラム、もっといえばアプリケーションなのよね。 全然敷居が低くない、むしろ別世界。 も一つ抱えている問題はスクリプトを難しく考えすぎな人が多すぎ。 たしかに取っ付きづらい面もあるとは思うけど、100回コピペしてコピペ能力を鍛えるより、ネットとかあさって勉強してコピペを100回やるスクリプトを覚えたほうが数倍メリットがあると私は断言します。 だって100回コピペする速度って鍛えたって限度があるし肉体的疲労もたまるけど、スクリプトだったら一回組めばあとはスクリプトを起動するだけですむんだよ? コピペ大好きっていうなら止めはしないけど、「労働時間と給与が見合わない」とか「残業時間が多すぎる」とか愚痴っている暇があったら自らの手でそれらを解決することを考えなさいって。 なんだろうね、そういう人ってスクリプトが普及する=自分たちの首が危ないって思っているのかね。 そうじゃなくて自分に付加価値をつけるって意味合いでも勉強しても無駄じゃないんだよーってことをもっと布教しないといかんのかも。 あとね、手作業が加わったりするようなものは人気がない。 「結局手でやるんだったら意味がない」ってね。 でもさー、手作業で100%作るのと手作業で50%から作ることを等価と考えちゃう理屈が私にはわからんのですわ。 スクリプトのいいところは、プログラム系素人の私のような人間でもちょっと時間をさけばできること、つまり簡便性にあるんですよ。 そして縦横無尽に小回りをきかせることができるってのも重要な特徴。 ま、厳密にいったら違うんだろうけどね。 いろいろ書いたけどスクリプトにアレルギーを持っている人にも喜んで使ってもらえるようなスクリプトを作っていかないとダメだよね。 またスクリプトに興味を持った人が参考にできるような情報配信も必要だよね。 ちょっと話がずれたところで、その7はおしまい。 次回その8でもサンプルには触れず、「実際に受注された仕事をどうやって効率的にスクリプトで組んでいくか」って話をしようと思います。 一応お詫びとして私が業務でどんなスクリプトを書いているかにも触れようと思います。 詳しくは書かないけどね(笑) |
|
InDesignでJavaScript素人講座 その6。
すっかりご無沙汰の素人講座ですが、仕事の合間をぬってその6をスタートします。 第5回では新規のドキュメントを作成し、そのドキュメントにテキストフレームを作成し、テキストを流すというものでした。 今回は画像について書いていこうと思います。 すごいシンプルですのでちょっと味気なかもしれません。 サンプルは下記になります。 01 | var pageObj = app.documents.add(); 02 | pageObj.documentPreferences.pageWidth = "210mm"; 03 | pageObj.documentPreferences.pageHeight = "297mm"; 04 | txtObj = pageObj.textFrames.add(); 05 | txtObj.visibleBounds = ["10mm","5mm","50mm","100mm"]; 06 | txtObj.place("HogeHDD:Users:HOGEHOGE:Desktop:test.jpg"); 07 | txtObj.fit(FitOptions.contentToFrame) ; まず上記のScriptをExtendScript Toolkitにコピペしてください(行頭の数字と縦棒は行番号を意味しているので削除してくださいね)。 前回は実行してもらってから説明に入りましたが、今回は先に説明しちゃいます。 いきなりですが1〜5行目まではその5とまったく同じ内容です。 4〜5行目に注目してください。 ここも当然ながらその5とまったく同じです。 つまりテキストを流す場合も画像を貼る場合も対象はテキストフレームになるということです。 楽ですね。 6行目。 06 | txtObj.place("HogeHDD:Users:HOGEHOGE:Desktop:test.jpg"); 4行目で作成したテキストフレームに画像を貼り込みます。 place()の( )の中には貼り込むパスが入ります(サンプルはMacOS X用です)。 今回はサンプルなので適当ですが見ている方は自分のマシンの環境をあてこんでください。 「HogeHDDを使用しているMacのHDD名、HOGEHOGEをご自分のログイン名、デスクトップにtest.jpgというファイルを作成」。 これでこのサンプルが実際に動くところが見れると思います。 Windowsの場合は…手元にWindowsPCがないのでよくわからないのですが、貼り込みたい画像ファイルのプロパティにそのファイルのフルパスが表示されていると思うので、それを" "の中に入れれば動くと思います。 7行目。 07 | txtObj.fit(FitOptions.contentToFrame) ; 6行目で貼り込んだ画像をフレームにフィットさせます。 FitOptionsは貼り込んだ画像をどうするか決めるプロパティです。 テキストフレームを右クリックすると出てくる「オブジェクトサイズの調整」のことです。 contentToFrameは上記メニューの「内容をフレームに合わせる」と同義です。 他には FitOptions.centerContent(内容を中央に揃える) FitOptions.FrameToContent(フレームを内容に合わせる) FitOptions.fillProportionally(フレームに均等に流し込む。CS2以降のみ) FitOptions.proportionally(内容をフレーム内に収める) があります。 用途に応じて書き換えてください。 どうでしょう? 画像を貼り込む仕組むは理解できましたか? って、2行だけなのでそんなに難しくはない、むしろ「サンプルが簡単すぎる!」と怒られるかもしれませんね。 でも実際に私が業務で使用しているJavaScriptも6〜7行目だけなので、これだけ覚えればすぐにでも業務に転用できるってわけです。 やっぱり業務に使えなければScriptなんて覚えても意味ありませんからね。 その6はこれでおしまいです。 その7予告。 その5、その6と新規ドキュメントを作成してどうこうといった内容でしたが、その7ではもう少し実用的な「いま開いているドキュメントのオブジェクトに指示を与えてみよう」的なことを書いていこうと思います。 またシンプルな内容になると思いますが、徐々に実践的なものに近づけているつもりなので、もう少々お付き合いください。 |
|
InDesignでJavaScript素人講座 その5。
今回から実際のScriptをサンプルにして、JavaScript(以下Script)の書き方とか要点などを説明していきます。 私の説明が足りてないところなどはご自分でネットなどで調べてみてください。 読んだ人に自発的に勉強してもらおうなんて、なんて都合のいい私。 ほら、自分で調べないと覚えないって言うじゃないですか。 そんなわけで、スタートです。 サンプルは下記になります。 01 var pageObj = app.documents.add(); 02 pageObj.documentPreferences.pageWidth = "210mm"; 03 pageObj.documentPreferences.pageHeight = "297mm"; 04 txtObj = pageObj.textFrames.add(); 05 txtObj.visibleBounds = ["10mm","5mm","50mm","100mm"]; 06 txtObj.contentType = ContentType.textType; 07 txtObj.contents = "InDesignでJavaScript素人講座"; まず上記のScriptをExtendScript Toolkitにコピペしてください(行頭の数字は行番号を意味しているので削除してくださいね)。 そしたら、とりあえず結果を見てもらいたいので、このScriptを実行してみてください。 すると新規ドキュメントが作成され、テキストフレームが作成され、そのテキストフレームにInDesignでJavaScript素人講座という文字が流し込まれているはずです。 無事動いたところでScriptの具体的な説明に入りましょう。 まず1行目。 01 var pageObj = app.documents.add(); 新規ドキュメントを作成して、そのドキュメントを変数pageObjに代入しています。 新規で作成したオブジェクトを参照することは頻繁にあることなので、とりあえず変数に代入しておきましょう。 この命令文は app.documents.add(); var pageObj = app.activeDocument ; のように2行にわけて書くことも可能です。 でも1行のほうが打つ文字数も少ないですし、あとから見直しやすいので私は1行で書いてしまうことを推奨します。 続いて2〜3行目。 02 pageObj.documentPreferences.pageWidth = "210mm"; 03 pageObj.documentPreferences.pageHeight = "297mm"; ここでは1行目で作成したドキュメントのサイズを設定しています。 pageObjというオブジェクト(activeDocument、またはdocument[0]が入っています)のdocumentPreferencesというプロパティのpageWidth(pageHeight)というプロパティに指示をしています。 「幅を210mm、高さを297mmにしてね」と言っていると思ってください。 ちなみに単位を入れないで指定することも可能ですが、その場合はInDesignの環境設定で指定されている単位が適用されることになるので、不特定多数が相手のScriptの場合は上記のように単位を指定しておいたほうがベターです。 ちなみに単位を指定しない場合は pageObj.documentPreferences.pageWidth = 210; となります。 "〜"は文字列を意味しますが、単位を指定しない場合は数値のみの記述でOKなので、"〜"はいりません。 続いて4行目。 04 txtObj = pageObj.textFrames.add(); 新規テキストフレームを作成して、そのテキストフレームを変数txtObjに代入しています。 1行目と同じですね。 まー、こうやって変数に代入していくと途中で関数なのか変数なのかわかんねぇ!ってなりがちなので、変数名は自分なりのルールをもってつけましょうね。 ちなみにこの時点ではテキストフレームではなかったりします。 続いて5行目。 05 txtObj.visibleBounds = ["10mm","5mm","50mm","100mm"]; 4行目で作成したテキストフレームに座標値を与えて、座標とサイズを変更しています。 visibleBoundsは線を含めない座標値、geometricBoundsは線を含めた座標値のプロパティです。 どちらも[左側のY座標, 左側のX座標, 右側のY座標, 右側のX座標]で数値を指定します。 ここでも単位を指定していますがドキュメントサイズと同様に省略することも可能です。 続いて6行目。 06 txtObj.contentType = ContentType.textType; 4行目で作成したテキストフレームの属性をテキストにします。 contentTypeはテキストフレームの属性を設定するプロパティ。 ContentType.GraphicTypeでグラフィックフレームに、ContentType.Unassignedで割り当てなしのフレームになります。 なので、4〜6行目はセットで覚えておくといいと思います。 最後に7行目。 07 txtObj.contents = "InDesignでJavaScript素人講座"; 4行目で作成したテキストフレームに「InDesignでJavaScript素人講座」という文字を流し込みます。 contentsはテキストフレーム内の内容(テキスト)を設定するプロパティ。 var textExtract = txtObj.contents ; 上記のようにtextExtractという変数にテキスト内容を代入したりもできます。 これもとてもよく使うプロパティなので絶対覚えておきましょう。 さらさらっとした説明になってしまいましたが、初めてScriptを触る方にはちんぷんかんぷんかもしれません…。 結構こんな文章でも推敲して書いてはいるので、やっぱり文才がないのかもしれない。 えーと、こんな拙い説明と文章でもないよりマシだと思うので、地道に頑張って続けていきたいと思います、はい。 応援メッセージよろしく(笑) 諸先輩方、ソフトな突っ込みよろしく(苦笑) 次の講座では画像を扱ったScriptをサンプルにして、画像にまつわるいろいろを説明しようかな、と漠然と思考中。 そんなこんなでその5は終了。 |
|
InDesignでJavaScript素人講座 その4。
早速ですがスタートです。 Scriptが書き終わったら『デバッグ』をします。 Scriptを一個書くと絶対に一回はエラーに遭遇すると思います(アラート出す、とかは除く) そんなときデバッグが必要となります。 一口にエラーと言ってもいろいろあります。 単純なものでは「スペル間違いによるエラー」、難しいものでは「InDesignのバグに起因するエラー」などなど。 スペル間違いは一番単純ですが一番厄介でもあります。 なにせ書いてあるものすべてにエラーの可能性がある訳ですから。 これの予防策としては「覚えやすい単語を変数に使う」「変数はコピペして使う」「英字1文字はfor文以外では使用を避ける」などがあります。 要は「気をつけろ」ってことです(苦笑) 難しいものに関しては、InDesignのバグについて知っておくとか、違う環境で動かしてみる(違うマシン、WinとOS X)とか、InDesignを再起動するとかして、とりあえず問題の切り分けをしましょう。 問題がわかったらググる。 既知の問題であればすでに解決策を編み出している人がいるかもしれないので、そういう人柱…もとい有り難い人の教訓を利用させてもらいましょう。 見つからなかったら、残念ながら書き直すぐらいしかないかなー。 そんなときのために関数を使ってScriptを構成するのもアリだと思います。 たとえばオーバーフロー処理だけを関数にするとか、別名保存だけ関数にするとか。 そうするといざ問題が生じた際にその関数だけエスケープしてしまえば他は使える訳ですから共倒れは防げます。 あくまでScriptは「作業補助」が目的なのでうまく動かなかったら手動でどうにかすればいいんです。 その妥協点を探ることもScriptを書く上では重要なことですね。 うちの上司はこれができないから頭打ちになってしまっています(溜息) 常に柔軟な姿勢で取り組むことが重要です。 最後に『テンプレートを作ろう』。 一回書いてちゃんと動くことが確認できたら、今後のためにテンプレート化しちゃいましょう。 全部は無理だとしても一部分だけでも関数にしておくと、次に違うものを書くときに俄然楽ですし、余計なデバック作業から解放されます。 私は上にも書きましたが、オーバーフロー処理とか別名保存とか関数にしてテンプレートとして使っていますよ。 またプレファレンスを調べたり、オブジェクトを調べたり、パスを調べたりといったScript書き補助Scriptみたいなものも都度書いていると面倒なので、専用のScriptとして保管しておきましょう。 こうやって書きためたものを再利用していけば気づいたときには、ド素人から私のような半人前スクリプターに昇格できています(笑) ついでに、私が知っているJavaScriptの問題点も書いておきますね。 ○OS X環境で濁点、半濁点を使用したファイル名をデコードすると文字化けする ○Scriptに問題がないのにエラーになるときはInDesignがご機嫌斜めの可能性大 上記2つにはかなり苦しめられています。 なので可能であればWindows環境でScriptを組むことをおすすめします。 まだまだ書くことはあるような気もしますが、ネタがなくなると困るので、これぐらいで終わりにしておきます。 その5はサンプルを使った説明、の予定です。 |




