getGradientInfo.jsx

/**********************************************************
 
getGradientInfo.jsx
選択したオブジェクトのグラデーション情報を取得し、
アクティブドキュメントと同じフォルダにJSON形式で保存

**********************************************************/

#target illustrator

if (app.documents.length > 0) {
    var doc = app.activeDocument;
    var selection = doc.selection;

    if (doc.fullName) {
        var docPath = doc.fullName.parent.fsName; // ドキュメントのフォルダ取得
        var jsonFile = new File(docPath + "/gradientInfo.json");

        if (selection.length > 0) {
            var obj = selection[0]; // 最初の選択オブジェクトを対象
            if (obj.filled && obj.fillColor.typename === "GradientColor") {
                var gradient = obj.fillColor.gradient;
                var gradientData = {
                    name: gradient.name,
                    type: gradient.type === GradientType.LINEAR ? "LINEAR" : "RADIAL",
                    stops: []
                };

                for (var i = 0; i < gradient.gradientStops.length; i++) {
                    var stop = gradient.gradientStops[i];
                    gradientData.stops.push({
                        rampPoint: stop.rampPoint,
                        midPoint: stop.midPoint,
                        opacity: stop.opacity,
                        color: {
                            red: stop.color.red,
                            green: stop.color.green,
                            blue: stop.color.blue
                        }
                    });
                }

                // JSONの文字列を手動で作成
                var jsonStr = stringifyJSON(gradientData);

                // JSONファイルとして保存
                jsonFile.encoding = "UTF-8";
                jsonFile.open("w");
                jsonFile.write(jsonStr);
                jsonFile.close();

                alert("グラデーション情報を保存しました。\n" + jsonFile.fsName);
            } else {
                alert("選択オブジェクトにグラデーションが適用されていません。");
            }
        } else {
            alert("オブジェクトが選択されていません。");
        }
    } else {
        alert("このドキュメントは保存されていません。先に保存してください。");
    }
} else {
    alert("ドキュメントを開いてください。");
}

/**********************************************************
 
 JSONオブジェクトの代替 stringify 関数(Illustrator ExtendScript用)

**********************************************************/
function stringifyJSON(obj) {
    if (typeof obj !== "object" || obj === null) {
        return '"' + obj + '"';
    }

    var json = [];
    var isArray = obj.constructor === Array; // Array.isArray の代替

    for (var key in obj) {
        if (!obj.hasOwnProperty(key)) continue;
        var value = obj[key];
        var formattedValue = (typeof value === "object" && value !== null) ? stringifyJSON(value) : '"' + value + '"';
        json.push(isArray ? formattedValue : '"' + key + '":' + formattedValue);
    }
    return (isArray ? "[" : "{") + json.join(",") + (isArray ? "]" : "}");
}

setGradientInfo.jsx

/**********************************************************
 
setGradientInfo.jsx
アクティブドキュメントのフォルダから JSON を読み込み、
新規スウォッチとして追加するスクリプト

**********************************************************/

#target illustrator

if (app.documents.length > 0) {
    var doc = app.activeDocument;

    if (doc.fullName) {
        var docPath = doc.fullName.parent.fsName; // ドキュメントのフォルダ取得
        var jsonFile = new File(docPath + "/gradientInfo.json");

        if (jsonFile.exists) {
            jsonFile.open("r");
            var jsonStr = jsonFile.read();
            jsonFile.close();

            var gradientData = parseJSON(jsonStr);

            // 新規グラデーション作成
            var newGradient = doc.gradients.add();
            newGradient.type = gradientData.type === "LINEAR" ? GradientType.LINEAR : GradientType.RADIAL;

            // 既存のストップを取得(Illustratorはデフォルトで2つのストップを持つ)
            var stopCount = newGradient.gradientStops.length;

            for (var i = 0; i < gradientData.stops.length; i++) {
                var stop;
                
                if (i < stopCount) {
                    // 既存のストップを利用
                    stop = newGradient.gradientStops[i];
                } else {
                    // 追加のストップを作成
                    stop = newGradient.gradientStops.add();
                }

                // JSON からストップ情報を設定
                stop.rampPoint = gradientData.stops[i].rampPoint;
                stop.midPoint = gradientData.stops[i].midPoint;
                stop.opacity = gradientData.stops[i].opacity;

                var color = new RGBColor();
                color.red = gradientData.stops[i].color.red;
                color.green = gradientData.stops[i].color.green;
                color.blue = gradientData.stops[i].color.blue;
                stop.color = color;
            }

            alert("新しいグラデーションがスウォッチに追加されました。");
        } else {
            alert("gradientInfo.json が見つかりません。\n先に getGradientInfo.jsx を実行してください。");
        }
    } else {
        alert("このドキュメントは保存されていません。先に保存してください。");
    }
} else {
    alert("ドキュメントを開いてください。");
}

/**********************************************************
 
 JSONオブジェクトの代替 parse 関数(Illustrator ExtendScript用)

**********************************************************/
function parseJSON(jsonString) {
    try {
        return eval("(" + jsonString + ")");
    } catch (e) {
        alert("JSONの解析に失敗しました。\n" + e);
        return null;
    }
}

JSON

{
    "name": "名称未設定グラデーション 20",
    "type": "LINEAR",
    "stops": [
        {
            "rampPoint": "0",
            "midPoint": "50",
            "opacity": "100",
            "color": {
                "red": "255",
                "green": "120",
                "blue": "100"
            }
        },
        {
            "rampPoint": "33",
            "midPoint": "85.9147098345072",
            "opacity": "100",
            "color": {
                "red": "100",
                "green": "100",
                "blue": "255"
            }
        },
        {
            "rampPoint": "66",
            "midPoint": "17.7047336436106",
            "opacity": "100",
            "color": {
                "red": "100",
                "green": "255",
                "blue": "100"
            }
        },
        {
            "rampPoint": "100",
            "midPoint": "50",
            "opacity": "100",
            "color": {
                "red": "255",
                "green": "200",
                "blue": "0"
            }
        }
    ]
}