Skip to main content
Participant
June 2, 2025
Question

変数を利用して作業の自動化をしたいが、どのようなCSV、JAVAを作成すれば良いか分からない。

添付のようなレイアウトに写真、テキストを自動で流し込みたく

CSVデータを作成し、スクリプトを作成しましたが、エラーになってしまいうまくいきません。

javaあまり分からず、AIで作成したコードのため問題があるかと思うのですが、どのような設計にするとやりたい作業が自動化できるか知りたくご教示いただけますと幸いです。

 

現在は、変数からオブジェクトとの紐付けを手動で行い

スクリプト>その他のスクリプト>jsxとCSVを選択 で実行しています。

 

自動化したいレイアウト

 

作成したCSV

 

コード

// ExtendScript for Adobe Illustrator
var csvFile = File.openDialog("Select CSV file");
if (csvFile != null) {
    csvFile.open("r");
    var content = csvFile.read();
    csvFile.close();

    var lines = content.split("\n");
    var headers = lines[0].split(",");
    var data = [];
    for (var i = 1; i < lines.length; i++) {
        data.push(lines[i].split(","));
    }

    var doc = app.documents.add();
    var pageWidth = doc.width;
    var pageHeight = doc.height;
    var frameWidth = 296.25;
    var frameHeight = 390;
    var padding = 10;
    var x = padding;
    var y = padding;

    for (var i = 0; i < data.length; i++) {
        var studioName = data[i][1];
        var month = data[i][0];
        var amount = data[i][2];
        var averageAmount = data[i][3];
        var imageFileName = data[i][4];

        if (i == 0 || data[i][1] != data[i - 1][1]) {
            var heading = doc.textFrames.add();
            heading.contents = studioName + "・" + month + "・平均金額: " + averageAmount;
            heading.position = [x, y];
            y += heading.height + padding;
        }

        var imageFile = new File(imageFileName);
        if (imageFile.exists) {
            var placedImage = doc.placedItems.add();
            placedImage.file = imageFile;
            placedImage.position = [x, y];
            placedImage.width = frameWidth;
            placedImage.height = frameHeight;
            y += frameHeight + padding;

            var amountText = doc.textFrames.add();
            amountText.contents = amount;
            amountText.position = [x, y];
            y += amountText.height + padding;
        }

        if (y + frameHeight + padding > pageHeight) {
            x += frameWidth + padding;
            y = padding;
        }
    }
}

 

エラー画面

 

 

 

 

 

7 replies

Ethanイーサン
Participant
June 4, 2025

以下、質問内容から推測した手段と目的です。(※あくまで私の推測です。)

定型の .ai テンプレートファイル を使用
※質問に掲載されていたスクリプトは、空のドキュメントに新たにオブジェクトをレイアウトしているようですが、、、

テンプレート内のテキストの差し替え作業
※「流し込み」ではなく、あえて「差し替え」と表現しています。

テンプレート内の画像の差し替え作業

差し替えデータ元は CSV
※多数のデータを Excel 等で管理していると推測。


【推測が正しい場合の対応方針】
※推測が違っていたら以下未読でOKです。

● もし「変数機能」が必要な場合
→ @アザラニアン さんのコメントが非常に参考になりますので、まずはそちらをご確認ください。

● もし「変数機能は不要」で、テンプレート上のテキストや画像をスクリプトで直接差し替えるだけで良い場合
→ 掲載されていたスクリプトは、新規ドキュメント上に新たなオブジェクトを生成・レイアウトする構成(比較的高度な内容)のようですが、
既存の .ai テンプレート上のテキストや画像オブジェクトを差し替える方法のほうがシンプルで実用的かもしれません。

【現時点での懸念点・注意点】
■ 問題点1:CSV構造について(@アザラニアン さんが指摘済み)
CSVデータの構造は、「1つの項目に対して1つのデータ」になるように作成する必要があります。
これは、変数機能を使う場合でもスクリプトで処理する場合でも同様です。
※データテーブル例画像を添付

■ 問題点2:差し替え対象の名前はすべて異なる名称に
.ai テンプレート上でテキストや画像を差し替えるには、それぞれの対象オブジェクトの名前(テキストボックス内のテキストやリンク画像ファイル名)をすべて異なるものにしておくと、スクリプトでの指定が確実でシンプルになります。
※必須ではありませんが、シンプルな対策です。

■ 問題点3(macOS環境を前提とした場合):カンマ付き金額とCSV形式
CSVファイルで金額にカンマ(,)が含まれていると、区切り記号と誤認識されることがあり、特にmacOS環境ではバグの原因になります。
【対応策】
→ タブ区切りのTXT形式の使用をおすすめします。


