見出し画像

InDesignの表の幅を調整するスクリプト

「表の横幅をテキストフレームいっぱいに合わせる」ことをよくやるのですが、手作業でがんばってきました。

ChatGPTにお願いしてみたところ、サクっとできましたの共有します。

すべての列幅を均等に

#target indesign

// メイン関数
function main() {
    var doc = app.activeDocument;
    var sel = app.selection;

    if (sel.length == 0 || !(sel[0].hasOwnProperty('baseline'))) {
        alert("テーブル内にカーソルを置いてください。");
        return;
    }

    var cursor = sel[0];
    var parentTable = null;

    // テーブルを含むセルを見つける
    if (cursor.constructor.name === "InsertionPoint") {
        if (cursor.parent.constructor.name === "Cell") {
            parentTable = cursor.parent.parent;
        }
    } else if (cursor.constructor.name === "Text") {
        if (cursor.parentTextFrames.length > 0) {
            var frame = cursor.parentTextFrames[0];
            if (frame.tables.length > 0) {
                for (var i = 0; i < frame.tables.length; i++) {
                    var table = frame.tables[i];
                    if (table.storyOffset.index <= cursor.index && cursor.index <= table.storyOffset.index + table.characters.length) {
                        parentTable = table;
                        break;
                    }
                }
            }
        }
    }

    if (!parentTable) {
        alert("テーブル内にカーソルを置いてください。");
        return;
    }

    // テキストフレームの幅を取得
    var textFrame = parentTable.parent;
    while (textFrame.constructor.name !== "TextFrame" && textFrame.constructor.name !== "Story") {
        textFrame = textFrame.parent;
    }

    if (textFrame.constructor.name === "TextFrame") {
        var frameWidth = textFrame.geometricBounds[3] - textFrame.geometricBounds[1];

        // テーブルの幅をテキストフレームの幅に設定
        parentTable.width = frameWidth;
    } else {
        alert("テーブルがテキストフレーム内に見つかりません。");
    }
}

main();

最終列のみを調整

#target indesign

// メイン関数
function main() {
    var doc = app.activeDocument;
    var sel = app.selection;

    if (sel.length == 0 || !(sel[0].hasOwnProperty('baseline')) || !(sel[0].constructor.name === "InsertionPoint" || sel[0].constructor.name === "Text")) {
        alert("テーブル内にカーソルを置いてください。");
        return;
    }

    var cursor = sel[0];
    var parentTable = null;

    // テーブルを含むセルを見つける
    if (cursor.constructor.name === "InsertionPoint") {
        if (cursor.parent.constructor.name === "Cell") {
            parentTable = cursor.parent.parent;
        }
    } else if (cursor.constructor.name === "Text") {
        if (cursor.parentTextFrames.length > 0) {
            var frame = cursor.parentTextFrames[0];
            if (frame.tables.length > 0) {
                for (var i = 0; i < frame.tables.length; i++) {
                    if (frame.tables[i].storyOffset <= cursor.index && frame.tables[i].storyOffset + frame.tables[i].characters.length >= cursor.index) {
                        parentTable = frame.tables[i];
                        break;
                    }
                }
            }
        }
    }

    if (!parentTable) {
        alert("テーブル内にカーソルを置いてください。");
        return;
    }

    // テーブルが含まれているテキストフレームの幅を取得
    var textFrameWidth = parentTable.parent.geometricBounds[3] - parentTable.parent.geometricBounds[1];

    // テーブルの現在の幅を取得
    var currentTableWidth = parentTable.width;

    // 最終列を除くすべての列幅の合計を計算
    var totalOtherColumnsWidth = 0;
    for (var col = 0; col < parentTable.columns.length - 1; col++) {
        totalOtherColumnsWidth += parentTable.columns[col].width;
    }

    // 最終列の幅を計算して設定
    var newLastColumnWidth = textFrameWidth - totalOtherColumnsWidth;
    parentTable.columns[parentTable.columns.length - 1].width = newLastColumnWidth;
}

main();

オマケ:選択したフレームをマージン幅に

// ドキュメントと選択アイテムを取得
var doc = app.activeDocument;
var selection = app.selection;

// 選択されているアイテムが存在するか確認
if (selection.length > 0) {
    // ドキュメントのマージン情報を取得
    var marginPreferences = doc.marginPreferences;
    
    // マージン幅を計算
    var marginWidth = doc.documentPreferences.pageWidth - marginPreferences.left - marginPreferences.right;

    // 選択されているすべてのアイテムに対して処理を実行
    for (var i = 0; i < selection.length; i++) {
        var item = selection[i];
        
        // フレーム(テキストフレーム、グラフィックフレーム、その他)であるか確認
        if (item.hasOwnProperty('geometricBounds')) {
            // フレームの幅をマージン幅に設定
            var bounds = item.geometricBounds;
            bounds[3] = bounds[1] + marginWidth; // 左の位置 + マージン幅
            item.geometricBounds = bounds;


        }
    }
}

ダウンロード

スクリプト

KeyboardMaestroマクロ

ここから先は

0字 / 1ファイル

¥ 100

定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5