Множественные критерии для оператора If в AppleScript

Я пытаюсь изменить applescript, который вызывает уведомление о появлении при появлении нового сообщения в Outlook. Оригинальный script здесь.

В моем выражении if я пытаюсь сказать, что если папка является либо удаленным элементом, либо нежелательной электронной почтой, либо отправленными, не запускайте уведомление.

Вот утверждение:

if folder of theMsg is "Junk E-mail" or "Deleted Items" or "Sent Items" then
    set notify to false
else
    set notify to true
end if

Похоже, что applescript не нравится, что множится/или элементы, которые я добавил. Есть ли способ включить несколько критериев, или мне нужно написать вложенное if/then?

Ответ 1

Правильный способ привязки условий if в AppleScript - это повторить полное условие:

if folder of theMsg is "A" or folder of theMsg is "B" or folder of theMsg is "C" then

- неявное повторение левого аргумента. Более элегантный способ сделать это - сравнить аргумент левой руки со списком элементов:

if folder of theMsg is in {"A", "B", "C"} then

который имеет тот же эффект (обратите внимание, что это зависит от неявного принуждения текста к списку, который в зависимости от вашего контекста tell может завершиться неудачно. В этом случае явное принуждение вашего левого, т.е. (folder of theMsg as list)).

Ответ 2

При включении нескольких критериев в ваши условные утверждения вы должны переписать все условные. Иногда это может быть очень утомительно, но это так, как работает AppleScript. Ваше выражение станет следующим:

if folder of theMsg is "Junk E-mail" or folder of theMsg is "Deleted Items" or folder of theMsg is "Sent Items" then
    set notify to false
else
    set notify to true
end if

Однако есть обходной путь. Вы можете инициализировать все свои критерии в списке и посмотреть, соответствует ли ваш список:

set the criteria to {"A","B","C"}
if something is in the criteria then do_something()

Ответ 3

Try:

repeat with theMsg in theMessages
        set theFolder to name of theMsg folder
        if theFolder is "Junk E-mail" or theFolder is "Deleted Items" or theFolder is "Sent Items" then
            set notify to false
        else
            set notify to true
        end if
    end repeat

Хотя два других ответа правильно разрешают несколько критериев, они не будут работать, если вы не укажете name of theMsg folder или вы получите

mail folder id 203 of application "Microsoft Outlook"

Ответ 4

Придя через этот пост с помощью Google Apps "applescript, если несколько условий" и не попал на фрагмент кода, который я ожидал, это то, что я сделал (только для информационных целей):

Вы также можете рекурсивно сканировать несколько условий. Следующий пример: - Если адрес отправителя содержит (Arg 1.1) что-то (Arg 2.1.1 и 2.1.2), чтобы немедленно остановить script и "notify" = > true (Arg 3.1). - Посмотрите, если папка/почтовый ящик (Arg 1.2) начинается с "2012" (Arg 2.2.1), но не является папкой 2012-AB или C (Arg 2.2.2), если он не начинается с 2012 года или содержится в одной из трех папок и ничего не делает = > false (Arg 3.2).

if _mc({"\"" & theSender & " \" contains", "\"" & (name of theFolder) & "\""}, {{"\"@me.com\"", "\"Tim\""}, {"starts with \"2012\"", "is not in {\"2012-A\", \"2012-B\", \"2012-C\"}"}}, {true, false}) then
    return "NOTIFY "
else
    return "DO NOTHING "
end if

- многокомпонентное компарадирование с помощью оболочки script

on _mc(_args, _crits, _r)
    set i to 0
    repeat with _arg in _args
        set i to i + 1
        repeat with _crit in (item i of _crits)
            if (item i of _r) as text is equal to (do shell script "osascript -e '" & (_arg & " " & _crit) & "'") then
                return (item i of _r)
            end if
        end repeat
    end repeat
    return not (item i of _r)
end _mc

https://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/conceptual/ASLR_about_handlers.html#//apple_ref/doc/uid/TP40000983-CH206-SW3