آموزش نمایش یک Group روی صفحات فرد و زوج در Adobe InDesign 2026

آموزش نمایش خودکار یک Group روی صفحات فرد و زوج در Adobe InDesign 2026

در این آموزش یاد می‌گیرید چطور یک طرح، لوگو، کادر، نشانه‌ی گرافیکی یا هر Group دلخواه را به‌صورت خودکار روی صفحات فرد، زوج، همه‌ی صفحات یا هیچ صفحه‌ای در Adobe InDesign 2026 قرار دهید؛ بدون دست‌زدن به Parent Pageهای اختصاصی هر صفحه.

ایده و منطق این روش چیست؟

در InDesign نمی‌توانید یک Layer را فقط در صفحات فرد نمایش دهید و در صفحات زوج مخفی کنید؛ چون وضعیت نمایش یا مخفی‌بودن Layer برای کل سند اعمال می‌شود.

راه‌حل اصولی این است که یک Group را به‌عنوان الگو نگه داریم و با اسکریپت، از روی آن نسخه‌های جدید بسازیم. اسکریپت هنگام هر اجرا، نسخه‌های قبلی خودش را حذف می‌کند و سپس براساس انتخاب شما، نسخه‌های جدید را روی صفحات موردنظر قرار می‌دهد.

مزیت اصلی: Parent Pageهای فعلی شما تغییر نمی‌کنند. پس اگر هر صفحه Parent اختصاصی دارد، ساختار سند به‌هم نمی‌ریزد.

این روش برای موارد زیر بسیار کاربردی است:

  • نمایش کادر یا حاشیه‌ی تزئینی در صفحات فرد یا زوج؛
  • قرار دادن لوگو یا واترمارک روی صفحات مشخص؛
  • نمایش یک نوار گرافیکی در صفحات سمت راست یا چپ کتاب؛
  • کنترل عناصر تکرارشونده بدون تغییر Parent Pageها؛
  • طراحی کتاب، مجله، گزارش، کاتالوگ و بروشور.

بخش اول: آماده‌سازی طرح در InDesign

مرحله ۱: بازکردن فایل و گرفتن نسخه‌ی پشتیبان

فایل خود را در Adobe InDesign 2026 باز کنید. قبل از شروع، حتماً یک نسخه‌ی پشتیبان از پروژه بگیرید:

File > Save As

برای مثال می‌توانید فایل آزمایشی را با چنین نامی ذخیره کنید:

Book-Test-Backup.indd

مرحله ۲: ساخت Layer اختصاصی

پنل Layers را از مسیر زیر باز کنید:

Window > Layers

یک Layer جدید بسازید و نام آن را دقیقاً به شکل زیر وارد کنید:

Outer Element
چرا Layer جداگانه؟ چون عناصر ایجادشده توسط اسکریپت از دیگر اجزای طراحی جدا می‌مانند و مدیریت، بررسی و حذف آن‌ها ساده‌تر می‌شود.

مرحله ۳: ساخت طرح موردنظر

حالا طرحی را که می‌خواهید روی صفحات قرار بگیرد بسازید. این طرح می‌تواند شامل کادر، لوگو، تصویر، متن، خط تزئینی یا چند آبجکت مختلف باشد.

همه‌ی اجزای طرح را انتخاب کنید و با میانبر زیر آن‌ها را به یک Group تبدیل کنید:

Ctrl + G

همچنین می‌توانید از منوی زیر استفاده کنید:

Object > Group

مرحله ۴: انتقال Group به Layer مخصوص

Group ساخته‌شده را انتخاب کنید و در پنل Layers آن را به Layer زیر منتقل کنید:

Outer Element

ساختار پنل Layers باید تقریباً به شکل زیر باشد:

Outer Element
    └── Group طرح شما

بخش دوم: تعریف Group مرجع با Script Label

مرحله ۵: بازکردن پنل Script Label

در InDesign به مسیر زیر بروید:

Window > Utilities > Script Label

مرحله ۶: ثبت Label برای Group اصلی

Group اصلی را انتخاب کنید. سپس در پنل Script Label عبارت زیر را وارد کنید:

OuterElementSource

