【テクニカル・上級編】Sketchのマクロ・自動化スクリプト入門:AppleScriptとJXAで定型作業を一括処理する方法 – UI/UX・デザインツール活用バイブル

—

魂をコードに宿せ:Sketch自動化の極北――AppleScriptとJXAによるデザインパイプラインの再構築

デザインは「描く」ものではない。デザインとは「構造化された情報の視覚的表現」であり、その構築プロセスにおいて発生する手作業は、すべて排除されるべき「技術負債」である。

UI/UXデザイナー、そしてフロントエンドの境界線を破壊し続けるエンジニア諸君。君たちはいつまで、シンボルの命名規則を手動で直し、アセットの書き出しに貴重なニューロンを消費し続けるつもりだ?

Sketchは単なるベクタードローイングツールではない。macOSのネイティブ・フレームワークと深く結びついた、高度にスクリプタブルなデザインエンジンだ。本稿では、AppleScriptおよびJavaScript for Automation (JXA) を駆使し、Sketchを「意志を持つ自動化マシン」へと昇華させる、極限の知見を伝授する。

—

1. なぜ「プラグイン」ではなく「外部スクリプト」なのか

多くの者はSketch公式のJavaScript APIを用いたプラグイン開発に走る。確かにそれは正攻法だ。しかし、真のDevOpsアーキテクトは、より広範なコンテキスト――つまりOSレベルの自動化を視野に入れる。

  • クロスアプリ・オーケストレーション: Finder、Slack、Terminal、そしてSketchを横断するワークフローの構築。
  • ヘッドレス実行: GUIを介さず、バックグラウンドで重厚なバッチ処理を完遂させる。
  • ゼロ・インストール: プラグインの管理コストを排除し、シェルスクリプト一つで環境を制御する。

これらを実現するのが、AppleScriptおよびJXAによる外部制御だ。

—

2. JXA (JavaScript for Automation) によるSketch操作の真髄

AppleScriptの冗長な構文を嫌う我々にとって、JXAは救世主だ。Objective-Cブリッジを介して、Sketchの内部オブジェクトモデル(MSDocument, MSLayer等)に直接アクセスする。

以下に示すのは、全ページをスキャンし、特定の命名規則(例:`icon/`で始まるレイヤー)に合致しない要素を自動検出し、修正、さらには書き出しまでを行うプロフェッショナルなスクリプトの雛形だ。

// Sketchをターゲットに指定
const Sketch = Application(‘Sketch’);
Sketch.includeStandardAdditions = true;

/

  • デザインアセットの完全自動正規化パイプライン

/
function automateDesignWorkflow() {
const docs = Sketch.documents();
if (docs.length === 0) {
console.log(“Error: 実行中のドキュメントが見つかりません。”);
return;
}

const doc = docs[0];
const pages = doc.pages();

pages.forEach(page => {
console.log(`Processing Page: ${page.name()}`);

// 再帰的にレイヤーを走査
processLayers(page.layers());
});

// 処理完了後の通知(macOS標準通知を使用)
Sketch.displayNotification(“自動正規化が完了しました。”, {
withTitle: “Sketch Automation Pipeline”,
subtitle: “Asset Normalization: Success”
});
}

function processLayers(layers) {
layers.forEach(layer => {
// 命名規則のバリデーション(例:スペースをアンダースコアに置換)
let oldName = layer.name();
let newName = oldName.replace(/\s+/g, ‘_’).toLowerCase();

if (oldName !== newName) {
layer.name = newName;
console.log(`Renamed: ${oldName} -> ${newName}`);
}

// シンボルインスタンスであれば、オーバーライドの不整合をチェックする等のロジックをここに挿入
if (layer.class() === “MSSymbolInstance”) {
// 高度なメモリ管理が必要な場合はここでオブジェクトを解放、または参照を最適化する
}

// 子レイヤーが存在する場合は再帰処理
if (layer.layers && layer.layers().length > 0) {
processLayers(layer.layers());
}
});
}

automateDesignWorkflow();

ポイント:低レイヤへのアクセス

JXA経由で`layer.class()`を叩くことで、Sketchの内部クラス名(`MSArtboardGroup`, `MSTextLayer`など)を取得できる。これはドキュメント化されていないプライベートAPIに近い領域だが、これを掌握することこそが、ツールを「骨の髄まで」使い倒すということだ。

—

3. sketchtool CLI:CI/CDパイプラインへの統合

プロトタイピングの自動化を語る上で、`sketchtool`を避けて通ることはできない。これはSketchに同梱されている最強のコマンドラインユーティリティだ。

これをJXAやシェルスクリプトから叩くことで、デザイナーがファイルを保存した瞬間に、以下のフローをバックグラウンドで走らせることが可能になる。

1. JSON Export: 全アートボードのメタデータをJSONで抽出し、フロントエンドのカタログを自動更新。
2. Asset Generation: `@2x`, `@3x` の画像を生成し、自動的にS3バケットへ同期。
3. PDF/Preview: 最新のプロトタイプをSlackチャンネルへ投稿。

究極の書き出しコマンド例
–item で特定のアートボードのみを指定し、メモリ消費を抑える
/Applications/Sketch.app/Contents/Resources/sketchtool/bin/sketchtool export artboards \
“DesignSystem.sketch” \
–output=”dist/assets” \
–formats=”png,svg” \
–scales=”1, 2″ \
–include-symbols=false \
–save-for-web=true

—

4. パフォーマンスの極致:メモリ消費と最適化ハック

巨大なデザインシステム(数千のシンボル、数百のページ)をスクリプトで処理する場合、素人レベルのコードではSketchがハングアップする。

1. オブジェクト参照の最小化

JXAで`doc.pages().layers()`のようにドットシンボルで深く繋ぐたびに、Objective-Cブリッジのオーバーヘッドが発生する。ループ内では必ずローカル変数に参照をキャッシュせよ。

2. 描画更新の停止

大量のプロパティ変更を行う際は、Sketchの描画エンジンを一時的に停止させるのが定石だ。
(※内部APIの`doc.showMessage()`等を利用して、ユーザーへのフィードバックを最小限に抑え、処理に集中させる)

3. ガベージコレクションの意識

JXAはJavaScriptCore上で動作している。大量のレイヤーをループで処理する場合、一時的なオブジェクトがヒープを圧迫する。処理を「ページ単位」などで分割し、コンテキストを一度リセットする設計にせよ。

—

5. 結論:ツールに支配されるな、ツールを再定義せよ

多くのデザイナーは、Sketchが提供するメニューの範囲内で仕事をしている。しかし、本稿をここまで読んだ君は違うはずだ。

AppleScriptやJXAによる自動化は、単なる「時短テクニック」ではない。それは「デザインの品質をコードによって保証する」という思想の表明である。手作業による命名ミス、書き出し漏れ、古いバージョンの混入。これらはすべて、スクリプトという厳格な論理によって根絶できる。

我々エンジニアの使命は、クリエイティブな人間がクリエイティブな活動にのみ没頭できる「究極のパイプライン」を構築することにある。

さあ、今すぐターミナルを開け。君のSketchを、真のプロフェッショナル・ツールへと進化させる時だ。

タイトルとURLをコピーしました