آموزش نمایش خودکار یک Group روی صفحات فرد و زوج در Adobe InDesign 2026
در این آموزش یاد میگیرید چطور یک طرح، لوگو، کادر، نشانهی گرافیکی یا هر Group دلخواه را بهصورت خودکار روی صفحات فرد، زوج، همهی صفحات یا هیچ صفحهای در Adobe InDesign 2026 قرار دهید؛ بدون دستزدن به Parent Pageهای اختصاصی هر صفحه.
ایده و منطق این روش چیست؟
در InDesign نمیتوانید یک Layer را فقط در صفحات فرد نمایش دهید و در صفحات زوج مخفی کنید؛ چون وضعیت نمایش یا مخفیبودن Layer برای کل سند اعمال میشود.
راهحل اصولی این است که یک Group را بهعنوان الگو نگه داریم و با اسکریپت، از روی آن نسخههای جدید بسازیم. اسکریپت هنگام هر اجرا، نسخههای قبلی خودش را حذف میکند و سپس براساس انتخاب شما، نسخههای جدید را روی صفحات موردنظر قرار میدهد.
این روش برای موارد زیر بسیار کاربردی است:
- نمایش کادر یا حاشیهی تزئینی در صفحات فرد یا زوج؛
- قرار دادن لوگو یا واترمارک روی صفحات مشخص؛
- نمایش یک نوار گرافیکی در صفحات سمت راست یا چپ کتاب؛
- کنترل عناصر تکرارشونده بدون تغییر Parent Pageها؛
- طراحی کتاب، مجله، گزارش، کاتالوگ و بروشور.
بخش اول: آمادهسازی طرح در InDesign
مرحله ۱: بازکردن فایل و گرفتن نسخهی پشتیبان
فایل خود را در Adobe InDesign 2026 باز کنید. قبل از شروع، حتماً یک نسخهی پشتیبان از پروژه بگیرید:
File > Save As
برای مثال میتوانید فایل آزمایشی را با چنین نامی ذخیره کنید:
Book-Test-Backup.indd
مرحله ۲: ساخت Layer اختصاصی
پنل Layers را از مسیر زیر باز کنید:
Window > Layers
یک Layer جدید بسازید و نام آن را دقیقاً به شکل زیر وارد کنید:
Outer Element
مرحله ۳: ساخت طرح موردنظر
حالا طرحی را که میخواهید روی صفحات قرار بگیرد بسازید. این طرح میتواند شامل کادر، لوگو، تصویر، متن، خط تزئینی یا چند آبجکت مختلف باشد.
همهی اجزای طرح را انتخاب کنید و با میانبر زیر آنها را به یک 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، منبع یا الگوی اصلی اسکریپت است. اسکریپت در هر اجرا، آن را پیدا میکند و از روی آن کپی میسازد.
نمونههای اشتباه:
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 ویندوز
- در ویندوز، برنامهی Notepad را باز کنید.
- کد اسکریپت را که در ادامه آمده، کامل کپی و در Notepad وارد کنید.
- از منوی بالا روی File > Save As کلیک کنید.
- در بخش File name نام زیر را وارد کنید:
ApplyOuterElement.jsx
- در بخش Save as type حتماً این گزینه را انتخاب کنید:
All Files (*.*)
- در بخش Encoding گزینهی زیر را انتخاب کنید:
UTF-8
- فایل را داخل پوشهی Scripts Panel ذخیره کنید.
مرحله بسیار مهم: جلوگیری از ذخیرهشدن با پسوند TXT
Notepad ممکن است فایل را اشتباهاً با پسوند .txt ذخیره کند. فایل اشتباه معمولاً اینگونه است:
ApplyOuterElement.jsx.txt
اما فایل درست باید دقیقاً این نام را داشته باشد:
ApplyOuterElement.jsx
برای دیدن پسوند واقعی فایلها در ویندوز:
- پوشهی Scripts Panel را در File Explorer باز کنید.
- از نوار بالای پنجره مسیر زیر را انتخاب کنید:
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ها تغییر نمیکنند.
خطاهای رایج و راهحلها
اسکریپت در پنل Scripts نمایش داده نمیشود
- بررسی کنید فایل داخل پوشهی Scripts Panel ذخیره شده باشد.
- نام فایل باید دقیقاً ApplyOuterElement.jsx باشد.
- مطمئن شوید فایل با پسوند .txt ذخیره نشده باشد.
- پنل Scripts را ببندید و دوباره باز کنید.
پیام «Group مرجع پیدا نشد» نمایش داده میشود
- مطمئن شوید طرح واقعاً Group شده است.
- Group اصلی باید روی یک صفحهی معمولی سند باشد.
- Group را انتخاب کنید و در پنل Script Label بررسی کنید این مقدار دقیقاً ثبت شده باشد:
OuterElementSource
نسخههای ایجادشده را نمیتوانم بهصورت دائمی ویرایش کنم
این طبیعی است. نسخههایی که اسکریپت میسازد، در اجرای بعدی حذف و دوباره ساخته میشوند. اگر میخواهید طرح را تغییر دهید، باید Group مرجع را تغییر دهید و سپس اسکریپت را مجدد اجرا کنید.
آیا Parent Pageها تغییر میکنند؟
خیر. این اسکریپت Parent Pageهای فعلی را تغییر نمیدهد. تمام نسخهها بهصورت مستقیم روی صفحات معمولی ایجاد میشوند.
آخرین دیدگاهها