این Group، منبع یا الگوی اصلی اسکریپت است. اسکریپت در هر اجرا، آن را پیدا می‌کند و از روی آن کپی می‌سازد.

هشدار مهم: این نام باید دقیقاً همین باشد. حتی تفاوت در حروف کوچک و بزرگ، فاصله‌ی اضافی یا خط تیره باعث می‌شود اسکریپت Group مرجع را پیدا نکند.

نمونه‌های اشتباه:

Outer Element Source
outerElementSource
OuterElement_Source
OuterElementSource 

بخش سوم: ساخت فایل اسکریپت در ویندوز

مرحله ۷: بازکردن پنل Scripts در InDesign

در InDesign به مسیر زیر بروید:

Window > Utilities > Scripts

در پنل Scripts معمولاً دو پوشه می‌بینید:

Application
User

مرحله ۸: بازکردن پوشه‌ی Scripts Panel

روی پوشه‌ی User راست‌کلیک کنید و گزینه‌ی زیر را بزنید:

Reveal in Explorer

پنجره‌ی File Explorer ویندوز باز می‌شود. پوشه‌ای که باز شده یا پوشه‌ای با نام زیر، محل قرارگیری اسکریپت‌های شخصی شماست:

Scripts Panel

مرحله ۹: ساخت فایل JSX با Notepad ویندوز

  1. در ویندوز، برنامه‌ی Notepad را باز کنید.
  2. کد اسکریپت را که در ادامه آمده، کامل کپی و در Notepad وارد کنید.
  3. از منوی بالا روی File > Save As کلیک کنید.
  4. در بخش File name نام زیر را وارد کنید:
ApplyOuterElement.jsx
  1. در بخش Save as type حتماً این گزینه را انتخاب کنید:
All Files (*.*)
  1. در بخش Encoding گزینه‌ی زیر را انتخاب کنید:
UTF-8
  1. فایل را داخل پوشه‌ی Scripts Panel ذخیره کنید.

مرحله بسیار مهم: جلوگیری از ذخیره‌شدن با پسوند TXT

Notepad ممکن است فایل را اشتباهاً با پسوند .txt ذخیره کند. فایل اشتباه معمولاً این‌گونه است:

ApplyOuterElement.jsx.txt

اما فایل درست باید دقیقاً این نام را داشته باشد:

ApplyOuterElement.jsx

برای دیدن پسوند واقعی فایل‌ها در ویندوز:

  1. پوشه‌ی Scripts Panel را در File Explorer باز کنید.
  2. از نوار بالای پنجره مسیر زیر را انتخاب کنید:
View > Show > File name extensions

در بعضی نسخه‌های ویندوز این گزینه مستقیماً با نام File name extensions در تب View دیده می‌شود.

اگر فایل شما ApplyOuterElement.jsx.txt بود، روی آن راست‌کلیک کنید، گزینه‌ی Rename را بزنید و نام آن را به ApplyOuterElement.jsx تغییر دهید. اگر ویندوز هشدار داد، گزینه‌ی Yes را انتخاب کنید.

بخش چهارم: کد کامل اسکریپت InDesign

فایل ApplyOuterElement.jsx را با Notepad باز کنید، تمام محتوای آن را حذف کنید و کد زیر را کامل داخل آن قرار دهید. سپس با Ctrl + S ذخیره کنید.

#target "InDesign"

