Skip to main content
Inspiring
August 20, 2026
Answered

スクリプトで消したスウォッチが復活する

  • August 20, 2026
  • 7 replies
  • 57 views

M1 / OS13.7.8 / AI 2024

スクリプトで特定のスウォッチを削除したいのですが、

保存すると一番最後に削除したスウォッチが復活してしまいます。

スクリプトで保存した場合も、削除されたのを確認してから手動で保存しても、

次に開くと最後の1つが復活してしまいます。

何か対処法はありますか?

 

function removeSwatch(ary) {
        for (var s = 0; s < ary.length; s++) {
            var cswName= ary[s].name;
            for (var i = sws.length - 1; i >= 0; i--) {
                if (sws[i].name == cswName) {
                    sws[i].remove();
                    $.sleep(10);
                    app.redraw();
                    $.gc();
                }
            }
        }
}

doc.close(SaveOptions.SAVECHANGES);


[Illustratorフォーラムへ移動しました:モデレーター]

    Correct answer ajabon grinsmith

    削除したいスウォッチ群に共通する正規表現を用意しておき、
    名前がマッチしたスウォッチを配列に入れる、

    // 配列のスウォッチぜんぶ黒に(未実行)

    削除用スウォッチ配列をループ
    ドキュメントのスウォッチもループ、
    名前が一緒ならスウォッチを削除

     

    スウォッチの構成カラーを黒にする関数
    K100のカラーオブジェクトを定義、
    削除用スウォッチ配列をループ、
    もしスウォッチがあれば(?) ←ないことってあるんでしょうか
       もしスウォッチがスポットカラー(グローバルカラー)なら
          スポットカラーの構成カラーをK100に
       ちがったら
          スウォッチの構成カラーをK100に
       もし スウォッチがスポットカラーでプロセスカラーなら
           スウォッチの構成カラーをスウォッチのスポットカラーの構成カラーに

     

    というかんじですね。
    削除のとこは単純に

    function removeSwatch(ary) {
    for (var i = ary.length - 1; i >= 0; i--) {
    ary[i].remove();
    }
    }

    ではだめなんですかね。まあおいといて、

    おそらく setBlack() のあとスポットカラー(グローバルカラー)が適用されたオブジェクトが残っているせいです。

    グローバルカラーは、スウォッチパネルに登録されている必要がありまして。
    スウォッチを削除しちゃえば一旦なくなるんですが、ドキュメント上のオブジェクトにそのグローバルカラーが使用されている場合、削除してはいけない物として自浄作用というか、まあ復活させられます。
    対して、手でスウォッチを削除した場合、実際やってみるとわかりますが、そのスウォッチが適用されたオブジェクトをみると、グローバルじゃないカラーに自動で変換されているはずです。
     

    setBlack(cSwatches);

    をスキップした場合がこれにあたります。

    結論として、setBlack() の中の

        if (swatch) {
    if (swatch.color.typename === "SpotColor") {
    swatch.color.spot.color = theCol;

    がとてもあやしいです。
    削除するスウォッチはすべて非グローバルカラーに変換してから削除するように直してみてください。
    スポットカラーか否かの分岐などせず、

    function setBlack(ary) {
    var theCol = new CMYKColor();
    theCol.cyan = 0;
    theCol.magenta = 0;
    theCol.yellow = 0;
    theCol.black = 100;

    for (var i = 0; i < ary.length; i++) {
    swatch.color = theCol;
    }
    }

    でいけるんじゃないかなあと想像してます。試していませんすみません。
     

    7 replies

    ajabon grinsmith
    Community Expert
    Community Expert
    August 20, 2026

    いろいろと大事な情報がはしょられてる印象です。

    引数 ary は[削除したいスウォッチの配列]ですね。これはどうやって集めるのですか?

    グローバル変数 sws は削除したいスウォッチオブジェクトの配列ですね。これは単純にdoc.swatchesとは違うものですか? だとすればどういうものですか?


    それがわからないと、swsの要素をループでおけつから処理していることに意味があるかどうかも評価しづらいですし、関数をもとに手元で検証するにも同様の現象が確認できるのか、あやしくなりますねえ。

    SGT0001Author
    Inspiring
    August 20, 2026

    いつもお世話になります。

    さらに検証した結果、削除前に一旦色を黒に変更しているのですがその工程を省くと大丈夫みたいです。

     

    var doc = app.activeDocument;

    var regList = ["^myColor"];

    var sws = doc.swatches;

    var cSwatches = (function () {

    var ary = [];

    for (var i = 0; i < sws.length; i++) {

    var sw = sws[i];

    var nm = sw.name;

    try {

    for (var r = 0; r < regList.length; r++) {

    var reg = RegExp(regList[r]);

    if (nm.match(reg)) {

    ary.push(sw);

    }

    }

    } catch (e) { }

    }

    return ary;

    })();

    // setBlack(cSwatches);

    removeSwatch(cSwatches);

    function removeSwatch(ary) {

    for (var s = 0; s < ary.length; s++) {

    var cswName = ary[s].name;

    for (var i = sws.length - 1; i >= 0; i--) {

    if (sws[i].name == cswName) {

    sws[i].remove();

    }

    }

    }

    }

    function setBlack(ary) {

    var theCol = new CMYKColor();

    theCol.cyan = 0;

    theCol.magenta = 0;

    theCol.yellow = 0;

    theCol.black = 100;

     

    for (var i = 0; i < ary.length; i++) {

    var swatch = ary[i];

     

    if (swatch) {

    if (swatch.color.typename === "SpotColor") {

    swatch.color.spot.color = theCol;

    } else {

    swatch.color = theCol;

    }

    if ((swatch.color.constructor.name == 'SpotColor') && (swatch.color.spot.colorType == ColorModel.PROCESS)) {

    actualColor = swatch.color.spot.color;

    swatch.color = actualColor;

    }

    } else {

    }

    }

    }

    ajabon grinsmith
    Community Expert
    ajabon grinsmithCommunity ExpertCorrect answer
    Community Expert
    August 20, 2026

    削除したいスウォッチ群に共通する正規表現を用意しておき、
    名前がマッチしたスウォッチを配列に入れる、

    // 配列のスウォッチぜんぶ黒に(未実行)

    削除用スウォッチ配列をループ
    ドキュメントのスウォッチもループ、
    名前が一緒ならスウォッチを削除

     

    スウォッチの構成カラーを黒にする関数
    K100のカラーオブジェクトを定義、
    削除用スウォッチ配列をループ、
    もしスウォッチがあれば(?) ←ないことってあるんでしょうか
       もしスウォッチがスポットカラー(グローバルカラー)なら
          スポットカラーの構成カラーをK100に
       ちがったら
          スウォッチの構成カラーをK100に
       もし スウォッチがスポットカラーでプロセスカラーなら
           スウォッチの構成カラーをスウォッチのスポットカラーの構成カラーに

     

    というかんじですね。
    削除のとこは単純に

    function removeSwatch(ary) {
    for (var i = ary.length - 1; i >= 0; i--) {
    ary[i].remove();
    }
    }

    ではだめなんですかね。まあおいといて、

    おそらく setBlack() のあとスポットカラー(グローバルカラー)が適用されたオブジェクトが残っているせいです。

    グローバルカラーは、スウォッチパネルに登録されている必要がありまして。
    スウォッチを削除しちゃえば一旦なくなるんですが、ドキュメント上のオブジェクトにそのグローバルカラーが使用されている場合、削除してはいけない物として自浄作用というか、まあ復活させられます。
    対して、手でスウォッチを削除した場合、実際やってみるとわかりますが、そのスウォッチが適用されたオブジェクトをみると、グローバルじゃないカラーに自動で変換されているはずです。
     

    setBlack(cSwatches);

    をスキップした場合がこれにあたります。

    結論として、setBlack() の中の

        if (swatch) {
    if (swatch.color.typename === "SpotColor") {
    swatch.color.spot.color = theCol;

    がとてもあやしいです。
    削除するスウォッチはすべて非グローバルカラーに変換してから削除するように直してみてください。
    スポットカラーか否かの分岐などせず、

    function setBlack(ary) {
    var theCol = new CMYKColor();
    theCol.cyan = 0;
    theCol.magenta = 0;
    theCol.yellow = 0;
    theCol.black = 100;

    for (var i = 0; i < ary.length; i++) {
    swatch.color = theCol;
    }
    }

    でいけるんじゃないかなあと想像してます。試していませんすみません。
     

    SGT0001Author
    Inspiring
    August 20, 2026

    スクリプトでスウォッチを削除した場合は割り当てしたオブジェクトにスウォッチ情報が残ったままになっていました。

    手動で削除した場合は割り当て色が変更になっています。

    SGT0001Author
    Inspiring
    August 20, 2026

    さらに検証してみたところ、復活するスウォッチはオブジェクトに色を割り当てているスウォッチでした。割り当てていない方のスウォッチは大丈夫(復活しない)様です。

    手動でスウォッチを削除した場合は割り当てていても消える(復活しない)のですが。