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

问题描述 投票:0回答:1

有没有办法在外部Applescript应用程序中检索Automator应用程序脚本的结果(而不是Automator中的Applescript行)?

就像是:

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
applescript automator
1个回答
1
投票

我对此进行了一些调查,并没有找到AppleScript和Automator applet可以通信的自然方法,尽管这并不意味着一个肯定不存在。

与此同时,您可以实现一些解决方法/黑客中的一个,尽管在他们的方法中有点不合时宜,但确实可以实现所需的结果,而不会产生任何会影响applet本身功能的副作用。

1. Use The Clipboard

在applet的工作流程结束时附加Copy to Clipboard操作,或者跟随您希望报告其结果的操作。

从AppleScript检索剪贴板很简单:

get the clipboard

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

但是,剪贴板还能够存储图像数据,文件引用和其他数据类型,因此可以(如果不总是直截了当地)发送要在AppleScript中检索的那些。

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

2. Write Out To A Temporary File

为了避免使用剪贴板作为中介,或者如果您希望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脚本插入到工作流程中,使用该脚本可以轻松实现文件操作。

日历事件示例

使用与您描述的方案类似的示例,检索日历事件的简单小程序可能具有如下所示的工作流:

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

每个值都通过制表符分隔前一个冒号,这里不明显。另外,从日期格式和地址可以看出,这些是英国格式的值,但当然,您的日历将是它们设置的任何值。

但由于每个列表项大致相同,因此在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"}
© www.soinside.com 2019 - 2024. All rights reserved.