終了

イラストレータ起動直後にスクリプトでエラー

New Here ,
Apr 01, 2021 Apr 01, 2021

リンクをクリップボードにコピー

コピー完了

特定のCSVを読み込み、用意したテンプレートの変数を書き換えるプログラムを作成していますが、起動直後にスクリプトを実行すると高い確率でオブジェクトが参照できないエラーが発生します。回避策はあるのでしょうか?

------------------- 太字部分で「オブジェクトが無効です」発生 ---------------

app.open (new File(data[enCsvColumns.TemplatePath].replace(/\"/g,"")));

this.variables = app.activeDocument.variables;
this.textGroups = [];
var ret=false;

for (var i = 0, n = this.variables.length; i < n; i++)
{
if (this.variables[i].pageItems.length>0)
{
 var group = this.variables[i].pageItems[0];
if (group.textFrames.length != 0) {
--- 略 -----
}
else
{
--- 略 -----
}
}
}

 

〇 デザイン製品名とそのバージョン
 Illstrator 2021 25.2.1

〇 OS のバージョン
 Windows10 20H2

キーワード
スクリプティング , バグ , 読み込みと書き出し

表示

1.1K

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Apr 01, 2021 Apr 01, 2021

リンクをクリップボードにコピー

コピー完了

ドキュメントがどの様に構成されているのかが不明なため、はっきりとは言い難いのですが…
variablesの子要素としてのpageItemsはページ要素の変数集合であり、textFrames自体もその一部です。そのため、variablesのpageItemsの子オブジェクトにはtextFrameは存在しません。各pageItemがtextFrameであるかどうかは各オブジェクトのtypenameを参照して判断するしかありませんので総当りでチェックする他ありません。
ついでに、根本的な所でバリアブルの機能についてですが、XMLやCSVデータを読み込むことによって予め変数に対応する各要素の内容を変更できる機能です。適切に構成されたデータを読み込むことによって変数パネルから変数データを選択することにより表示データを切り替え、書き出す事ができます。
このプロセス自体は変数定義されたドキュメントの準備→構造に適合したデータセットの準備→データセットの読み込みという手順を経て変数パネルから表示を切り替えられるようになるものです。これは手動・自動問わず同じ手順であり、基本的に処理途上で変数の子要素に対するアクセスが生じる必要がありません。
もし、そのようなアクセスを考えているのであればバリアブル機能を利用するのは適切ではなく、ストレートにページアイテムに対してアクセスし、処理してしまうほうが単純で処理速度も上がります。
参考…https://ten-artai.com/2015/04/292/

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
New Here ,
Apr 26, 2021 Apr 26, 2021

リンクをクリップボードにコピー

コピー完了

TenA様

 

長文によるご説明ありがとうございます。

私もスクリプト初心者という事もあり、返信いただいた内容の理解を深めたうえで

ご提案の通り、作り含めて見直しを検討したいと思います。

 

<追伸>

2017時代に作られたスクリプトで、誤動作を起こすことがなかったため

作り自体には問題ないかと思っておりましたが、幻でしたね・・・

 

ご協力ありがとうとざいました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Apr 26, 2021 Apr 26, 2021

リンクをクリップボードにコピー

コピー完了

最新
バリアブルを利用する事自体は悪い選択ではないと考えます。その場合、テンプレートを適切に設定し、CSVを調整しておくなど予めデータ準備段階でのチューニングが大切になります。そこさえクリアできればアクションのバッチ処理で各ファイルを簡単に生成することが出来ます。逆に言うとバリアブル自体は基本的にスクリプトを組み合わせる必要が無いワークフローだということです。
分岐条件やテンプレートをレコードによって切り替えたい等の需要がある場合はバリアブル機能を利用せずにスクリプトから全ての処理をやってしまうのが理想となります。
 
例えば、数種類のテンプレートがあって供給されるテキスト内に指定があるようなテキストを基に自動処理する場合
 
肩書\t名字\t名前\tメールアドレス\t1
(\t=タブ)
このような構造の複数行のテキストをソースとし、各テンプレートを用意しておけば、以下の様な構成のスクリプトでサクッとデータを書き出してしまえます。
 
var dir = '~/Desktop/testFolder/';
var tx="";
var baseFile, tgDoc,tgFrame;
var pdfFile,aiFile;
var tmp = [];
var flg = 0;
var f = File.openDialog("Select a text file");
if(f.open('r')){
var fileName = ["base1.ai","base2.ai","base3.ai","base4.ai"];
while(!f.eof){
tx = f.readln().split('\t');
baseFile = new File (f.parent + "/" + fileName[Number(tx[4])]);
tgDoc = open(baseFile);

tgFrame[0].contents = tx[3];
tgFrame[1].contents = tx[0];
tgFrame[2].contents = tx[1];
tgFrame[3].contents = tx[2];

pdfFile = new File(dir + tx[2] + tx[1] + ".pdf");
aiFile = new File(dir + tx[2] + tx[1]  + ".ai");
saveOpts = new PDFSaveOptions();
saveOpts.compatibility= PDFCompatibility.ACROBAT7;
saveOpts.generateThumbnails = true;
saveOpts.preserveEditability = true;
tgDoc.saveAs (pdfFile, saveOpts);
tgDoc.saveAs (aiFile);
tgDoc.close();
}
}
 
テキストを1行ずつ読み込みタブで区切って指定番号のテンプレートを開き各テキストを置き換えてPDF形式とai形式で保存して閉じるをテキスト行分繰り返す。
というスクリプト構成になっています。ドキュメントの構造さえ簡潔に構成すればスクリプト自体も簡潔に書くことが出来ます。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines