参考InDesign中的textFrame的名称的一部分

问题描述 投票:1回答:2

我遇到了一个有趣的难题:如果我只知道部分名称,该如何在InDesign CS6中引用特定的textFrame?我有这段代码:

var otherOverTable = document.layers.item("Spec Sheet").textFrames.item("<Other Printed ItemsYESNOOv>").tables.item(0);
var outputTable = document.layers.item("Spec Sheet").textFrames.item("<OUTPUT>").tables.item(0);

此代码无效。我敢肯定,这是由于以下事实:特定文本框架的名称由“ ”符号包围,是由这些框架中的文本自动生成的。

除了在运行脚本之前重命名那些textFrame对象外,我还能做什么?我是否可以通过某种方式引用第一个,例如说“获取名称中包含“其他”的textFrame”之类的内容?我无法按索引号引用它,因为每次运行脚本时,索引号都会不同。

编辑

谢天谢地,我有这段代码可以工作:

var otherOverTextFrame = findTextFrame(document, "Other");
var outputTextFrame = findTextFrame(document, "OUTPUT");

function findTextFrame(document, searchStr) {
var textFramesArray = document.textFrames.everyItem().getElements();
for (var i = 0; i < textFramesArray.length; i++) {
    if (textFramesArray[i].tables.item(0).isValid) {
        if (textFramesArray[i].tables.item(0).cells.item(0).contents.indexOf(searchStr) != -1) {
            return textFramesArray[i];
        }
    }
}
}

这将返回[object TextFrame]。我认为这就是我所需要的,但是我在弄清楚如何引用它方面遇到了麻烦。例如,我需要更改该textFrame内表中某个单元格的内容。但是,此代码不起作用:

var otherOverTable = document.layers.item("Spec Sheet").otherOverTextFrame.tables.item(0);

我该如何克服最后一个障碍?

javascript reference adobe-indesign extendscript
2个回答
2
投票

如果要查找包含单词“ Other”的TextFrame,则可以尝试如下操作:

app.findTextPreferences = NothingEnum.NOTHING;
app.findTextPreferences.findWhat = "Other";
var textArray = document.findText();
var textFrame = textArray[0].parentTextFrames[0];

如果要查找名称包含“其他”的TextFrame,则可能需要自己搜索:

var textFrame = findTextFrame("Other");

function findTextFrame(searchStr) {
    var textFramesArray = document.textFrames.everyItem().getElements();
    for (var i = 0; i < textFramesArray.length; i++) {
        var textFrame = textFramesArray[i];
        if (textFrame.name.indexOf(searchStr) != -1) {
            return textFrame;
        }
    }
}

请注意,任何一种方法都可以找到多个匹配项,并且只返回第一个匹配项。

编辑:您从中得到什么输出?

app.findGrepPreferences = NothingEnum.NOTHING;
app.findGrepPreferences.findWhat = "Other";
var textArray = document.findGrep();
$.writeln("Found " + textArray.length + " matches.");
for (var i = 0; i < textArray.length; i++) {
    $.writeln("\nMatch " + (i + 1) + ":");
    var text = textArray[i];
    $.writeln("Contents: " + text.contents.toString());
    $.writeln("Number of parent text frames: " + text.parentTextFrames.length);
    $.writeln("Type of parent: " + text.parent.constructor.name);
}

0
投票

知道了。我之前引用的那部分代码使我获得了90%的访问权限,但是我完全忘记了一个事实,一旦有了textFrame对象,就不再需要引用它上面的任何层次结构。因此,下面的代码将起作用(嵌套的if语句是由于某些textFrame没有表而导致的):

var otherOverTable = findTextFrame(document, "Other").tables.item(0);
var outputTable = findTextFrame(document, "OUTPUT").tables.item(0);

function findTextFrame(document, searchStr) {
    var textFramesArray = document.textFrames.everyItem().getElements();
    for (var i = 0; i < textFramesArray.length; i++) {
        if (textFramesArray[i].tables.item(0).isValid) {
            if (textFramesArray[i].tables.item(0).cells.item(0).contents.indexOf(searchStr) != -1) {
                return textFramesArray[i];
            }
        }
    }
}

感谢您为正确方向指引我的所有帮助,dln385!

© www.soinside.com 2019 - 2024. All rights reserved.