Skip to main content
Known Participant
February 5, 2025
Answered

CSV流し込みスクリプトへの条件追加について

  • February 5, 2025
  • 4 replies
  • 1959 views

添付画像の①の状態から②のCSV情報をスクリプトで読み込んで③の状態にしたいのですが、
何度試しても画像が最前面にきて文字が隠れてしまい、うまくいきません。

①すべての画像を最背面にする(またはすべてのテキストオブジェクトを最前面にする)
②横幅が長いテキストは長体をかけて38mm以内に収まるようにする(高さは変えない)
 (または画像の横幅に対して幅90%以内に収まるようにできればベター)

上記の条件をクリアするためには、スクリプトにどのような記述を追加すれば良いのでしょうか。


できればベースの色は画像ではなくIllustratorのオブジェクトで表示したいのですが、
シンボルオブジェクトを使って表示・非表示をコントロールするなど、
アクションのバッチ処理以外では無理そうなので、スクリプトで実行できるよう
あえて背景色を画像にしています。


一昨日、スクリプトを貼って質問したのですが、削除されてしまったようなので
あえてスクリプトは貼りませんが、「テンプレート流し込みスクリプト」で
検索して最初に出てくるスクリプト(URLを貼るのもNGのようなので)を使用しました。
ご教示、どうぞ宜しくお願いいたします。

Correct answer Ten A

あれはhscaleを調整するようにするべきですね。

 

var counter = 0;
var slct = app.activeDocument.selection[0];
var cntsLength = getChars(slct);
var visibleChar = getVisible(slct);
var hscale = 1.0, vscale = 1.0;
var stepNum = 0.02;

while (cntsLength != visibleChar) {
    scalingWidth(slct, [hscale, vscale]);
    visibleChar = getVisible(slct);
    hscale = hscale-stepNum;
    }

function getVisible(txObj){
    var result=0;
    for (var i=0;i<txObj.lines.length;i++){
        result += txObj.lines[i].characters.length;
        }
    return result;
    }

function getChars(txObj){
    var result=0;
    for (var i=0;i<txObj.paragraphs.length;i++){
        result += txObj.paragraphs[i].characters.length;
        }
    return result;
    }

function scalingWidth(txObj,wscl){
    for (var i=0;i<txObj.paragraphs.length;i++){
        txObj.paragraphs[i].scaling = wscl;
        redraw();
        }
    }

初心者の方がスクリプトを書く題材としてよいものなので、時間が許すのであれは是非ご自身の手で書かれたら良いと思います。
詰まった点や疑問点は都度質問いただければ、アイデアや解説といったものは得られます。
また、スクリプトの掲載はご自身で書かれたものに関しては問題ありません。ここで消されると言うことが起こるのはよそからの丸々転載されたものなどに関してです。これは主に著作権に絡む問題です。 

4 replies

Ethanイーサン
Participant
February 5, 2025

以下、ご質問です。

・テンプレートがある事を前提として良いですか?

・Illustratorの「変数」機能ではなく、Extend Scriptで処理して良いですか?

・CSVの1行ごとが、1Illustratorファイルになって良いですか?

・ご自分で勉強して、コードを書きたいとの事ですが、とりあえず動いてしまうExtend ScriptをUPしても良いですか?(欲しい機能とちょっと違うかもしれませんが。)

Known Participant
February 6, 2025

ご回答ありがとうございます。

「テンプレートがある事を前提として良いですか?」
→テンプレートというのは、画像①の状態のことを指しておられますでしょうか?
 だとしたら、「はい」です。

「Extend Scriptで処理して良いですか?」
→画像③の結果が得られれば、方法はなんでもかまいません。

「CSVの1行ごとが、1Illustratorファイルになって良いですか?」
→CSVが100行を超える場合もあるため、できれば一つのaiファイル上で完結させたいです。

「とりあえず動いてしまうExtend ScriptをUPしても良いですか?」
→ありがとうございます。ぜひ、宜しくお願いいたします。

Ethanイーサン
Participant
February 6, 2025

https://github.com/tugrope/fruitScript.git

 

自分が使用中のScriptのうち、不要なものをザクっと削除しただけなので、不要な部分や無駄も多いと思いますが、使える部分があればどうぞ。

なお、環境がMacなのでWinの場合はAIに調整してもらってください。

オーバーフローについては187行目以降です。

 

リンク差し替えを自分にとって分かりやすく確実な仕組みにしており、もし100アートボードを作ると、MAX100種ダミー画像とリンク設定が必要になるため、1ファイル1アートボートを前提にしてます。

