Future Date яблочный скрипт не срабатывает - PullRequest
0 голосов
/ 19 июня 2019

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

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

Прямо сейчас это мой сценарий

on run {input, parameters}
    tell application "System Events"
        set _date to ((current date) + (days * 14))
        keystroke ¬
            text -2 thru -1 of ("00" & ((day of _date) as integer)) & "/" & ¬
            text -2 thru -1 of ("00" & ((month of _date) as integer)) & "/" & ¬
            (year of _date as text)
    end tell
end run

Редактировать 2

Спасибо @vadian и @RobC за помощь в упрощении этого кода!Я изменил свою комбинацию клавиш на что-то, что, я уверен, не используется, но все же не повезло в таинственном получении какого-либо результата.Мне не нужно иметь ярлык, при условии, что я могу заставить его работать.Приложены скриншоты из Automator и системные настройки для сочетаний клавиш, чтобы увидеть, не ошибаюсь ли я где-нибудь там?

Снимок экрана системных настроек

Снимок экрана Automator

1 Ответ

1 голос
/ 20 июня 2019

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

Prelude

  • В то время не было ясно, какой сценарий вы приняли, но один из вариантов вызывает do shell script изнутри действия Запуск AppleScript , изнутри Automator , но это может привести к снижению производительности в медленной системе, поэтому вы можете получить более отзывчивый рабочий процесс, если вы:

    1. Разделите рабочий процесс на Выполнить сценарий Shell Shell для получения даты, затем Выполните действие AppleScript для выполнения битов AppleScript; OR

    2. Делайте все это в рамках одного Запуска сценария оболочки , в рамках которого вы можете использовать osascript для выполнения AppleScript. Это звучит эквивалентно тому, что он делает это наоборот, но это не так.

  • Вы должны хранить Добавление сценариев Команды отдельно от любых команд, принадлежащих приложению, которые отправляются в блоке tell. В частности, переместите эту строку:

    set _date to ((current date) + (days * 14))
    

    до (и, следовательно, снаружи) блока tell. Требование Системные события для возврата current date - команды, которую он не понимает, - выдает ошибку (без вывода сообщений) и отправляет команду вверх по цепочке наследования, пока не достигнет экземпляра current application, в который Сценарии дополнения команды загружены. Следовательно, это влияет на производительность, но неудивительно, что проблема была устранена: Workflow Service Runner не является приложением и, скорее всего, не имеет собственного экземпляра current application, в который можно загрузить команды дополнений (они все равно будут доступны через сам экземпляр AppleScript, но только из любого блока tell application).

Дополнительные мысли

AppleScript можно улучшить / оптимизировать с помощью специального класса, в который мы можем привести объект date и заставить его возвращать строку даты и времени в формате ISO 8601, например, "2019-06-20T09:41:45". Это проще и быстрее разложить на компоненты даты и собрать в стандартную строку даты в британском формате. Вот код:

property text item delimiters : { "/", "-", "T"}

return text items 1 thru 3 of ¬
    ((current date) + 14 * days as ¬
    «class isot» as string) as text

В сторону: Если вы когда-нибудь перейдете от дат в британском формате к стандартному формату ISO-8601, например, "2019-06-20", код AppleScript упрощает и выполняет еще больше:

property text item delimiters : { "/", "-", "T"}

return text 1 thru 10 of ((current date) + ¬
    14 * days as «class isot» as string)

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

Automator Service Workflow in macOS (AppleScript)

А именно, опция Output replaces selected text встроена прямо в Automator . Я думаю, что это легко пропустить из-за фразы «выделенный текст», который обычно воспринимается как явно выделенные выделения, которые всегда включают хотя бы один символ. Но, чтобы использовать номенклатуру AppleScript для имени класса, selection-object в текстовом вводе всегда существует, и значение выделенного текста, по крайней мере, "". По сути, его всегда можно заменить, и это механизм, с помощью которого можно вставить текст в точку вставки.

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

Без необходимости использовать Системные события , теперь у вас есть возможность заменить AppleScript и использовать один сценарий оболочки:

Automator Service Workflow in macOS (Shell script)

Еще раз теоретическое улучшение.Имеет ли что-нибудь из этого действительно очевидные / практические выгоды?Возможно нет.Но я думаю, что хорошо иметь варианты.

...