Ошибка AppleScript -1700 при попытке доступа к напоминаниям Apple

#list #applescript #reminders

Вопрос:

Я получаю ошибку сценария AppleScript со следующим и был бы очень признателен, если бы кто-нибудь объяснил, почему.

В приложении Apple «Напоминания» я создал простой список с четырьмя элементами напоминания, названными следующим образом:

      Название списка: Цвета

     Напоминания: Красный, Желтый, Светло-Зеленый, Темно-Зеленый

В AppleScript я затем настроил эту переменную:

 set lstMyList to {"Red", "Yellow", "Orange", "Blue"}
 

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

Утверждение 1. (успешно)

Это возвращает значение true, так как имя напоминания 1 («Красный») находится в списке lstMyList

 tell application "Reminders"
    return (name of reminder 1 of list "Colours") is in lstMyList
end tell
 

Утверждение 2. (успешно)

Это возвращает {«Светло-зеленый», «Темно-зеленый»}

 tell application "Reminders"
    return (name of every reminder in list "Colours") whose name contains "Green"
end tell
 

Утверждение 3. (не удается)

Это должно возвращать {«Красный», «Желтый»}, но вместо этого вызывает ошибку -1700

 tell application "Reminders"
    return (name of every reminder in list "Colours") whose name is in lstMyList
end tell
 

Полная ошибка, которая появляется, это:

«Напоминания получили ошибку: не удается ввести {«Красный», «Желтый», «Оранжевый», «Синий»} в спецификатор типа». номер -1700 от {«Красный», «Желтый», «Оранжевый», «Синий»} до спецификатора

Я не могу понять, что происходит в этом третьем случае, так как в первом заявлении без каких-либо проблем используется «находится в lstMyList», а во втором заявлении без каких-либо проблем используется «чей».

Я должен добавить, что я знаю, что ошибку можно полностью обойти, перевернув код, например, пройдя по списку lstMyList и проверив напоминания. Тем не менее, я пытаюсь избежать такого решения, потому что это повлечет за собой повторную отправку событий Apple, что приведет к заметному увеличению времени выполнения, особенно при большом количестве элементов списка.

Любые объяснения и/или советы здесь были бы весьма признательны. Спасибо.

Ответ №1:

Все зависит от того, с кем ты разговариваешь.

Когда ты говоришь

 return (name of reminder 1 of list "Colours") is in lstMyList
 

происходят две вещи.

  1. Сначала отправляется событие Apple с именем напоминания 1 из списка «Цвета». Работа здесь выполняется приложением напоминания; спецификатор name of reminder 1 of list "Colours" -это иерархия, которую оно может понять.
  2. Во-вторых, внутренне (в рамках этого сценария) AppleScript-язык принимает полученную строку и проверяет список на наличие этой строки.

Когда ты говоришь

 return (name of every reminder in list "Colours") whose name contains "Green"
 

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

Точно так же, когда вы говорите

 return (name of every reminder in list "Colours") whose name is in lstMyList
 

вы также просите напоминания сделать это как отдельное событие Apple. Вы надеетесь, что is in lstMyList спецификатор-это то, что напоминания готовы сделать. И это не так. AppleScript есть, но напоминания-нет. Содержание в списке — это просто не спецификатор, который делает напоминание. Вы отправляете это событие Apple:

 get «property pnam» 
    of every «class remi» 
    of «class list» "Colours" 
    whose {"Red", "Yellow", "Orange", "Blue"} contains «property pnam»
 

Это событие Apple просто слишком странное. Вы не можете знать, не пытаясь, на какие спецификаторы будет реагировать приложение; бывает, что напоминаниям это не нравится, и вы ничего не можете с этим поделать.

Я бы сделал это так, чтобы сказать

 set lstMyList to {"Red", "Yellow", "Orange", "Blue"}
set output to {}
tell application "Reminders"
    tell list "Colours"
        set rems to (get every reminder)
        set names to (get name of every reminder)
    end tell
    repeat with i from 1 to count of names
        if item i of names is in lstMyList then
            set end of output to item i of rems
        end if
    end repeat
end tell
 

Теперь мы собрали ссылки на правильные напоминания (в output ), но мы отправили только два события Apple, что дешево и быстро. Остальная часть работы была выполнена внутри компании AppleScript. И, конечно, если бы вам нужны были только имена, а не ссылка на фактическое напоминание, вы могли бы сделать это с помощью всего одного события Apple, чтобы собрать имена.