2014-04-10 3 views
3

다른 버전의 보고서 제작을 자동화하는 스크립트를 작성 중입니다. 스크립트는 먼저 XML 파일을 가져온 다음 Indesign 프로젝트를 정리하기 위해 다른 기능을 실행합니다. Indesign 스크립트가 두 번 작동하지 않습니다.

나는이 스크립트를 실행

,

var myMenuAction = app.menuActions.item("Import XML..."); 
myMenuAction.invoke(); 

은 "XML 가져 오기"대화 상자가 열리고 가져올 XML 파일을 선택하라고 요청, 그리고 클릭 "열기"를 "XML 가져 오기 옵션"후 상자가 나타납니다. 여태까지는 그런대로 잘됐다. 하지만 "확인"을 클릭하면 "XML 가져 오기"상자가 다시 나타납니다.

처음에는 원하는 파일과 옵션을 선택하면 다시 선택할지 "취소"할지 여부가 달라지지 않는 것 같습니다. , 스크립트는 여전히 내가 원하는 것을 수행한다. 단지 깔끔하게 보이지 않는다.

내 질문에 XML 가져 오기 대화 상자를 한 번만 가져 오려면 어떻게해야합니까?

+0

['app.activeDocument.importXMl'] (http://jongware.mit.edu/idcs6js/pc_Document.html#importXML) 대신 Menu Invoke를 사용하는 이유를 요약 할 수 있습니까? 또한, 두 번째 메뉴 호출은 무엇을합니까? (추측, 나는 또한 수입을 시도한다고 말하고 싶습니다.) 더 많은 코드를 보여주십시오. – usr2564301

+0

여기에 Jongware가 있습니까? 너는 좋은 손에있다. 그 사람은 Extendscript Guru입니다. 그가 당신에게 묻는대로하십시오. – bgmCoder

+0

@BGM : 아우. ☺ – usr2564301

답변

2

구루 (Guru)가 선포 한 사람이든 아니든, 나는 실제로 이것에 대해서 놀랐다. 그러나 당신은 당신 자신의 관찰에 따라 그것을 얻었습니다!

... "XML 가져 오기 ..."라는 두 인스턴스 (메뉴 아래에있는 파일, 구조 창의 드롭 다운 메뉴에있는 하나)가 모두 호출되기 때문에 가능합니다 ?

실제로 맞습니다. xx.item(yy)개 또는 컬렉션에서 개를 검색합니다. Marc Autret's blog :

위의 방법 중 실제로 어떤 요소도 반환하지 않는다는 것이 큰 비결입니다. . . '요소'를 객체 지정자로 이해하는 것을 제외하고는

'여러 개체'에 대한 참조가 있고 '가져 오기 XML ...'이라는 두 개의 메뉴가 있습니다. InDesign을 표시으로 설득하는 것은 어렵습니다. myMenuAction.length이 작동하지 않습니다 ("하나의 요소이므로 길이가 없습니다) myMenuAction.constructor.name[Object MenuAction]입니다. 다시 한 요소에 대해 나타냅니다. 그러나 alert (myMenuAction.name); 드디어 (취소) 예상 출력을 보여줍니다

alert box showing two menus

그것은 단지 하나의 를 호출하는 방법을 찾기 위해 DOM을 가로 지르는의 놀라운 양을했다. 나는 위치 "파일"을 선택했다 -> "XML 가져 오기 ...", 그리고이 걸리는 것입니다 : 당신이 사용하려는 경우

var myMenu = app.menus.item("Main"); 
var fileMenu = myMenu.menuElements.item("File"); 
alert (fileMenu.menuItems.everyItem().name); 
var myXmlMenu = fileMenu.menuItems.item("Import XML..."); 
alert (myXmlMenu.name); 
myMenuAction = myXmlMenu.associatedMenuAction; 
alert (myMenuAction.name); 
myMenuAction.invoke(); 

당신은 경고를 생략 할 수 있습니다. 이 문자열은 이 아니라 현지화 가능한 형식 인입니다.이 예는 InDesign에서만 영어로 작동하지만 다른 인터페이스 언어를 사용하도록 설정하지 않은 경우에는 사용할 수 없습니다.

더 좋은 방법은 가능할 때마다 메뉴를 호출하지 않는 것입니다.이 경우 코드를 다음으로 대체 할 수 있습니다.

folder = Folder.myDocuments; 
if (File.fs == "Windows") 
    myFile = folder.openDlg('Load XML', "XML files,*.xml;All files:*.*", false); 
else 
    myFile = folder.openDlg('Load XML', function(file) 
     { 
      return file instanceof Folder || 
      (!(file.hidden) && file.name.match(/\.(xml)$/i)); 
     }, false); 
} 
if (myFile) 
    xml = app.activeDocument.importXml(myFile); 

장점 중 일부는 로캘과 무관합니다. "열기"대화 상자를 사용자 정의하여 다른 폴더 (예 : 현재 문서가 저장된 폴더)에서 시작하고 다른 파일 필터를 사용할 수 있습니다. XML을 현재 문서로 가져 오거나 기존 요소 (XML 가져 오기 대화 상자의 "선택한 요소로 가져 오기"의 스크립트 버전)로 가져올 수 있습니다. 새로로드 된 XML 객체에 대한 참조를 가져 오므로 가져온 후에 즉시 후 처리 할 수 ​​있습니다.

+0

고마워요, Jongware! – PaulTong

+0

Marc의 블로그 게시물을 더 잘 반영하면 다음과 같이 약간만 수정하면 자신의 행을 실제로 사용할 수 있습니다. var myMenuAction = app.menuActions.item ("XML 가져 오기 ..."). getElements() [0];' 이렇게하면 * 실제 * 배열로 변환됩니다. 그러나 ID 작업을 좀 더 어렵게 만듭니다. – usr2564301

관련 문제