如何使用JavaScript自动创建或编辑Keynote主幻灯片?

时间:2017-06-07 20:28:12

标签: applescript jxa keynote javascript-automation

我正在尝试使用JavaScript进行自动化,在Keynote中自动创建和检查主幻灯片。

创建主幻灯片

使用给定主题创建新文档很容易,并添加包含特定主幻灯片的幻灯片。

// Create a new document using the "White" theme.
var Keynote = Application('Keynote');
var doc = Keynote.Document({
    documentTheme: Keynote.themes['White']
});
Keynote.documents.push(doc);

// Create and append a new "Title & Bullets" slide.
var slide = Keynote.Slide({
    baseSlide: doc.masterSlides['Title & Bullets']
});
doc.slides.push(slide);

这将创建一个带有“白色”主题的新文档,并附加一个新的“标题和子弹”幻灯片。

类似的方法不适用于主幻灯片。

// Create a new document using the "White" theme.
var Keynote = Application('Keynote');
var doc = Keynote.Document({
    documentTheme: Keynote.themes['White']
});
Keynote.documents.push(doc);

// Create and append a new master slide.
var slide = Keynote.MasterSlide({
    name: "Testing"
});
doc.masterSlides.push(slide);

这会创建一个新文档,但不会创建新的主幻灯片。查看脚本编辑器Replies窗口,push返回null,而不是将新的Slide推送到返回2的doc.slides(幻灯片的数量)数组)。

可以复制主幻灯片,但仅当主题演讲处于“编辑主幻灯片”模式时。如果单击“编辑主幻灯片”按钮,则可以复制主幻灯片。

var Keynote = Application('Keynote');
var doc = Keynote.documents[0];
var ms = doc.masterSlides['Title & Bullets'];
ms.duplicate();

这将创建一个名为“Title& Bullets copy”的新主幻灯片。

检查主幻灯片的属性

检查主幻灯片有类似但略有不同的问题。以下代码应记录打开文档的“标题和项目符号”主幻灯片上标题项的位置,宽度和高度。

var Keynote = Application('Keynote');
var doc = Keynote.documents[0];
var ms = doc.masterSlides['Title & Bullets'];

var title = ms.defaultTitleItem();
var pos = title.position();

console.log("(x,y) = (" + pos.x + "," + pos.y + ")");
console.log("width x height = " + title.width() + " x " + title.height());

在“编辑主幻灯片”模式之外或“编辑主幻灯片”模式下运行但选择了不同的主幻灯片时,此代码会写入

/* (x,y) = (0,0) */
/* width x height = 0 x 0 */

到日志。相反,当在“编辑主幻灯片”模式中选择“标题和项目符号”主幻灯片运行时,会记录正确的值。

/* (x,y) = (75,35) */
/* width x height = 874 x 170 */

问题

创建主幻灯片,检查其属性并最终更改它们的适当方法是什么?

1 个答案:

答案 0 :(得分:2)

首先在AppleScript中编写代码,看看是否可以在那里工作。 AppleScript是一种糟糕的语言,但它的Apple事件支持是首屈一指的,它是所有可编写脚本的应用程序开发和测试的事实标准。

如果它在AS中失败,那么Keynote就会被破坏。如果它在AS中工作但在将其转换为JXA时失败,则JXA会被破坏。 CocoaScripting框架(用于在macOS应用程序中实现Apple事件支持)和JXA都有很多缺陷和缺陷,当然个别脚本应用程序也可能包含自己的错误和糟糕的设计†,所以你必须弄清楚它是否是通过淘汰过程失败的应用程序或JXA。

...

根据您对观察到的行为的描述,并且知道Apple自己的脚本应用程序通常是错误的和设计不合理的,我倾向于应用程序,但我几年没有触及iWork应用程序所以不能肯定地说。

如果您发现它是应用程序并决定提交错误报告(有时可以正常工作,而其他时间也没有),请确保包含说明问题的AppleScript代码; AS是事实上的标准,而JXA则不是,所以它可以减少一层混淆,并且可以让问题排查员陷入困境。

(†Apple的开发者文档关于Apple事件自动化如何实际运行以及如何实现它的事实也没有帮助。)