【もし目的が上記のとおりであれば】
以下のような情報を、macOS環境を前提にご提供できるかもしれません:

・ExcelやTXT(タブ区切り)ファイルの構造サンプル(※今回Excelテーブル画像を添付)
・使用する .ai テンプレートファイルの構造例
・テキストや画像を差し替えるためのスクリプトコード(ExtendScript)

必要であれば、追加質問してください。

【補足】
私が提供できる情報は macOS 環境を前提としています。Windows 環境では動作やファイル処理の挙動が異なる可能性があります。
昨今のAI補助でWindows対応への変更は初級者でもできると想像しています。

 

Translate
Participant
June 5, 2025

丁寧な回答、ありがとうございました。
エクセルの構造サンプル大変参考になりました…!

スクリプトを使わず、変数機能で対応できそうでした。

Translate
アザラニアン
Community Expert
Community Expert
June 2, 2025

コードが書けないので、

Adobe Illustratorの変数機能のみで参考になりそうなことを書きます🙇

 

画像1枚目の「企業1の塊」を変数1行分のデータとして扱い、

企業1のデータ(横1行分)に画像と金額を4つ分含まれる形に…

項目(CSVの画像の一番上の濃い背景色の部分)を6列増やして、

件数の列はID的なものだと思われるので消して、

それを繰り返す形にするのはどうでしょうか…?

 

あと、CSVの作りを

・項目名は半角英数のみ かつ 1文字目は数字以外 に

・画像の項目名は最初に@を付ける

・画像は相対パスじゃなくて絶対パスで指定

…という形に変えるとエラーが減ると思います。

 

スクリプトを利用しない方法ですが、

この動画が参考になるかもしれません。

https://youtu.be/x6EWgtLd4Zg?si=WmfAKayxTdf3UKFL

Translate
Adobe Community Expert アザラニアン
Participant
June 5, 2025

丁寧な回答、ありがとうございました!

とてもわかりやすかったです。添付の動画とCSVの作り方を参考に、なんとかできそうです。

実践してみたのですが、画像部分のみ歯車マークが選択でき無いのですが、これは設定の問題でしょうか?

テキストは問題なく歯車マークが選択できる状態です。

 

Translate
アザラニアン
Community Expert
Community Expert
June 6, 2025

返信遅くなりました🙇‍♀️

追加投稿ありがとうございます!

 

変数機能で画像を設定する時ちょっとした罠がありまして、

「マスクした画像」の「中の画像だけ」を選択した状態にしないと、

ブロック+設定アイコンの方のボタンが押せません😱

 

ダミーの初期画像を何かしらマスクで設定して、

白い方の選択ツールで画像を選び、

画像の変数を設定してみてください🤝

Translate
Adobe Community Expert アザラニアン
Inspiring
June 2, 2025

csvを読み込んで変数によって配置するというイラストレーターの標準機能に引っ張られていて複雑化してしまっていると思われます。

スクリプトで操作するのであれば変数を使わずにオブジェクトに情報を付与するのがシンプルです。

(実際にcsv読み込みで使われているのはイラストレーターの変数機能ではなくJavaScriptのテキストストリームの読み込みです)

レイヤーパネルでダブルクリックすると名称を変更できます。

レイヤー・グループ・パス・テキスト等に名前を付けられますので、任意で名前を設定します。

添付の例で言えば、

[csvの金額列の値を金額テキストに流し込み、画像ファイル名の1件目を画像1に配置、2件目を画像2に配置]といった具合に指示すれば、どこに何を配置するのかが明確になりAIがやってくれると思います。

オブジェクト名を変更出来ない場合は、属性パネルの下にある入力スペースを使えば良いかと思います。(こちらを使う場合はAIにはnoteを参照してくださいと言えば伝わるはずです)

Translate
Ten A
Community Expert
Community Expert
June 2, 2025

まず、どこで何が起こっているのかを完全に把握しないと問題を特定できません。エラー画面と称した画像では何がどう問題になっているのかを明確にできていません。
コードだけ見てみると、問題になりそうな点として、CSVは引用符なしなのか、写真のデータのファイルパスを正しく供給できていない、forループ内で配列から変数に収容しようとしている順番が表示されているCSVと整合性が無いといった点があります。
alert等で各部で収容されている変数の状態を確認したりステップインで動作を見ながらデバッグする必要があるでしょう。
ちなみにChatGPTなどのAIはもっともらしい嘘をつきますので、デバッグするスキルがないと使いこなすのは難しいです。JavaScript(Javaではない)の知識が無いのであればデータ結合の利用をお勧めします。

Translate