Skip to main content
Known Participant
September 30, 2019
Answered

インデザインスクリプトのグラデーションスウォッチの処理について

  • September 30, 2019
  • 3 replies
  • 1324 views

インデザインスクリプトを勉強中の初心者です。

 

未使用のスウォッチを削除するスクリプトを作っているのですが、

var objDoc= app.activeDocument;

var swhObj= objDoc.unusedSwatches;

for( var i=0; i<swhObj.length; i++){ swhObj[i].remove(); }

で書いたところ、グラデーションに使われているカラーが削除され、黒くなってしまう現象が起きてしまいます。スウォッチから指定したもの、指定していないものに関わらずです。

 

スウォッチ設定のグラデーションオプションなどで定義出来れば回避出来る気がするのですが、、

どなたか解決策ご存知のかたいらっしゃいましたらご回答よろしくお願いいたします。

 

 

This topic has been closed for replies.
Correct answer mars517

あまりよく分かってないのですが
グラデーションストップの色も削除対象になっているのが問題のようですね。

 

グラデーションストップはnameが空のようなので
以下のようにしたら除外できました。

 

//使用中のグラデーションスウォッチのみを残す
var objDoc= app.activeDocument;
var swhObj= objDoc.unusedSwatches;
for( var i=0; i<swhObj.length; i++){
var a = swhObj[i].name;
if( swhObj[i].name != "" ){ swhObj[i].remove(); } //nameがあるものを削除
}

 

ただ、上記では使用していないグラデーションスウォッチは削除されてしまいます。
下記ではgradientStopsを持つスウォッチ(すなわちグラデーションスウォッチ)を

削除対象外にしています。


もっとスマートな方法がありそうに思うのですが、
とりあえず試してみたので投稿しておきます。

 

//使用していないグラデーションスウォッチも残す
var objDoc= app.activeDocument;
var swhObj= objDoc.unusedSwatches;
for( var i=0; i<swhObj.length; i++){
try{swhObj[i].gradientStops //gradientStopsがあるものを除外
}catch(e){
var a = swhObj[i].name;
if( swhObj[i].name!=""){ swhObj[i].remove(); } //nameがあるものを削除
}
}

3 replies

Ten A
Community Expert
Community Expert
October 1, 2019

参考に関する言及を忘れていました。


現在公式のリファレンスはAdobe I/Oに一元化されています。Adobe IDによるログインが必要ですが、以下のURLにアクセスして各アプリケーションをクリックすると各種ツールや情報にアクセスできます。
https://www.adobe.io/apis.html

 

また、日本語で書かれたオブジェクトモデル関連の情報では当コミュニティのMVPでもある、おーまちさんのページが使いやすいと思います。
http://indesign.cs5.xyz/dom/about.html

 

mars517さん、実際の運用ではmars517さんのスクリプトの方が取り回しが良いケースもあると思います。細かい条件に対して各プロパティを見ながら絞り込むことは基本中の基本ですね。


最後に、Adobe Support Communityは現在過渡期であり決して使い勝手の良い状態ではありませんが、小さなことでも構いませんのでどんどんご参加いただき盛り上げていただけたらと思います。

Known Participant
October 1, 2019
本当にご丁寧にありがとうございます。URL参考にさせていただきます。ただ残念なことにここに書いてあることがパッと見た感じ良くわからないです笑 勉強します!またつまずいたらご質問させていただきます。
Ten A
Community Expert
Community Expert
October 1, 2019

まず、mars517さんの回答が正しいかと思います。
GradientStopに対して設定されているSwatchオブジェクトが削除された為に[黒]にフォールバックされているのが原因です。
InDesignにおけるSwatchのトリッキーな挙動が絡むので、これについて補足しておきます。
スウォッチパネルに表示されているのは登録されているスウォッチのみです。これはスクリプトから見る場合Swatchesコレクションとして参照可能なものです。一方ドキュメント直下のUnusedSwatchesコレクションはスウォッチパネルに表示されているもの以外のものが含まれます。InDesignでは内部的にこのUnusedSwatchesコレクションを利用していて、カラーパネルでスライダーを操作したり数値を打ち替える度にこのコレクションにオブジェクトが追加されます。グラデーションストップをカラースライダーで設定したりするとこのUnusedSwatchesのカラーが当てられる事になります。また、このUnusedSwatchesをremoveメソッドを利用して削除してもオブジェクトの内容は削除されますが、空のオブジェクトが残ります。
この様に見ているものが同一ではありませんのでスウォッチパネルの項目の操作を目的とする場合は注意が必要です。

以上を勘案して、以下のように各コレクションの共通するものを選択的に削除する方法が妥当かと思います。

var tg = app.activeDocument.unusedSwatches;
for (var i=0;i<tg.length;i++) 
if (tg[i].name!="") app.activeDocument.swatches.itemByName(tg[i].name).remove();

 

 

Known Participant
October 1, 2019
とても詳しくわかり易いご説明ありがとうございました。UnusedSwatchesコレクションはスウォッチパネルに登録されていないものも含まれるとは知りませんでした。大変勉強になりました。また何かありましたらよろしくお願いいたします。
mars517
Participating Frequently
October 1, 2019

勉強になりました。Ten Aさん、ありがとうございます。
英樹岩68585830さん、いい機会をありがとうございました。

mars517
mars517Correct answer
Participating Frequently
September 30, 2019

あまりよく分かってないのですが
グラデーションストップの色も削除対象になっているのが問題のようですね。

 

グラデーションストップはnameが空のようなので
以下のようにしたら除外できました。

 

//使用中のグラデーションスウォッチのみを残す
var objDoc= app.activeDocument;
var swhObj= objDoc.unusedSwatches;
for( var i=0; i<swhObj.length; i++){
var a = swhObj[i].name;
if( swhObj[i].name != "" ){ swhObj[i].remove(); } //nameがあるものを削除
}

 

ただ、上記では使用していないグラデーションスウォッチは削除されてしまいます。
下記ではgradientStopsを持つスウォッチ(すなわちグラデーションスウォッチ)を

削除対象外にしています。


もっとスマートな方法がありそうに思うのですが、
とりあえず試してみたので投稿しておきます。

 

//使用していないグラデーションスウォッチも残す
var objDoc= app.activeDocument;
var swhObj= objDoc.unusedSwatches;
for( var i=0; i<swhObj.length; i++){
try{swhObj[i].gradientStops //gradientStopsがあるものを除外
}catch(e){
var a = swhObj[i].name;
if( swhObj[i].name!=""){ swhObj[i].remove(); } //nameがあるものを削除
}
}

Known Participant
October 1, 2019
ありがとうございます。無事解決いたしました。gradinetStopsがあるのを初めて知りました。 とてもスマートで分かり易いです。何か参考にされてるサイトなどありますか?