Я немного разбирался в этом и не нашел естественного средства, с помощью которого апплеты AppleScript и Automator могут взаимодействовать, хотя это не означает, что однозначно не существует.
Тем временем вы могли бы реализовать один из нескольких обходных путей / хаков, которые, хотя и немного непристойно в своих методах, достигают желаемого результата, не создавая побочных проблем, которые могут повлиять на функциональность самого апплета.
1. Используйте буфер обмена
Добавить действие Copy to Clipboard
в конце рабочего процесса апплета или после действия, о результате которого вы хотите сообщить.
Извлечь буфер обмена из AppleScript просто:
get the clipboard
Это, вероятно, подойдет для возвращаемых значений, которые являются простыми текстовыми строками или числом. Передача массива элементов из действия Automator в буфер обмена не очень надежна, иногда позволяя получить доступ только к первому элементу. Однако это можно решить с помощью небольшого AppleScript в рабочем процессе для правильной обработки массивов результатов и их преобразования в доступный формат, например, строка, разделенная запятыми.
Однако буфер обмена также способен хранить данные изображений, ссылки на файлы и другие типы данных, поэтому можно (если не всегда просто) отправлять их для извлечения в AppleScript.
Где возможно, строки и числа являются самыми безопасными типами хранения.
2. Записать во временный файл
Чтобы избежать использования буфера обмена в качестве посредника, или если вы хотите, чтобы апплет сообщал о нескольких переменных без особой работы, то запись данных во временный файл является довольно распространенной практикой, например, это делается в сценариях оболочки при сохранении значения необходимы между несколькими исполнениями одного и того же скрипта.
На самом деле существует специальный каталог, который периодически очищается , чтобы временные файлы данных не накапливались: /tmp
. Он скрыт в Finder , но вы все равно можете создавать файлы и удалять их, как и любой другой каталог. Файлы, к которым нет доступа в течение 3 дней, очищаются системой.
Существует действие New Text File
, которое может записать текст в файл:
Для указания каталога /tmp
проще всего создать переменную со значением "/tmp"
(без кавычек) и перетащить эту переменную в соответствующее поле.
Но я бы хотел вставить AppleScript или, что более удобно, сценарий оболочки в рабочий процесс, с помощью которого манипулирование файлами становится простым и более эффективным.
Пример событий календаря
Используя пример, подобный описанному вами сценарию, простой апплет, который извлекает события календаря, может иметь рабочий процесс, который выглядит следующим образом:
, где вы можете откалибровать первое действие, чтобы изолировать нужные вам события, такие как сегодняшние события. Это действие возвращает тип объекта, который нелегко обрабатывается 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"}