(function () {
    /*
     * ============================================================
     * Apply Outer Element
     * سازگار با Adobe InDesign 2026
     *
     * این اسکریپت Group دارای Label زیر را پیدا می‌کند:
     * OuterElementSource
     *
     * سپس از آن روی صفحات فرد، زوج یا همه‌ی صفحات کپی می‌سازد.
     * ============================================================
     */

    // بررسی اینکه حداقل یک سند در InDesign باز باشد
    if (app.documents.length === 0) {
        alert("هیچ سندی در InDesign باز نیست.");
        return;
    }

    // سند فعال
    var doc = app.activeDocument;

    /*
     * Label مربوط به Group مرجع.
     * باید در پنل Script Label روی Group اصلی ثبت شده باشد.
     */
    var SOURCE_LABEL = "OuterElementSource";

    /*
     * Label مربوط به نسخه‌هایی که توسط اسکریپت ایجاد می‌شوند.
     * اسکریپت در اجرای بعدی، آیتم‌های دارای این Label را حذف می‌کند.
     */
    var GENERATED_LABEL = "OuterElementGenerated";

    /*
     * نام Layer اختصاصی برای نگهداری Group مرجع
     * و نسخه‌های ساخته‌شده توسط اسکریپت.
     */
    var TARGET_LAYER_NAME = "Outer Element";


    /*
     * ------------------------------------------------------------
     * دریافت حالت اجرا از کاربر
     *
     * ODD  = فقط صفحات فرد
     * EVEN = فقط صفحات زوج
     * BOTH = همه‌ی صفحات
     * NONE = حذف نسخه‌های ساخته‌شده و خاموش‌کردن عنصر
     * ------------------------------------------------------------
     */
    var mode = prompt(
        "حالت اجرا را وارد کنید:\n\n" +
        "ODD  = فقط صفحات فرد\n" +
        "EVEN = فقط صفحات زوج\n" +
        "BOTH = صفحات فرد و زوج\n" +
        "NONE = خاموش",
        "ODD"
    );

    // اگر کاربر دکمه Cancel را بزند، اجرای اسکریپت متوقف می‌شود.
    if (mode === null) {
        return;
    }

    // تبدیل ورودی کاربر به حروف بزرگ
    mode = mode.toUpperCase();

    // بررسی اینکه ورودی کاربر یکی از حالت‌های معتبر باشد
    if (
        mode !== "ODD" &&
        mode !== "EVEN" &&
        mode !== "BOTH" &&
        mode !== "NONE"
    ) {
        alert(
            "حالت واردشده معتبر نیست.\n\n" +
            "لطفاً یکی از گزینه‌های زیر را وارد کنید:\n" +
            "ODD، EVEN، BOTH یا NONE"
        );
        return;
    }


    /*
     * ------------------------------------------------------------
     * پیدا کردن Group مرجع با Label: OuterElementSource
     * ------------------------------------------------------------
     */
    var sourceItem = null;
    var sourcePage = null;

    // همه‌ی Page Itemهای سند بررسی می‌شوند.
    var allItems = doc.allPageItems;

    for (var i = 0; i < allItems.length; i++) {
        try {
            if (allItems[i].label === SOURCE_LABEL) {
                sourceItem = allItems[i];
                sourcePage = sourceItem.parentPage;
                break;
            }
        } catch (error) {
            // اگر آبجکت نامعتبر بود، از آن عبور می‌کنیم.
        }
    }

    // اگر Group مرجع پیدا نشد، ادامه نمی‌دهیم.
    if (sourceItem === null || sourcePage === null) {
        alert(
            "Group مرجع پیدا نشد.\n\n" +
            "بررسی کنید که Group طرح دارای این Script Label باشد:\n" +
            SOURCE_LABEL
        );
        return;
    }


    /*
     * ------------------------------------------------------------
     * پیدا کردن یا ساخت Layer اختصاصی
     * ------------------------------------------------------------
     */
    var targetLayer = doc.layers.itemByName(TARGET_LAYER_NAME);

    // اگر Layer وجود ندارد، آن را ایجاد می‌کنیم.
    if (!targetLayer.isValid) {
        targetLayer = doc.layers.add({
            name: TARGET_LAYER_NAME
        });
    }


    /*
     * ------------------------------------------------------------
     * ذخیره‌ی موقعیت Group نسبت به صفحه‌ی مرجع
     *
     * این کار باعث می‌شود نسخه‌های جدید دقیقاً در همان موقعیت
     * نسبی روی صفحه‌های مقصد قرار بگیرند.
     * ------------------------------------------------------------
     */
    var sourceBounds = sourceItem.geometricBounds;
    var sourcePageBounds = sourcePage.bounds;

    var relativeTop = sourceBounds[0] - sourcePageBounds[0];
    var relativeLeft = sourceBounds[1] - sourcePageBounds[1];

    var itemHeight = sourceBounds[2] - sourceBounds[0];
    var itemWidth = sourceBounds[3] - sourceBounds[1];


    /*
     * Group مرجع فقط الگو است و نباید کنار نسخه‌های جدید دیده شود.
     * آن را مخفی می‌کنیم، اما حذف نمی‌کنیم.
     */
    sourceItem.visible = false;


    /*
     * ------------------------------------------------------------
     * اجرای عملیات در قالب یک Undo واحد
     *
     * بنابراین کاربر با یک بار Ctrl + Z می‌تواند کل عملیات
     * اجرای اسکریپت را برگرداند.
     * ------------------------------------------------------------
     */
    app.doScript(
        function () {

            /*
             * ----------------------------------------------------
             * حذف نسخه‌های قبلی ساخته‌شده توسط اسکریپت
             * ----------------------------------------------------
             */
            var oldItems = doc.allPageItems;

            for (var j = oldItems.length - 1; j >= 0; j--) {
                try {
                    if (oldItems[j].label === GENERATED_LABEL) {
                        oldItems[j].remove();
                    }
                } catch (error2) {
                    // آبجکت نامعتبر نادیده گرفته می‌شود.
                }
            }


            /*
             * ----------------------------------------------------
             * حالت NONE
             *
             * در این حالت فقط نسخه‌های قبلی حذف می‌شوند.
             * Group مرجع و Parent Pageها دست‌نخورده می‌مانند.
             * ----------------------------------------------------
             */
            if (mode === "NONE") {
                alert(
                    "عنصر Outer Element خاموش شد.\n\n" +
                    "نسخه‌های تولیدشده حذف شدند.\n" +
                    "Group مرجع و Parent Pageهای اصلی حفظ شدند."
                );
                return;
            }


            /*
             * ----------------------------------------------------
             * ساخت نسخه‌های جدید روی صفحات موردنظر
             * ----------------------------------------------------
             */
            var createdCount = 0;

            for (var p = 0; p < doc.pages.length; p++) {
                var page = doc.pages[p];

                /*
                 * تشخیص فرد یا زوج بودن با ترتیب واقعی صفحه در سند:
                 *
                 * صفحه‌ی اول سند = 1 = فرد
                 * صفحه‌ی دوم سند = 2 = زوج
                 */
                var pageOrderNumber = p + 1;
                var isOdd = (pageOrderNumber % 2 !== 0);

                var shouldCreate = false;

                // حالت فقط صفحات فرد
                if (mode === "ODD" && isOdd) {
                    shouldCreate = true;
                }

                // حالت فقط صفحات زوج
                if (mode === "EVEN" && !isOdd) {
                    shouldCreate = true;
                }

                // حالت همه‌ی صفحات
                if (mode === "BOTH") {
                    shouldCreate = true;
                }

                // اگر این صفحه در حالت انتخابی نبود، از آن عبور می‌کنیم.
                if (!shouldCreate) {
                    continue;
                }


                /*
                 * کپی Group مرجع روی صفحه‌ی مقصد
                 */
                var newItem = sourceItem.duplicate(page);

                // انتقال نسخه‌ی جدید به Layer اختصاصی
                newItem.itemLayer = targetLayer;

                // نسخه‌ی تولیدشده باید دیده شود.
                newItem.visible = true;

                /*
                 * تنظیم موقعیت و اندازه‌ی نسخه‌ی جدید
                 * براساس موقعیت Group مرجع نسبت به صفحه‌ی اصلی
                 */
                var targetPageBounds = page.bounds;

                newItem.geometricBounds = [
                    targetPageBounds[0] + relativeTop,
                    targetPageBounds[1] + relativeLeft,
                    targetPageBounds[0] + relativeTop + itemHeight,
                    targetPageBounds[1] + relativeLeft + itemWidth
                ];

                /*
                 * Labelگذاری نسخه‌ی جدید.
                 * اجرای بعدی اسکریپت، این آیتم‌ها را تشخیص داده،
                 * حذف می‌کند و نسخه‌های تازه می‌سازد.
                 */
                newItem.label = GENERATED_LABEL;

                createdCount++;
            }


            /*
             * نمایش گزارش نهایی برای کاربر
             */
            alert(
                "عملیات با موفقیت انجام شد.\n\n" +
                "حالت اجرا: " + mode + "\n" +
                "تعداد نسخه‌های ساخته‌شده: " + createdCount + "\n\n" +
                "Parent Pageهای صفحات تغییر نکردند."
            );

        },
        ScriptLanguage.JAVASCRIPT,
        undefined,
        UndoModes.ENTIRE_SCRIPT,
        "Update Outer Element"
    );

})();

