Получить результат приложения Automator во внешнем Applescript? - PullRequest
0 голосов
/ 28 августа 2018

Есть ли способ получить результат сценария приложения Automator во внешнем приложении Applescript (не в строках 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 голосов
/ 29 августа 2018

Я немного разбирался в этом и не нашел естественного средства, с помощью которого апплеты AppleScript и Automator могут взаимодействовать, хотя это не означает, что однозначно не существует.

Тем временем вы могли бы реализовать один из нескольких обходных путей / хаков, которые, хотя и немного непристойно в своих методах, достигают желаемого результата, не создавая побочных проблем, которые могут повлиять на функциональность самого апплета.

1. Используйте буфер обмена

Добавить действие Copy to Clipboard в конце рабочего процесса апплета или после действия, о результате которого вы хотите сообщить.

Извлечь буфер обмена из AppleScript просто:

get the clipboard

Это, вероятно, подойдет для возвращаемых значений, которые являются простыми текстовыми строками или числом. Передача массива элементов из действия Automator в буфер обмена не очень надежна, иногда позволяя получить доступ только к первому элементу. Однако это можно решить с помощью небольшого AppleScript в рабочем процессе для правильной обработки массивов результатов и их преобразования в доступный формат, например, строка, разделенная запятыми.

Однако буфер обмена также способен хранить данные изображений, ссылки на файлы и другие типы данных, поэтому можно (если не всегда просто) отправлять их для извлечения в AppleScript.

Где возможно, строки и числа являются самыми безопасными типами хранения.

2. Записать во временный файл

Чтобы избежать использования буфера обмена в качестве посредника, или если вы хотите, чтобы апплет сообщал о нескольких переменных без особой работы, то запись данных во временный файл является довольно распространенной практикой, например, это делается в сценариях оболочки при сохранении значения необходимы между несколькими исполнениями одного и того же скрипта.

На самом деле существует специальный каталог, который периодически очищается , чтобы временные файлы данных не накапливались: /tmp. Он скрыт в Finder , но вы все равно можете создавать файлы и удалять их, как и любой другой каталог. Файлы, к которым нет доступа в течение 3 дней, очищаются системой.

Существует действие New Text File, которое может записать текст в файл:

New Text File action in Automator on macOS

Для указания каталога /tmp проще всего создать переменную со значением "/tmp" (без кавычек) и перетащить эту переменную в соответствующее поле.

Creating a variable in Automator on macOS

Но я бы хотел вставить AppleScript или, что более удобно, сценарий оболочки в рабочий процесс, с помощью которого манипулирование файлами становится простым и более эффективным.

Пример событий календаря

Используя пример, подобный описанному вами сценарию, простой апплет, который извлекает события календаря, может иметь рабочий процесс, который выглядит следующим образом:

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"}
...