
Illustratorを使っているとき、いつの間にかオブジェクトやグループに不要な名前がたくさんついてしまい、レイヤーパネルがごちゃごちゃして困った経験はありませんか。
いや、普通ないかもしれませんが……私は結構あります。Inkscapeというソフトで描いたものをillustratorに持ってくるときがあるのですが、Inkscapeだと全レイヤーに自動で名前がつくんです。path1、path2、g1、g2など……。
まず、illustratorの通常きれいな状態を見てみましょう。<>で囲まれたレイヤーは名前がついていないレイヤーです。レイヤー1は自動で名前がついていますが、他の各レイヤー(正しくはサブレイヤーですが)には名前がついておらず、どんなオブジェクトなのかが表示されています。誤って複合パスになっちゃったときは<複合パス>と表示してくれて、修正すると<パス>に戻してくれます。地味にありがたい。

そんで、これをInkscapeからもってきた直後の状態がこれ。

あまりに邪魔です。ここからバラバラにグループ分けしたりillustratorで編集して名前なしレイヤーが増えたり表示順も変えたりして更にごっちゃんごっちゃんに……。これで依頼元に提出とかできないよ
しかしこれを直そうとすると、全レイヤーをひとつずつダブルクリック→名前削除→ダブルクリック→名前削除……と修正していくことになり、100レイヤーとかあったらもう途中で倒れ伏してしまいます。
数か月倒れ伏す生活を続けていましたが、先日精神的に限界が来たので、一発で選択した全レイヤーの名前を削除するスプリクトを作成しました。せっかくなのでご紹介します。先ほどのは珍しい例な気もしますが、他のソフトからのコピペ時や、うっかり手動でレイヤー名を付けまくってしまったときにも使えますよ。
ようけん
- 選択しているオブジェクトのレイヤー名をまとめて空にする。
- 選択していないレイヤーはそのまま。
- グループや複合パスの内部にあるパス・サブレイヤーまですべての名前を削除。
- 処理後は自動で画面を再描画してレイヤーパネルの変化をすぐ確認できるようにしたかったけど微妙に動かなかった
スクリプトのコード
#target illustrator
(function () {
if (app.documents.length === 0) return;
var doc = app.activeDocument;
var selection = doc.selection;
if (selection.length === 0) return;
function resetItemName(item) {
if (item.pageItems && item.pageItems.length > 0) {
for (var i = 0; i < item.pageItems.length; i++) {
resetItemName(item.pageItems[i]);
}
}
if (item.typename === "CompoundPathItem" && item.pathItems) {
for (var j = 0; j < item.pathItems.length; j++) {
try { item.pathItems[j].name = null; } catch (e) {}
}
}
try {
item.name = null;
} catch (e) {
try { item.name = ""; } catch (e2) {}
}
}
for (var k = 0; k < selection.length; k++) {
resetItemName(selection[k]);
}
app.redraw();
})();使い方
使い方は下記記事を参照ください。実行すると元に戻すのが難しいため、事前にバックアップを取ってからお試しくださいね。
スプリクトを実行する際、レイヤー名を削除したいレイヤーを選択した状態で実行してください。選択していないレイヤーの名前はそのままになります。
使ってすぐレイヤーパネルの表示が更新されずに名前が残っているように見える場合があります。ここがうまく修正できなかった……そういった場合は、レイヤー検索で適当な単語を一度検索して、×ボタンを押してクリアするとレイヤー名が消えていることを確認できます。

Geminiさんによると、「レイヤーパネルのツリービューやテキストラベルの再描画トリガーはAPIから直接引くのが難しい」とのことで、再描画できませんでした。レイヤーが少なかったりすると再描画してくれたりするんですけどね。app.redraw();はアートボードの再描画ですが、とりあえず残しています。いるかな?
