Después de luchar con esto durante días antes de publicar la pregunta anterior, parece que he descubierto una solución - Creo que el acto de describir realmente la pregunta en detalle para publicarla hizo que mi pensamiento llegara hasta allí.
Lo comparto para el beneficio de cualquier otra persona que se encuentre con algo similar...
Mi lucha fue con la idea de que la naturaleza jerárquica significaba aumentar el nivel de tell
para cada elemento de theSubMenusNamesList
. No he podido averiguar cómo poner eso en un bucle sin que cada iteración del bucle entre en ese nivel pero luego tenga que volver a salir en el mismo nivel, con lo que no se profundiza.
Aquí fue donde la opción 3 fue un fracaso desde el principio, lo que me hizo bajar a la madriguera de intentar construir el script en texto, para luego ejecutarlo con run script
.
Sin embargo, la opción 3 es en realidad la respuesta - codificarla directamente sin tratar de construirla en texto - pero tuve que luchar con eso un poco más para llegar allí.
Al final me di cuenta de que puedo poner el subMenú de cada iteración en una variable - establecida como menu item ... of
la iteración anterior de sí mismo . Que profundiza con éxito en cada uno de los niveles de la jerarquía sin retirarse demasiado pronto.
Por supuesto, si eso no tiene sentido, aquí está el código, que puedes robar y adaptar, por supuesto, y que puede tener más sentido o no... ;)
on chooseMenuItem(theApp, theMenu, theSubMenusNamesList, theMenuItemName)
set theAppName to the name of theApp
activate theApp
tell application "System Events" to tell process theAppName
tell theMenu to click
repeat with theMenuName in theSubMenusNamesList
set theMenu to menu item theMenuName of menu 1 of theMenu
tell theMenu to click
end repeat
set theMenuItem to menu item theMenuItemName of menu 1 of theMenu
tell theMenuItem to click
end tell
end chooseMenuItem
Esto funciona para mí - probado con un número de diferentes opciones. Por ejemplo: Como en la pregunta original, llámalo con algo como:
ChooseMenuItem("TextEdit", "Format", {"Font", "Ligatures"}, "Use Default")
O un ejemplo sin submenús, dejando el tercer parámetro como una lista vacía:
ChooseMenuItem("TextEdit", "File", {}, "New")
Espero que esto ayude a alguien.