とりあえず動けば、ご利用はご自由にどうぞ。

Ten A
Community Expert
Community Expert
February 5, 2025

テキストフレームにはoverflowsというプロパティがありますので、これを目印にして横幅を縮めていきます。

以下は選択したテキストフレームに対する処理例です。

これ、InDesignですね。Illustratorではエリアテキストのcontentsや行中のcharacterの数などを比較してオーバセットを検出する必要があります。これに関しては以下のページが参考になると思います。

 

https://ten-artai.com/2011/03/95/

 

 

 

Known Participant
February 6, 2025

ご回答ありがとうございます。
最初の質問以外の、回答へのスクリプト記述は大丈夫なのですね。

ご提示くださった内容で単純なテキストのオーバーフローを回避しようと試みてみましたが、
添付画像のようにアラートが出てうまくいきませんでした。

また数が多い場合、選択しなくてもすべてのテキストエリアを対象にするには
どうしたら良いでしょうか?ご教示いただけますと助かります。

ajabon grinsmith
Community Expert
Community Expert
February 5, 2025

こちらですかね? Google検索のトップヒットです。

Adobe Illustratorの単純作業はこれにお任せ!テンプレート ...Bulanco Inc.

とくにライセンスについての記載(二次配布しないでください、とか 自由に改変して構いません、などの断り書き)はありませんでしたが、お行儀の点で、まずは制作・公開されている大元へ問い合わせてみては。

 

Ten Aさんからは、Kreislerianaさんがご自身で「スクリプトを書ける人」の体裁で回答きていますが、

実際どうでしょうか? 誰かに書いてもらいたい感じであれば、そのあたりもはっきりされたほうがいいです。書ける人向けのヒントで大丈夫ですか?

Known Participant
February 5, 2025

ご回答ありがとうございます。はい、そちらで公開されているスクリプトになります。
スクリプトにはあまり詳しくないため、そのような既存のスクリプトを参考にしつつ、
ChatGPT等駆使しながら、なるべく自分で試行錯誤してみようと思いましたが、
なかなかうまくいかず、限界を感じているところです。


自動長体については、テキストエリアの幅を基準にする、属性名を付けた特定のオブジェクトの幅を基準にする、
直接数値指定するなど試してみましたが、どれもうまくいきません。
もし差し支えなければ一番行数が少なくて済むようなスクリプトを提示していただけると助かりますが、
スクリプトを書いても削除されないのでしょうか。


あるいはまったく別の方法で、添付画像のようなことができそうでしたら教えていただけますと助かります。
どうぞ宜しくお願いいたします。

Ten A
Community Expert
Community Expert
February 5, 2025

スクリプトで生成する場合でも生成順序で重なるのは手作業と同じなので差し替え時の手順がおかしいのでしょう。
テンプレートを利用した場合はスクリプトによりそれぞれの内容を差し替えればテンプレートのzOrderPositionは変化しません。また、バックが平網であるのであれば背面に四角形を敷いて、それのfilColorを変更するようにした方が良いです。テキストの長体率を調整するにはtextFrameのhorizontalScaleを変更してください。

手順としては

 

CSV読み込み→改行と「,」で分割、必要であれば引用符の削除→テンプレートの複製と位置の調整→そのテキストを変更→長体率の調整→背面の矩形の色変更

 

で、テンプレートの複製以下をCSVの行分繰り返すことになります。CSVとテンプレートを正確にコントロールすればエラートラップは必要ありませんから30~50行ぐらい書いたら実用に堪えるものが出来るとおもいます。

Known Participant
February 5, 2025

ご回答ありがとうございます。

スクリプトにはあまり詳しくないため、Ten Aさんのご説明は難しく感じますが、
手順が大事だというのはわかります。

どうも、画像をただの四角いオブジェクトに新しく入れる場合はグループの最前面にいってしまうらしく、
あらかじめダミー画像を入れておくと重なり順が変わらないらしいのですが、それだと変数設定からの
スクリプトでの一括流し込みはできませんよね。

ChatGPT等を駆使して元のスクリプトにすべての重なり順を逆にするスクリプトを追加することで
文字が隠れるのはなんとか回避できましたが、自動長体がどうしてもうまくいきません。

ベースの色もスクリプトでコントロールできるのですね。
2色以上の高さの異なるカラーの組み合わせでもスクリプトで色分けできますでしょうか。

また、ここでの質問にスクリプトやURLを書いたら削除されてしまうのかどうかも、
ご存知でしたら教えてください。どうぞ宜しくお願いいたします。