Created
April 22, 2026 01:45
-
-
Save monokano/dba08601671cd2150ddca673fe2fab68 to your computer and use it in GitHub Desktop.
アートボード名を編集するIllustratorスクリプト
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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(); | |
| })(); |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
編集ウィンドウ

連番設定ウィンドウ