بخش پنجم: اجرای اسکریپت در InDesign

مرحله ۱۰: مشاهده‌ی فایل در پنل Scripts

به InDesign برگردید و مسیر زیر را باز کنید:

Window > Utilities > Scripts

داخل پوشه‌ی User باید فایل زیر را مشاهده کنید:

ApplyOuterElement.jsx

اگر فایل نمایش داده نشد، پنل Scripts را ببندید و دوباره باز کنید. همچنین بررسی کنید که فایل واقعاً پسوند .jsx داشته باشد، نه .txt.

مرحله ۱۱: اجرای اسکریپت

روی فایل ApplyOuterElement.jsx دوبار کلیک کنید. یک پنجره باز می‌شود و از شما می‌خواهد حالت اجرا را وارد کنید.

حالت‌های قابل استفاده

فقط صفحات فرد:

ODD

Group روی صفحه‌های اول، سوم، پنجم و به همین ترتیب ساخته می‌شود.

فقط صفحات زوج:

EVEN

Group روی صفحه‌های دوم، چهارم، ششم و به همین ترتیب ساخته می‌شود.

نمایش روی همه‌ی صفحات:

BOTH

Group روی تمام صفحات سند ساخته می‌شود.

خاموش‌کردن کامل عنصر:

NONE

در حالت NONE:

  • همه‌ی نسخه‌های تولیدشده حذف می‌شوند؛
  • Group مرجع اصلی حفظ می‌شود؛
  • Parent Pageها تغییر نمی‌کنند.
