Я хочу закодировать сценарий (в Javascript/Extendscript
), который копирует стили ячеек из исходного документа в один или несколько целевых документов. Функциональность должна быть похожа на существующую опцию «Добавить ячейки ячеек» в InDesign
, за исключением того, что она должна быть в состоянии сделать это в пакетной папке вместо одного документа за раз.Indesign: Копирование стиля ячейки в новый документ
Вопросы:
1)
Код ниже работы:
cStyle_source = app.documents[0].cellStyles[1]
cStyle_target = app.documents[0].cellStyles[2]
value = cStyle_source.basedOn
cStyle_target.basedOn = value
Это правильно копирует стиль ячейки выбирается в соответствии с 'на основе' в стиле источника клеток к целевой стиль.
теперь я пытаюсь скопировать свойство BasedOn к целевому стилю в другого открытого документа:
cStyle_source = app.documents[0].cellStyles[1]
cStyle_target = app.documents[1].cellStyles[2]
value = cStyle_source.basedOn
cStyle_target.basedOn = value
Новый документом является копией первого, и она содержит все те же стили. Однако запуск этого кода дает мне сообщение об ошибке:
Недопустимое значение для свойства set 'basedOn'. Ожидаемый элемент CellStyle или string, но полученный CellStyle.
Это я, или это сообщение не имеет смысла? Почему это работает при применении значения свойства к стилю в том же документе, но не к другому документу?
2)
Почему пример кода ниже работы стили абзаца и стили символов, но не для стилей объектов и стилей ячеек?
myProperties = app.activeDocument.paragraphStyles[1].properties
app.activeDocument.paragraphStyles[2].properties = myProperties
Это очень удобно копирует все свойства от стиля 1 до стиля 2 и даже работает с документами. Очень просто.
Почему стили ячеек (и стили объектов) различны в этом отношении?
Кажется, мне нужно будет прокрутить каждое свойство, чтобы скопировать полный стиль ячейки, и поэтому моя проблема в 1) выше появилась.
UPDATE:
Я хотел бы добавить свое решение, чтобы скопировать весь стиль ячейки, в том числе «других» ID объектов, как basedOn
, appliedParagraphStyle
и образчиков.
function AddCStyles() {
var cStyles_source = app.documents[1].cellStyles;
var cStyles_target = app.activeDocument.cellStyles;
var loopLength = cStyles_target.length
for (var i in selectedCStyles) {
var myProperties = cStyles_source.item(selectedCStyles[i]).properties;
var incomingName = selectedCStyles[i];
for (var j=0; j < loopLength; j++) {
if (incomingName === cStyles_target[j].name) { // Checks if cell style already exists. If yes, loop through properties and overwrite
for (var k in myProperties) {
try {
if (myProperties[k] == "[object CellStyle]") {
value = cStyles_source.item(selectedCStyles[i]).properties[k].name;
cStyles_target[j][k] = app.documents[0].cellStyles.item(value);
continue
}
if (myProperties[k] == "[object ParagraphStyle]") {
value = cStyles_source.item(selectedCStyles[i]).properties[k].name;
cStyles_target[j][k] = app.documents[0].paragraphStyles.item(value);
continue
}
if (myProperties[k] == "[object StrokeStyle]" || myProperties[k] == "[object Color]") {
value = cStyles_source.item(selectedCStyles[i]).properties[k].name;
cStyles_target[j][k] = value;
continue
}
cStyles_target[j][k] = myProperties[k];
}
catch (e) {}
}
}
if (j === loopLength - 1 && cStyles_target.item(incomingName).isValid === false) { // If cell style doesn't exist, create new and loop through properties
var newCStyle = cStyles_target.add();
for (var k in myProperties) {
try {
if (myProperties[k] == "[object CellStyle]") {
value = cStyles_source.item(selectedCStyles[i]).properties[k].name;
newCStyle[k] = app.documents[0].cellStyles.item(value);
continue
}
if (myProperties[k] == "[object ParagraphStyle]") {
value = cStyles_source.item(selectedCStyles[i]).properties[k].name;
newCStyle[k] = app.documents[0].paragraphStyles.item(value);
continue
}
if (myProperties[k] == "[object StrokeStyle]" || myProperties[k] == "[object Color]") {
value = cStyles_source.item(selectedCStyles[i]).properties[k].name;
newCStyle[k] = value;
continue
}
newCStyle[k] = myProperties[k];
}
catch (e) {}
}
}
}
}
}
Спасибо, Jongware! Думаю, я могу настроить код для поиска в целевом документе, и если стиль не существует, он пропустит это свойство. Однако я не могу использовать #importStyles, так как пользователю нужно будет выбрать определенные стили для копирования. Не могли бы вы объяснить, почему стиль ячейки настолько ограничен по сравнению с стилем абзаца? – UncleToft
Боюсь, вам придется взять это как есть ... Обратите внимание, что * изначально * InDesign не имел табличных стилей. Это был разработанный извне и продаваемый плагин, который Adobe приобрела. Возможно, это единственная причина, по которой он не интегрируется полностью с другими элементами, доступными для сценариев (и позиция Adobe могла бы быть «если она работает, лучше не пытаться улучшить ее»). – usr2564301