var filePath = File.openDialog("テキストファイルを選択してください");

    if (!filePath) {
        alert("ファイルが選択されていません。");
        return;
    }

    if (!filePath.open("r")) {
        alert("ファイルを開けませんでした。");
        return;
    }

setGradientCsv.jsx

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

setGradientInfo.jsx
CSVファイルを読み込み、Illustratorのスウォッチに複数のグラデーションを一括登録するスクリプト。
ストップの順序と `rampPoint` のズレを防ぎ、適切に適用するように修正。

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

#target illustrator

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

    if (doc.fullName) {
        //var docPath = doc.fullName.parent.fsName;
        //var csvFile = new File(docPath + "/gradientInfo.csv");
        
        var csvFile = File.openDialog("テキストファイルを選択してください");
        
		    if (!csvFile) {
		        alert("ファイルが選択されていません。");
		        return;
		    }

        if (csvFile.exists) {
            csvFile.open("r");
            var csvContent = csvFile.read();
            csvFile.close();

            var gradientsData = parseCSV(csvContent);

            if (gradientsData.length === 0) {
                alert("CSV に有効なグラデーションデータがありません。");
                exit();
            }

            // ** グラデーションごとに処理 **
            for (var g = 0; g < gradientsData.length; g++) {
                var gradientInfo = gradientsData[g];

                // ** `rampPoint` の昇順ソート(重要)**
                gradientInfo.stops.sort(function(a, b) {
                    return a.rampPoint - b.rampPoint;
                });

                // ** グラデーション作成(名前設定なし)**
                var newGradient = createGradient();

                // ** ストップ数をチェックし、足りない場合は追加 **
                while (newGradient.gradientStops.length < gradientInfo.stops.length) {
                    newGradient.gradientStops.add();
                }

                // ** ストップを適用(順番を保つ)**
                for (var i = 0; i < gradientInfo.stops.length; i++) {
                    var stop = newGradient.gradientStops[i];
                    var stopData = gradientInfo.stops[i];

                    stop.rampPoint = stopData.rampPoint;
                    stop.midPoint = stopData.midPoint;
                    stop.opacity = stopData.opacity;

                    var colorRGB = hexToRGB(stopData.color);
                    var newColor = new RGBColor();
                    newColor.red = colorRGB.red;
                    newColor.green = colorRGB.green;
                    newColor.blue = colorRGB.blue;

                    stop.color = newColor;
                }
            }

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

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

 グラデーションを作成する関数(名前は設定しない)

**********************************************************/
function createGradient() {
    var theGradient = app.activeDocument.gradients.add();
    theGradient.type = GradientType.LINEAR; // リニアグラデーション
    return theGradient;
}

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

 CSVをパースして複数のグラデーションを処理する関数

**********************************************************/
function parseCSV(csvString) {
    var lines = csvString.split("\n");
    var gradients = {};
    var gradientList = [];

    for (var i = 1; i < lines.length; i++) {
        var values = lines[i].split(",");
        if (values.length === 5) {
            var gName = trimString(values[0]);
            var stopData = {
                rampPoint: parseFloat(values[1]),
                midPoint: parseFloat(values[2]),
                opacity: parseFloat(values[3]),
                color: trimString(values[4])
            };

            if (!gradients[gName]) {
                gradients[gName] = { name: gName, stops: [] };
                gradientList.push(gradients[gName]);
            }
            gradients[gName].stops.push(stopData);
        }
    }

    return gradientList;
}

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

 文字列の前後の空白を削除する関数

**********************************************************/
function trimString(str) {
    return str.replace(/^\s+|\s+$/g, "");
}

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

 Hexカラーコードを RGB に変換する関数

**********************************************************/
function hexToRGB(hex) {
    hex = hex.replace("#", "");
    return {
        red: parseInt(hex.substring(0, 2), 16),
        green: parseInt(hex.substring(2, 4), 16),
        blue: parseInt(hex.substring(4, 6), 16)
    };
}

CSVフォーマット

gradientInfo.csv

gradientName,rampPoint,midPoint,opacity,color
gradientName_01,0,50,100,#d457c3
gradientName_01,20,50,100,#6ee089
gradientName_01,40,50,100,#99ff2a
gradientName_01,70,50,100,#ff5d15
gradientName_01,100,50,100,#f33fff
gradientName_02,0,50,100,#ffff00
gradientName_02,100,50,100,#000000
gradientName_03,0,50,100,#ff0000
gradientName_03,100,50,100,#0000ff

sample

gradientName,rampPoint,midPoint,opacity,color
silver01,0,50,100,#E0E0E0
silver01,20,50,100,#B0B0B0
silver01,40,50,100,#707070
silver01,60,50,100,#D4D4D4
silver01,80,50,100,#A0A0A0
silver01,100,50,100,#F0F0F0
gold01,0,50,100,#FFD700
gold01,25,50,100,#D4AF37
gold01,50,50,100,#8B7500
gold01,75,50,100,#FFD700
gold01,100,50,100,#FFF8DC
chromium01,0,50,100,#D0D0D0
chromium01,25,50,100,#505050
chromium01,50,50,100,#FFFFFF
chromium01,75,50,100,#606060
chromium01,100,50,100,#E0E0E0
aurora01,0,50,100,#C6E2FF
aurora01,25,50,100,#FFC0CB
aurora01,50,50,100,#FFFFFF
aurora01,75,50,100,#FFD700
aurora01,100,50,100,#C6E2FF