نکته: تشخیص فرد یا زوج بودن در این اسکریپت براساس ترتیب واقعی صفحات در پنل Pages است؛ یعنی نخستین صفحه‌ی سند، صفحه‌ی ۱ و فرد محسوب می‌شود، حتی اگر شماره‌ی چاپی آن چیز دیگری باشد.

خطاهای رایج و راه‌حل‌ها

اسکریپت در پنل Scripts نمایش داده نمی‌شود

  • بررسی کنید فایل داخل پوشه‌ی Scripts Panel ذخیره شده باشد.
  • نام فایل باید دقیقاً ApplyOuterElement.jsx باشد.
  • مطمئن شوید فایل با پسوند .txt ذخیره نشده باشد.
  • پنل Scripts را ببندید و دوباره باز کنید.

پیام «Group مرجع پیدا نشد» نمایش داده می‌شود

  • مطمئن شوید طرح واقعاً Group شده است.
  • Group اصلی باید روی یک صفحه‌ی معمولی سند باشد.
  • Group را انتخاب کنید و در پنل Script Label بررسی کنید این مقدار دقیقاً ثبت شده باشد:
OuterElementSource

نسخه‌های ایجادشده را نمی‌توانم به‌صورت دائمی ویرایش کنم

این طبیعی است. نسخه‌هایی که اسکریپت می‌سازد، در اجرای بعدی حذف و دوباره ساخته می‌شوند. اگر می‌خواهید طرح را تغییر دهید، باید Group مرجع را تغییر دهید و سپس اسکریپت را مجدد اجرا کنید.

آیا Parent Pageها تغییر می‌کنند؟

خیر. این اسکریپت Parent Pageهای فعلی را تغییر نمی‌دهد. تمام نسخه‌ها به‌صورت مستقیم روی صفحات معمولی ایجاد می‌شوند.

جمع‌بندی سریع

  1. طرح خود را بسازید و با Ctrl + G آن را Group کنید.
  2. Group را در Layer با نام Outer Element قرار دهید.
  3. برای Group در پنل Script Label مقدار OuterElementSource را ثبت کنید.
  4. فایل ApplyOuterElement.jsx را در پوشه‌ی Scripts Panel ذخیره کنید.
  5. اسکریپت را از پنل Scripts اجرا کنید.
  6. یکی از چهار حالت ODD، EVEN، BOTH یا NONE را وارد کنید.
آخرین دیدگاه‌ها