2013-06-03 55 views
1

我遇到了一個有趣的窘境:如何在InDesign CS6中引用特定的文本框,如果我只知道其名稱的一部分?我有這樣的代碼:參考InDesign中的文本框的部分名稱

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對象之外,我該怎麼辦?有沒有什麼方法可以引用第一個,例如,通過說出如下內容:「獲取包含'Other'的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); 

我該如何着手克服這最後一道障礙?

回答

0

明白了。我之前引用的那一小段代碼讓我有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!

2

如果你想找到包含單詞「其他」一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

我在你的第二個例子上已經嘗試了很多變體,但是我害怕那不起作用。沒有給出明確名稱的任何textFrame會在「<」和「>」符號中自動給出一種代理名稱。可悲的是,即使這些「代理」名稱不能在腳本中引用,看起來。每當我在'for'循環中運行'$ .writeln(textFramesArray [i] .toString());'時,我只會得到'[object TextFrame]'。當我運行'$ .writeln(textFramesArray [i] .name);',我在控制檯中得到一個空行。這告訴我所有的textFrame都是未命名的。 – Sturm

+1

嘗試使用'$。writeln(textFramesArray [i] .contents.toString());'獲得更多有用的信息。如果TextFrame確實是未命名的,那麼您會希望在答案中使用第一種方法。 – dln385

+0

試過你的第一個例子,以及它的幾個變化,沒有成功。 ESTK甚至在最後一行給我一個調試錯誤,說'undefined不是一個對象。哇,這一點起初比我想象的要困難得多。 – Sturm