我想编写一个脚本 (in Javascript/Extendscript
),将单元格样式从源文档复制到一个或多个目标文档。该功能应该很像 中现有的“加载单元样式”选项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
新文档是第一个文档的副本,并且包含所有相同的样式。但是,运行此代码会给我错误消息:
设置属性“basedOn”的值无效。应为 CellStyle 或字符串,但收到 CellStyle。
是我,还是那条信息没有意义?为什么将属性值应用于同一文档中的样式而不是另一个文档时会起作用?
2)
为什么下面的示例代码适用于段落样式和字符样式,但不适用于对象样式和单元格样式?
myProperties = app.activeDocument.paragraphStyles[1].properties
app.activeDocument.paragraphStyles[2].properties = myProperties
这非常方便地将所有属性从样式 1 复制到样式 2,甚至可以跨文档工作。十分简单。
为什么在这方面单元格样式(和对象样式)不同?
看来我需要遍历每个属性来复制完整的单元格样式,因此出现了我在上面 1) 中的问题。
更新:
我想添加我的解决方案来复制整个单元格样式,包括“其他 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) {}
}
}
}
}
}