在外部Applescript中获得Automator应用程序结果?

时间:2018-08-28 12:33:09

标签: applescript automator

是否可以在外部Applescript应用程序(而不是Automator中的Applescript行)中检索Automator应用程序脚本的结果?

类似的东西:

tell application "My_Automator_App"
   -- suppose My_Automator_App checks the Calendar to see if there some events today
   -- "Show Result" in Automator will display a list      

   get the_Result -- list returned by Automator
end tell

1 个答案:

答案 0 :(得分:1)

我仔细研究了一下,并没有找到AppleScript和 Automator 小程序可以进行通信的自然方式,尽管这并不意味着绝对不存在。

与此同时,您可以实现一些变通办法/ hacks中的一种,尽管它们的方法似乎不太合理,但它们确实达到了预期的结果,而不会产生任何会影响小程序本身功能的副作用。

1。使用剪贴板

在applet工作流程的末尾或在希望报告其结果的操作之后,添加 Copy to Clipboard 操作。

从AppleScript检索剪贴板很简单:

get the clipboard

这可能适合简单文本字符串或数字的返回值。从 Automator 动作将项目数组传递到剪贴板不是很可靠,有时只允许访问第一个项目。但是,可以使用工作流程中的小型AppleScript解决此问题,以正确处理结果数组并将其转换为可访问的格式,例如逗号分隔的字符串。

但是,剪贴板还能够存储图像数据,文件引用和其他数据类型,因此有可能(如果不总是很简单的话)发送要在AppleScript中检索的图像。

在可能的情况下,字符串和数字是最安全的存储类型。

2。写出临时文件

为避免将剪贴板用作中介,或者如果您希望applet在无需过多工作的情况下报告多个变量,则将数据写入临时文件是相当普遍的做法,例如在持久化时在shell脚本中进行操作在同一脚本的多次执行之间需要这些值。

实际上有一个特殊的目录,它获取periodically purged,以便不会累积临时数据文件:/tmp。它被隐藏在 Finder 中,但是您仍然可以像其他任何目录一样创建和删除文件。系统将清除3天之内无法访问的文件。

有一个 New Text File 操作可以将文本写入文件:

New Text File action in Automator on macOS

通过创建一个值为/tmp(不带引号)的变量并将该变量拖到适当的字段中,最容易完成指定"/tmp"目录的操作。

Creating a variable in Automator on macOS

但是我倾向于将AppleScript,或更合适的是,将Shell脚本插入工作流中,从而使文件操作变得容易且功能强大。

日历事件示例

使用与您描述的场景类似的示例,一个简单的applet可以检索日历事件,其工作流程可能如下所示:

Automator Workflow

您可以在其中校准第一个操作以隔离所需的事件,例如今天的事件。该操作返回的类型不是AppleScript可以轻松处理的对象,但是第二个操作以文本格式提取相关数据,总结了第一个操作返回的事件列表。

在这里,临时文件可用于将数据写到文本文件,然后可以在AppleScript中检索该文件。

鉴于此 Automator 小程序保存在名为"CalEvents"下,此AppleScript使用了该小程序及其结果:

    property tidEvents : [linefeed, linefeed, "EVENT", space] as text
    property tidDetails : {tab, " to "}
    property tid : a reference to my text item delimiters


    run application id "com.apple.automator.CalEvents"

    set tid's contents to tidEvents     
    set EventsSummary to read POSIX file "/tmp/EventsSummary.txt"
    set EventsList to the EventsSummary's text items

    set [[n], EventsList] to [it, rest] of EventsList
    set n to n's last word as number

    EventsList -- The final list of events from first to last

在首次运行时,小程序需要获得访问您的日历信息的同意,该信息仅需要执行一次,并且会使上述脚本看起来失败。获得授权后,您可以随意运行脚本以获取/tmp/EventsSummary.txt文件的最新内容。

list变量EventsList中的每个项目都是如下所示的文本块(星号是我对隐私的修改,花括号中的地址项也是这样):

4 OF 8
Summary:    GP Appointment
Status:     none
Date:       07/12/2017 to 07/12/2017
Time:       14:45:00 to 15:45:00
Location:   ******** Medical Centre
{Address Line 1}
{Address Line 2}
{County}
{Post Code}
United Kingdom
Notes:      01*** *****9

每个值都由一个制表符与前一个冒号分隔,在这里不会很明显。另外,从日期格式和地址可以看出,这些是英式格式的值,但是您的值当然会是 Calendar 中设置的值。

但是,由于每个列表项都是相同的,因此在AppleScript中提取特定事件的细节将很简单,首先将特定事件项拆分为多个段落,然后通过制表符或空格字符将特定段落拆分(或两者)或某些自然界定文本有用位的介词:

    set |Event| to some item in the EventsList

    set tid's contents to tidDetails
    set EventDetails to {title:text item 2 of paragraph 2 ¬
        , startTime:text item 2 of paragraph 5 ¬
        , EndTime:text item 3 of paragraph 5} of the |Event|

在AppleScript记录中放置重要的事件详细信息,例如其名称和开始/结束时间:

{title:"GP Appointment", startTime:"15:45:00", EndTime:"16:00:00"}