Множественные критерии для оператора 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