I frequently need to create a GUI script to access a menu item in applications whose AppleScript library doesn't provide direct access to the objects or functions the menu item represents. To make it easy to re-use the code, I use variables for the app, menu, & menu item names. Then I just need to change the variables at the top rather than pick out the names from the code body.
set targetApp to "app_name"
set theMenu to "menu_name"
set theItem to "menu_item_name"
tell application targetApp
activate
tell application "System Events"
tell application process targetApp
tell menu bar 1
tell menu bar item theMenu
tell menu theMenu
click menu item theItem
end tell
end tell
end tell
end tell
end tell
end tell
SUB-MENUS
It gets a little more involved when there are sub- & sub-sub-menus involved, as a menu item with a sub-menu is both a menu item of its parent menu AND a menu parent of its sub-menus. Note that the text variable "theItem" is used to specify both a menu item AND a menu; the "targetApp" string variable is used to reference both an app & a process, so it saves having to edit 2 names in 2 places each when reusing the code. I use this script to run on voice commands for accessing menu items quickly rather than having to say, e.g., "click Edit Menu"... "click Transformations"... "click Make Upper Case"... I add another variable for the sub-menu item:
set targetApp to "app_name"
set theMenu to "menu_name"
set theItem to "menu_item_name"
set theSubItem to "sub_item_name"
tell application targetApp
activate
tell application "System Events"
tell application process targetApp
tell menu bar 1
tell menu bar item theMenu
tell menu theMenu
tell menu item theItem
tell menu theItem
click menu item theSubItem
end tell
end tell
end tell
end tell
end tell
end tell
end tell
end tell
For example:
set targetApp to "TextEdit"
set theMenu to "Edit"
set theItem to "Transformations"
set theSubItem to "Make Upper Case"
tell application targetApp
activate
tell application "System Events"
tell application process targetApp
tell menu bar 1
tell menu bar item theMenu
tell menu theMenu
tell menu item theItem
tell menu theItem
click menu item theSubItem
end tell
end tell
end tell
end tell
end tell
end tell
end tell
end tell
If there's another level of sub-menus, an additional variable (e.g., "theSubSubItem") would be required, & the line in the System Events process tell block would have another layer
...
tell menu item theItem
tell menu theSubItem
click menu item theSubSubItem
end tell
end tell
...
As noted elsewhere in this thread it's recommended to address an application's objects & functions directly whenever they're included in the API, but addressing the GUI is useful as a last resort when the API doesn't provide direct access. The downside is a GUI script can get more cumbersome & may have to be revised with each application update.