【问题标题】:Reference a textFrame in InDesign by part of its name通过部分名称引用 InDesign 中的 textFrame
【发布时间】:2013-06-03 14:46:57
【问题描述】:

我遇到了一个有趣的难题:如果我只知道其名称的一部分,如何在 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


    【解决方案1】:

    如果您想查找包含“Other”一词的 TextFrame,您可以尝试以下操作:

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

    如果您想查找名称中包含“Other”的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);
    }
    

    【讨论】:

    • 我在您的第二个示例中尝试了许多变体,但恐怕这行不通。任何未指定显式名称的 textFrame 都会自动在“<”中指定一种代理名称和“>”符号。可悲的是,似乎即使是这些“代理”名称也无法在脚本中引用。每当我在for 循环内运行$.writeln(textFramesArray[i].toString()); 时,我只会得到[object TextFrame]。当我运行$.writeln(textFramesArray[i].name); 时,我在控制台中得到一个空行。这告诉我所有的 textFrames 都是未命名的。
    • 尝试使用$.writeln(textFramesArray[i].contents.toString()); 获取更多有用信息。如果 TextFrames 确实未命名,那么您将希望在答案中使用第一种方法。
    • 尝试了你的第一个例子,以及它的几个变体,但没有成功。 ESTK 甚至在最后一行给了我一个调试错误,说undefined is not an object。哇,这比我最初想象的要困难得多。
    • 好的,你的$.writeln(textFramesArray[i].contents.toString());方法越来越近了。不幸的是,如果 textFrame 包含一个表格,那么它似乎不会返回任何文本。如果我可以让它在每个 textFrame 内的表中搜索搜索字符串,那么我认为可能会这样做。我想可能需要一个嵌套的if 语句。
    • 该代码块的输出并不令人鼓舞:Found 0 matches. Result: undefined
    【解决方案2】:

    知道了。我之前引用的那段代码让我完成了 90% 的工作,但我完全忘记了这样一个事实:一旦有了 textFrame 对象,我就不再需要引用它上面的任何层次结构了。因此,以下代码将起作用(嵌套的 if 语句是由于某些 textFrames 没有表格的事实):

    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!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2013-01-15
      • 2014-05-22
      • 2014-07-22
      • 2013-03-30
      • 2012-03-14
      相关资源
      最近更新 更多