Skip to content

Instantly share code, notes, and snippets.

@monokano
Created April 22, 2026 01:45
Show Gist options
  • Select an option

  • Save monokano/dba08601671cd2150ddca673fe2fab68 to your computer and use it in GitHub Desktop.

Select an option

Save monokano/dba08601671cd2150ddca673fe2fab68 to your computer and use it in GitHub Desktop.
アートボード名を編集するIllustratorスクリプト
// ArtboardNameEditor.jsx
// 全アートボード名を表示し、編集後に適用ボタンで更新する
// 検索置換(正規表現対応)・連番挿入機能付き
(function () {
var doc = app.activeDocument;
var artboards = doc.artboards;
var count = artboards.length;
if (count === 0) {
alert("アートボードが見つかりません。");
return;
}
// 現在のアートボード名を改行区切りで結合
var names = [];
for (var i = 0; i < count; i++) {
names.push(artboards[i].name);
}
// ----------------------------------------------------------------
// メインダイアログ
// ----------------------------------------------------------------
var dlg = new Window("dialog", "アートボード名の編集");
dlg.orientation = "column";
dlg.alignChildren = ["fill", "top"];
dlg.spacing = 8;
dlg.margins = 16;
// ラベル
dlg.add("statictext", undefined,
"アートボード名(" + count + "個)");
// テキストエリア
var ta = dlg.add("edittext", undefined, names.join("\n"),
{ multiline: true, scrolling: true });
ta.preferredSize = [360, 200];
// ----------------------------------------------------------------
// 検索置換パネル(インライン)
// ----------------------------------------------------------------
var srPanel = dlg.add("panel", undefined, "検索置換");
srPanel.orientation = "column";
srPanel.alignChildren = ["fill", "top"];
srPanel.spacing = 6;
srPanel.margins = [10, 14, 10, 10];
// 検索フィールド行
var findGroup = srPanel.add("group");
findGroup.orientation = "row";
findGroup.alignChildren = ["left", "center"];
findGroup.add("statictext", undefined, "検索:");
var findFld = findGroup.add("edittext", undefined, "");
findFld.alignment = ["fill", "center"];
// 置換フィールド行
var repGroup = srPanel.add("group");
repGroup.orientation = "row";
repGroup.alignChildren = ["left", "center"];
repGroup.add("statictext", undefined, "置換:");
var repFld = repGroup.add("edittext", undefined, "");
repFld.alignment = ["fill", "center"];
// オプション+ステータス行
var optGroup = srPanel.add("group");
optGroup.orientation = "row";
optGroup.alignChildren = ["left", "center"];
optGroup.spacing = 10;
var reChk = optGroup.add("checkbox", undefined, "正規表現");
var caseChk = optGroup.add("checkbox", undefined, "大文字小文字を区別");
var statusText = optGroup.add("statictext", undefined, "");
statusText.preferredSize = [120, 18];
// 検索置換ボタン行
var srBtnGroup = srPanel.add("group");
srBtnGroup.orientation = "row";
srBtnGroup.alignment = ["right", "top"];
var reloadBtn = srBtnGroup.add("button", undefined, "再読込");
var seqBtn = srBtnGroup.add("button", undefined, "連番...");
var replaceAllBtn = srBtnGroup.add("button", undefined, "全て置換");
// ----------------------------------------------------------------
// 下部ボタン行
// ----------------------------------------------------------------
var btnGroup = dlg.add("group");
btnGroup.orientation = "row";
btnGroup.alignment = "right";
var cancelBtn = btnGroup.add("button", undefined, "キャンセル", { name: "cancel" });
var okBtn = btnGroup.add("button", undefined, "適用", { name: "ok" });
// ----------------------------------------------------------------
// 検索置換ロジック
// ----------------------------------------------------------------
function getLines() {
var text = ta.text.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\n+$/, "");
return text === "" ? [] : text.split("\n");
}
replaceAllBtn.onClick = function () {
var pattern = findFld.text;
if (pattern === "") return;
var rep = repFld.text;
var newText;
if (reChk.value) {
var flags = "gm" + (caseChk.value ? "" : "i");
try { newText = ta.text.replace(new RegExp(pattern, flags), rep); }
catch (e) { statusText.text = "正規表現エラー"; return; }
} else {
var flags2 = "gm" + (caseChk.value ? "" : "i");
var escaped = pattern.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
newText = ta.text.replace(new RegExp(escaped, flags2), rep);
}
ta.text = newText;
statusText.text = "置換完了";
};
// ----------------------------------------------------------------
// 連番ダイアログ
// ----------------------------------------------------------------
seqBtn.onClick = function () {
var seqDlg = new Window("dialog", "連番を挿入");
seqDlg.orientation = "column";
seqDlg.alignChildren = ["fill", "top"];
seqDlg.spacing = 10;
seqDlg.margins = 16;
// 番号のみ
var onlyGroup = seqDlg.add("group");
onlyGroup.orientation = "row";
onlyGroup.alignChildren = ["left", "center"];
var onlyChk = onlyGroup.add("checkbox", undefined, "番号のみ(既存の名前を置き換え)");
// 開始番号
var startGroup = seqDlg.add("group");
startGroup.orientation = "row";
startGroup.alignChildren = ["left", "center"];
startGroup.add("statictext", undefined, "開始番号:");
var startFld = startGroup.add("edittext", undefined, "1");
startFld.preferredSize = [60, 22];
// 増分
var stepGroup = seqDlg.add("group");
stepGroup.orientation = "row";
stepGroup.alignChildren = ["left", "center"];
stepGroup.add("statictext", undefined, "増分:");
var stepFld = stepGroup.add("edittext", undefined, "1");
stepFld.preferredSize = [60, 22];
// 桁数
var digitGroup = seqDlg.add("group");
digitGroup.orientation = "row";
digitGroup.alignChildren = ["left", "center"];
digitGroup.add("statictext", undefined, "桁数:");
var autoChk = digitGroup.add("checkbox", undefined, "自動");
autoChk.value = true;
var digitFld = digitGroup.add("edittext", undefined, "2");
digitFld.preferredSize = [40, 22];
digitFld.enabled = false;
// 区切り文字
var sepGroup = seqDlg.add("group");
sepGroup.orientation = "row";
sepGroup.alignChildren = ["left", "center"];
sepGroup.add("statictext", undefined, "区切り文字:");
var sepFld = sepGroup.add("edittext", undefined, "_");
sepFld.preferredSize = [60, 22];
// 位置
var posGroup = seqDlg.add("panel", undefined, "番号の位置");
posGroup.orientation = "row";
posGroup.alignChildren = ["left", "center"];
posGroup.margins = [10, 14, 10, 10];
var prefixRad = posGroup.add("radiobutton", undefined, "前に付ける");
var suffixRad = posGroup.add("radiobutton", undefined, "後ろに付ける");
prefixRad.value = true;
// プレビュー
var previewPanel = seqDlg.add("panel", undefined, "プレビュー(先頭3行)");
previewPanel.orientation = "column";
previewPanel.alignChildren = ["left", "top"];
previewPanel.margins = [10, 14, 10, 10];
var previewText = previewPanel.add("statictext", undefined, "", { multiline: true });
previewText.preferredSize = [360, 56];
// ボタン
var seqBtnGroup = seqDlg.add("group");
seqBtnGroup.orientation = "row";
seqBtnGroup.alignment = "right";
var applBtn = seqBtnGroup.add("button", undefined, "適用");
var closeBtn = seqBtnGroup.add("button", undefined, "閉じる");
// -- ヘルパー --
function zeroPad(n, digits) {
var s = String(n);
while (s.length < digits) s = "0" + s;
return s;
}
function calcDigits(start, step, lineCount) {
var last = start + step * (lineCount - 1);
return String(Math.abs(last)).length;
}
function updateOnlyMode() {
var isOnly = onlyChk.value;
sepFld.enabled = !isOnly;
prefixRad.enabled = !isOnly;
suffixRad.enabled = !isOnly;
}
function buildPreview() {
var start = parseInt(startFld.text, 10);
var step = parseInt(stepFld.text, 10);
if (isNaN(start) || isNaN(step)) {
previewText.text = "(数値を入力してください)"; return;
}
var lines = getLines();
var digits = autoChk.value
? calcDigits(start, step, lines.length)
: parseInt(digitFld.text, 10) || 1;
var sep = sepFld.text;
var preview = [];
var limit = Math.min(3, lines.length);
for (var i = 0; i < limit; i++) {
var num = zeroPad(start + step * i, digits);
if (onlyChk.value) {
preview.push(num);
} else {
preview.push(prefixRad.value ? num + sep + lines[i] : lines[i] + sep + num);
}
}
if (lines.length > 3) preview.push("…");
previewText.text = preview.join("\n");
}
startFld.onChanging = buildPreview;
stepFld.onChanging = buildPreview;
digitFld.onChanging = buildPreview;
sepFld.onChanging = buildPreview;
prefixRad.onClick = buildPreview;
suffixRad.onClick = buildPreview;
autoChk.onClick = function () {
digitFld.enabled = !autoChk.value;
buildPreview();
};
onlyChk.onClick = function () {
updateOnlyMode();
buildPreview();
};
applBtn.onClick = function () {
var start = parseInt(startFld.text, 10);
var step = parseInt(stepFld.text, 10);
if (isNaN(start) || isNaN(step)) {
alert("開始番号・増分は整数で入力してください。"); return;
}
var lines = getLines();
var digits = autoChk.value
? calcDigits(start, step, lines.length)
: parseInt(digitFld.text, 10) || 1;
var sep = sepFld.text;
var result = [];
for (var i = 0; i < lines.length; i++) {
var num = zeroPad(start + step * i, digits);
if (onlyChk.value) {
result.push(num);
} else {
result.push(prefixRad.value ? num + sep + lines[i] : lines[i] + sep + num);
}
}
ta.text = result.join("\n");
seqDlg.close();
};
closeBtn.onClick = function () { seqDlg.close(); };
buildPreview();
seqDlg.show();
};
// ----------------------------------------------------------------
// 再読込 / OK / キャンセル
// ----------------------------------------------------------------
reloadBtn.onClick = function () {
if (confirm("テキストエリアの内容を元のアートボード名に戻しますか?")) {
ta.text = names.join("\n");
statusText.text = "";
}
};
cancelBtn.onClick = function () { dlg.close(0); };
okBtn.onClick = function () {
var lines = getLines();
if (lines.length !== count) {
var msg = "行数が一致しません。\n"
+ "アートボード数: " + count + "\n"
+ "入力行数: " + lines.length + "\n\n"
+ "このまま適用しますか?\n"
+ "(行数が少ない場合、残りのアートボード名は変更されません)";
if (!confirm(msg)) return;
}
var limit = Math.min(lines.length, count);
for (var i = 0; i < limit; i++) {
var newName = lines[i].replace(/^\s+|\s+$/g, "");
if (newName.length > 0) {
artboards[i].name = newName;
}
}
dlg.close(1);
};
dlg.show();
})();
@monokano

Copy link
Copy Markdown
Author

編集ウィンドウ
スクリーンショット 2026-04-22 10 46 42

連番設定ウィンドウ
スクリーンショット 2026-04-22 10 47 42

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment