我正在组装一个脚本来自动生成不同版本的报告。该脚本将首先导入 XML 文件,然后运行一些其他功能来整理 Indesign 项目。
当我运行这个脚本时,
var myMenuAction = app.menuActions.item("Import XML...");
myMenuAction.invoke();
“导入 XML”对话框打开并要求我选择要导入的 XML 文件,单击“打开”后弹出“XML 导入选项”框。到目前为止,一切都很好。但是在我单击“确定”后,“导入 XML”框再次弹出。
这不是一个真正关键的问题,如果我第一次选择我想要的文件和我想要的选项,无论我再次选择它们还是点击“取消”似乎都没有什么区别,所以脚本仍然按照我的意愿执行,只是看起来不太整洁。
所以我的问题是我需要做什么才能只获得一轮导入 XML 对话框?
最佳答案
无论是否宣称为 Guru,我实际上也对此感到困惑。但是您自己的观察是正确的!
... is it possible that because there are two instances of "Import XML..." in the menus (one under File, the other in the dropdown menu in the Structure window) that both are being invoked?
确实是这样。 xx.item(yy)
从集合 中检索一个或多个 项目。来自 Marc Autret's blog :
The big secret is that none of the above methods actually returns any element. . . except to understand an 'element' as an object specifier.
您得到的是对“多个对象”的引用,是的,有两个名为“导入 XML...”的菜单。很难说服 InDesign 显示有两个; myMenuAction.length
不起作用(它"is"单个元素,因此没有长度),并且 myMenuAction.constructor.name
显示 [Object MenuAction]
-- 同样,对于单个元素。但是,alert (myMenuAction.name);
最终显示了(非)预期的输出:
为了找出如何调用 just one 花费了大量遍历 DOM 的时间。我选择定位"file"->“导入 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 对象的引用,因此您可以在导入后立即对其进行后处理。
关于javascript - Indesign Script 确实起作用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997252/