Difficulty getting menu bar titles via Applescript in DNtp

I’ve written an AppleScript that gets a list of all menu items (one menu deep) in an application. It works in every app I’ve tried except DEVONthink (see the comment !!).

Is there something different that needs to be done with DNt?

set theProcess to "DEVONthink 3"

set AppleScript's text item delimiters to return
set theList to ""

tell application "System Events"
	tell process theProcess
		
		-- get list of menu bar items
		set theMenuBarItems to get title of menu bar items 2 thru -1 of menu bar 1
		
		-- get list of menu contents for each menu bar item
		repeat with theItem in theMenuBarItems
			if theItem is not "" then
				set theList to theList & return & tab & theItem & return
				
-- !! N.B. the script breaks at this point only with DEVONthink
				set theMenuTitles to get title of every menu item of every menu of menu bar item theItem of every menu bar as string
				
				set theList to theList & "|liststart|" & return & theMenuTitles & return & "|listend|"
			end if
		end repeat
	end tell
end tell

Any help would be greatly appreciated.

The Scripts menu doesn’t have a title (it’s an icon), maybe that’s causing an error?

Yeah, I thought that too but excluding the Scripts menu doesn’t help. Modifying the script the specify menu bar items 2 thru 3 (rather than 2 thru -1) still yields an error.

Script Debugger tells me:

Can’t make «class titl» of every «class menI» of every «class menE» of «class mbri» (item 1 of {“DEVONthink 3”, “File”}) of every «class mbar» of «class prcs» “DEVONthink 3” of application “System Events” into type string.

Instead of retrieving all titles at once you could use a loop to retrieve one after another to figure out which one is causing the troubles.

(*DEVONthink 3*)
(*Ablage*)
(*Bearbeiten*)
(*Daten*)
(*Format*)
(*Werkzeuge*)
(*Darstellung*)
(*Gehe zu*)
(*Fenster*)
(*missing value*)
(*Hilfe*)

It is the script menu, the entry just before the last one (“Help”). My script iterates of the menu bar entries’ names. I ran the same script with GraphicConverter 11, which also has icons in its menu bar. There however, these entries also have a name property. So there seems to be some difference in the UI implementation under the hood.

However, the script fails miserably with the title property in both cases.

I rewrote your script in JavaScript (as had to be expected). Details on the kind of weird menu structure in SystemEvents here: https://github.com/JXA-Cookbook/JXA-Cookbook/wiki/System-Events#clicking-menu-items

The script is slow, but that is probably due to my awkward way to access the menu items.

const procID = "DEVONthink 3";
(() => {
  const appSE = Application("System Events");
  const proc = appSE.processes[procID]();
  const menuBarItems = proc.menuBars[0].menuBarItems().splice(1);
  const menus = proc.menuBars[0].menuBarItems.menus.menuItems();
  menuBarItems.forEach(barItem => {
	const menus = barItem.menus()[0];
	const menuItems = menus.menuItems();
    menuItems.forEach(mi => {
	  console.log(`${barItem.name()}: '${mi.name()}' #${mi.title()}`);
	})
  })
})()

The output follows (click on the triangle to expand). The first string is the menu bar entry, the second the menu item’s name (in single quotes) and the last one the menu item’s title (following the hash sign). As you can easily see, there are a lot of entries with a null name and no title.

DT menu structure (German)
/* DEVONthink 3: 'Über DEVONthink 3' #Über DEVONthink 3 */
/* DEVONthink 3: 'Nach neuer Version suchen...' #Nach neuer Version suchen... */
/* DEVONthink 3: 'Zusätzliche Module installieren...' #Zusätzliche Module installieren... */
/* DEVONthink 3: 'null' # */
/* DEVONthink 3: 'Einstellungen...' #Einstellungen... */
/* DEVONthink 3: 'Papierkorb leeren...' #Papierkorb leeren... */
/* DEVONthink 3: 'Cache leeren' #Cache leeren */
/* DEVONthink 3: 'null' # */
/* DEVONthink 3: 'Kaufen' #Kaufen */
/* DEVONthink 3: 'Lizenz eingeben...' #Lizenz eingeben... */
/* DEVONthink 3: 'null' # */
/* DEVONthink 3: 'Dienste' #Dienste */
/* DEVONthink 3: 'null' # */
/* DEVONthink 3: 'DEVONthink 3 ausblenden' #DEVONthink 3 ausblenden */
/* DEVONthink 3: 'Andere ausblenden' #Andere ausblenden */
/* DEVONthink 3: 'Alle einblenden' #Alle einblenden */
/* DEVONthink 3: 'null' # */
/* DEVONthink 3: 'DEVONthink 3 beenden' #DEVONthink 3 beenden */
/* DEVONthink 3: 'Beenden und Fenster beibehalten' #Beenden und Fenster beibehalten */
/* Ablage: 'Neue Datenbank...' #Neue Datenbank... */
/* Ablage: 'Neue verschlüsselte Datenbank...' #Neue verschlüsselte Datenbank... */
/* Ablage: 'Datenbank öffnen...' #Datenbank öffnen... */
/* Ablage: 'Benutzte Datenbanken' #Benutzte Datenbanken */
/* Ablage: 'null' # */
/* Ablage: 'Neues Fenster' #Neues Fenster */
/* Ablage: 'null' # */
/* Ablage: 'Importieren' #Importieren */
/* Ablage: 'Exportieren' #Exportieren */
/* Ablage: 'Teilen' #Teilen */
/* Ablage: 'null' # */
/* Ablage: 'Dateien und Ordner indizieren...' #Dateien und Ordner indizieren... */
/* Ablage: 'Indizierte Objekte aktualisieren' #Indizierte Objekte aktualisieren */
/* Ablage: 'null' # */
/* Ablage: 'Synchronisieren' #Synchronisieren */
/* Ablage: 'Alles synchronisieren' #Alles synchronisieren */
/* Ablage: 'Ausstehende Dateien herunterladen' #Ausstehende Dateien herunterladen */
/* Ablage: 'null' # */
/* Ablage: 'Datenbank-Eigenschaften...' #Datenbank-Eigenschaften... */
/* Ablage: 'Datenbank schließen' #Datenbank schließen */
/* Ablage: 'null' # */
/* Ablage: 'Datenbank überprüfen & reparieren' #Datenbank überprüfen & reparieren */
/* Ablage: 'Datenbank optimieren' #Datenbank optimieren */
/* Ablage: 'Backup wiederherstellen...' #Backup wiederherstellen... */
/* Ablage: 'Neuaufbau der Datenbank...' #Neuaufbau der Datenbank... */
/* Ablage: 'Datenbank löschen...' #Datenbank löschen... */
/* Ablage: 'null' # */
/* Ablage: 'Papierformat...' #Papierformat... */
/* Ablage: 'Drucken...' #Drucken... */
/* Bearbeiten: 'Löschen widerrufen' #Löschen widerrufen */
/* Bearbeiten: 'Wiederholen' #Wiederholen */
/* Bearbeiten: 'null' # */
/* Bearbeiten: 'Ausschneiden' #Ausschneiden */
/* Bearbeiten: 'Kopieren' #Kopieren */
/* Bearbeiten: 'URL kopieren' #URL kopieren */
/* Bearbeiten: 'Verweis kopieren' #Verweis kopieren */
/* Bearbeiten: 'Verweis auf Seite kopieren' #Verweis auf Seite kopieren */
/* Bearbeiten: 'Einsetzen' #Einsetzen */
/* Bearbeiten: 'Einsetzen und Stil anpassen' #Einsetzen und Stil anpassen */
/* Bearbeiten: 'Löschen' #Löschen */
/* Bearbeiten: 'Vervollständigen' #Vervollständigen */
/* Bearbeiten: 'Alles auswählen' #Alles auswählen */
/* Bearbeiten: 'Auswahl aufheben' #Auswahl aufheben */
/* Bearbeiten: 'null' # */
/* Bearbeiten: 'Zusammenfassen' #Zusammenfassen */
/* Bearbeiten: 'null' # */
/* Bearbeiten: 'Tags...' #Tags... */
/* Bearbeiten: 'Als Name übernehmen' #Als Name übernehmen */
/* Bearbeiten: 'null' # */
/* Bearbeiten: 'Suchen' #Suchen */
/* Bearbeiten: 'Rechtschreibung und Grammatik' #Rechtschreibung und Grammatik */
/* Bearbeiten: 'Ersetzungen' #Ersetzungen */
/* Bearbeiten: 'Transformationen' #Transformationen */
/* Bearbeiten: 'Sprachausgabe' #Sprachausgabe */
/* Bearbeiten: 'Einfügen' #Einfügen */
/* Bearbeiten: 'null' # */
/* Bearbeiten: 'Diktat starten …' #Diktat starten … */
/* Bearbeiten: 'Emoji & Symbole' #Emoji & Symbole */
/* Daten: 'Neu' #Neu */
/* Daten: 'Neu mit Vorlage' #Neu mit Vorlage */
/* Daten: 'null' # */
/* Daten: 'Öffnen' #Öffnen */
/* Daten: 'In Tabs öffnen' #In Tabs öffnen */
/* Daten: 'Öffnen mit' #Öffnen mit */
/* Daten: 'null' # */
/* Daten: 'URL öffnen' #URL öffnen */
/* Daten: 'URL im Hintergrund öffnen' #URL im Hintergrund öffnen */
/* Daten: 'In Datenbank zeigen' #In Datenbank zeigen */
/* Daten: 'In Finder zeigen' #In Finder zeigen */
/* Daten: 'Per E-Mail senden' #Per E-Mail senden */
/* Daten: 'null' # */
/* Daten: 'Sichern' #Sichern */
/* Daten: 'Alles sichern' #Alles sichern */
/* Daten: 'Zur letzten Version...' #Zur letzten Version... */
/* Daten: 'Duplizieren' #Duplizieren */
/* Daten: 'null' # */
/* Daten: 'Verschieben...' #Verschieben... */
/* Daten: 'Ebenfalls verschieben' #Ebenfalls verschieben */
/* Daten: 'In Datenbank verschieben' #In Datenbank verschieben */
/* Daten: 'In externen Ordner verschieben' #In externen Ordner verschieben */
/* Daten: 'null' # */
/* Daten: 'Hinzufügen' #Hinzufügen */
/* Daten: 'null' # */
/* Daten: 'Markieren' #Markieren */
/* Daten: 'Wertung' #Wertung */
/* Daten: 'Etikett' #Etikett */
/* Daten: 'Tags' #Tags */
/* Daten: 'null' # */
/* Daten: 'Konvertieren' #Konvertieren */
/* Daten: 'OCR' #OCR */
/* Daten: 'Vorschaubilder' #Vorschaubilder */
/* Daten: 'null' # */
/* Daten: 'Gruppieren' #Gruppieren */
/* Daten: 'Ähnliche Objekte gruppieren' #Ähnliche Objekte gruppieren */
/* Daten: 'Auflösen' #Auflösen */
/* Daten: 'Einordnen' #Einordnen */
/* Daten: 'null' # */
/* Daten: 'In den Papierkorb legen' #In den Papierkorb legen */
/* Daten: 'Alle Replikanten in Papierkorb legen' #Alle Replikanten in Papierkorb legen */
/* Format: 'Schrift' #Schrift */
/* Format: 'Stil' #Stil */
/* Format: 'Ausrichtung' #Ausrichtung */
/* Format: 'Lineal' #Lineal */
/* Format: 'null' # */
/* Format: 'Hervorhebung' #Hervorhebung */
/* Format: 'Hervorhebungsfarbe' #Hervorhebungsfarbe */
/* Format: 'null' # */
/* Format: 'Link erzeugen' #Link erzeugen */
/* Format: 'Link hinzufügen...' #Link hinzufügen... */
/* Format: 'Zeilenabstand...' #Zeilenabstand... */
/* Format: 'Liste…' #Liste… */
/* Format: 'Tabelle…' #Tabelle… */
/* Format: 'null' # */
/* Format: 'In reinen Text umwandeln' #In reinen Text umwandeln */
/* Format: 'Mit Silbentrennung' #Mit Silbentrennung */
/* Format: 'Layout vertikal ausrichten' #Layout vertikal ausrichten */
/* Format: 'null' # */
/* Format: 'Formatleiste einblenden' #Formatleiste einblenden */
/* Format: 'Bearbeitungsleiste einblenden' #Bearbeitungsleiste einblenden */
/* Format: 'null' # */
/* Format: 'Farben zeigen' #Farben zeigen */
/* Format: 'Steuerzeichen zeigen' #Steuerzeichen zeigen */
/* Werkzeuge: 'Informationen' #Informationen */
/* Werkzeuge: 'Inspektoren' #Inspektoren */
/* Werkzeuge: 'Filter' #Filter */
/* Werkzeuge: 'null' # */
/* Werkzeuge: 'Anmerken' #Anmerken */
/* Werkzeuge: 'Modus' #Modus */
/* Werkzeuge: 'null' # */
/* Werkzeuge: 'Erfassen' #Erfassen */
/* Werkzeuge: 'Stempel' #Stempel */
/* Werkzeuge: 'PDF-Dokument' #PDF-Dokument */
/* Werkzeuge: 'Tabellen' #Tabellen */
/* Werkzeuge: 'null' # */
/* Werkzeuge: 'Rechts drehen' #Rechts drehen */
/* Werkzeuge: 'Links drehen' #Links drehen */
/* Werkzeuge: 'null' # */
/* Werkzeuge: 'Horizontal spiegeln' #Horizontal spiegeln */
/* Werkzeuge: 'Vertikal spiegeln' #Vertikal spiegeln */
/* Werkzeuge: 'null' # */
/* Werkzeuge: 'Ausgabenbericht erstellen' #Ausgabenbericht erstellen */
/* Werkzeuge: 'Hervorhebungen zusammenfassen' #Hervorhebungen zusammenfassen */
/* Werkzeuge: 'Inhaltsverzeichnis erstellen' #Inhaltsverzeichnis erstellen */
/* Werkzeuge: 'Metadaten-Übersicht erstellen' #Metadaten-Übersicht erstellen */
/* Werkzeuge: 'Objekte vereinen' #Objekte vereinen */
/* Werkzeuge: 'Objekte vereinen & löschen' #Objekte vereinen & löschen */
/* Werkzeuge: 'PDF in Kapitel aufteilen' #PDF in Kapitel aufteilen */
/* Werkzeuge: 'Dokument aufteilen' #Dokument aufteilen */
/* Werkzeuge: 'null' # */
/* Werkzeuge: 'Regeln anwenden' #Regeln anwenden */
/* Werkzeuge: 'Regeln ausführen' #Regeln ausführen */
/* Werkzeuge: 'Stapelverarbeitung...' #Stapelverarbeitung... */
/* Werkzeuge: 'null' # */
/* Werkzeuge: 'Notiz schreiben…' #Notiz schreiben… */
/* Werkzeuge: 'Server starten' #Server starten */
/* Darstellung: 'Seitenleiste' #Seitenleiste */
/* Darstellung: 'Navigation' #Navigation */
/* Darstellung: 'Leseliste' #Leseliste */
/* Darstellung: 'Import' #Import */
/* Darstellung: 'Extras' #Extras */
/* Darstellung: 'null' # */
/* Darstellung: 'Darstellung' #Darstellung */
/* Darstellung: 'Symbole' #Symbole */
/* Darstellung: 'Liste' #Liste */
/* Darstellung: 'Spalten' #Spalten */
/* Darstellung: 'Cover Flow' #Cover Flow */
/* Darstellung: 'null' # */
/* Darstellung: 'Vorschau' #Vorschau */
/* Darstellung: 'Keine' #Keine */
/* Darstellung: 'Standard' #Standard */
/* Darstellung: 'Breitbild' #Breitbild */
/* Darstellung: 'null' # */
/* Darstellung: 'Übersicht von „Neuer reiner Text 1“' #Übersicht von „Neuer reiner Text 1“ */
/* Darstellung: 'Diashow „Neuer reiner Text 1“' #Diashow „Neuer reiner Text 1“ */
/* Darstellung: 'null' # */
/* Darstellung: 'Tags einblenden' #Tags einblenden */
/* Darstellung: 'Details einblenden' #Details einblenden */
/* Darstellung: 'Nur Dokumente anzeigen' #Nur Dokumente anzeigen */
/* Darstellung: 'null' # */
/* Darstellung: 'Listenspalten' #Listenspalten */
/* Darstellung: 'Sortieren' #Sortieren */
/* Darstellung: 'null' # */
/* Darstellung: 'Gesamter Bildschirm' #Gesamter Bildschirm */
/* Darstellung: 'Zoom' #Zoom */
/* Darstellung: 'null' # */
/* Darstellung: 'Dokument-Darstellung' #Dokument-Darstellung */
/* Darstellung: 'PDF-Darstellung' #PDF-Darstellung */
/* Darstellung: 'null' # */
/* Darstellung: 'Symbolleiste ausblenden' #Symbolleiste ausblenden */
/* Darstellung: 'Symbolleiste anpassen...' #Symbolleiste anpassen... */
/* Gehe zu: 'Vorherige Datenbank' #Vorherige Datenbank */
/* Gehe zu: 'Nächste Datenbank' #Nächste Datenbank */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Oberste Gruppe' #Oberste Gruppe */
/* Gehe zu: 'Übergeordnete Gruppe' #Übergeordnete Gruppe */
/* Gehe zu: 'Ausgewählte Gruppe' #Ausgewählte Gruppe */
/* Gehe zu: 'Zu Gruppe...' #Zu Gruppe... */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Zurück' #Zurück */
/* Gehe zu: 'Vorwärts' #Vorwärts */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Erstes Dokument' #Erstes Dokument */
/* Gehe zu: 'Vorheriges Dokument' #Vorheriges Dokument */
/* Gehe zu: 'Nächstes Dokument' #Nächstes Dokument */
/* Gehe zu: 'Letztes Dokument' #Letztes Dokument */
/* Gehe zu: 'Zu Dokument...' #Zu Dokument... */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Vorherige Instanz' #Vorherige Instanz */
/* Gehe zu: 'Nächste Instanz' #Nächste Instanz */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Vorherige Hervorhebung' #Vorherige Hervorhebung */
/* Gehe zu: 'Nächste Hervorhebung' #Nächste Hervorhebung */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Nächstes ungelesenes Objekt' #Nächstes ungelesenes Objekt */
/* Gehe zu: 'Komplette Nachricht' #Komplette Nachricht */
/* Gehe zu: 'Gehe zu Seite...' #Gehe zu Seite... */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Favoriten' #Favoriten */
/* Gehe zu: 'null' # */
/* Gehe zu: 'Arbeitsumgebungen' #Arbeitsumgebungen */
/* Gehe zu: 'Hinzufügen...' #Hinzufügen... */
/* Gehe zu: 'Bearbeiten...' #Bearbeiten... */
/* Gehe zu: 'Aktualisieren' #Aktualisieren */
/* Fenster: 'Schließen' #Schließen */
/* Fenster: 'Alle schließen' #Alle schließen */
/* Fenster: 'Zoomen' #Zoomen */
/* Fenster: 'Alle zoomen' #Alle zoomen */
/* Fenster: 'Fenster auf die linke Seite des Bildschirms bewegen' #Fenster auf die linke Seite des Bildschirms bewegen */
/* Fenster: 'Fenster auf die rechte Seite des Bildschirms bewegen' #Fenster auf die rechte Seite des Bildschirms bewegen */
/* Fenster: 'Im Dock ablegen' #Im Dock ablegen */
/* Fenster: 'Alle im Dock ablegen' #Alle im Dock ablegen */
/* Fenster: 'null' # */
/* Fenster: 'Neuer Tab' #Neuer Tab */
/* Fenster: 'Tab schließen' #Tab schließen */
/* Fenster: 'Nächsten Tab auswählen' #Nächsten Tab auswählen */
/* Fenster: 'Vorherigen Tab auswählen' #Vorherigen Tab auswählen */
/* Fenster: 'null' # */
/* Fenster: 'Aktivität' #Aktivität */
/* Fenster: 'Download Manager' #Download Manager */
/* Fenster: 'Protokoll' #Protokoll */
/* Fenster: 'null' # */
/* Fenster: 'Alle nach vorne bringen' #Alle nach vorne bringen */
/* Fenster: 'Aufräumen' #Aufräumen */
/* Fenster: 'null' # */
/* Fenster: 'Eingang — "Neuer reiner Text 1"' #Eingang — "Neuer reiner Text 1" */
/* null: 'Skript-Ordner öffnen' #Skript-Ordner öffnen */
/* null: 'Weitere Skripte …' #Weitere Skripte … */
/* null: 'null' # */
/* null: 'Ausführen' #Ausführen */
/* null: 'Bearbeiten' #Bearbeiten */
/* null: 'Bilder' #Bilder */
/* null: 'Daten' #Daten */
/* null: 'Download' #Download */
/* null: 'Exportieren' #Exportieren */
/* null: 'Feeds' #Feeds */
/* null: 'Format' #Format */
/* null: 'Importieren' #Importieren */
/* null: 'Kommentare' #Kommentare */
/* null: 'Tabellen' #Tabellen */
/* null: 'Tabs' #Tabs */
/* null: 'Umbenennen' #Umbenennen */
/* null: 'Vorschaubilder' #Vorschaubilder */
/* null: 'Wiedervorlage' #Wiedervorlage */
/* Hilfe: 'null' #null */
/* Hilfe: 'DEVONthink 3 Hilfe' #DEVONthink 3 Hilfe */
/* Hilfe: 'Erweiterungen & Bookmarklets' #Erweiterungen & Bookmarklets */
/* Hilfe: 'Release Notes' #Release Notes */
/* Hilfe: 'null' # */
/* Hilfe: 'Ihr Kundenkonto' #Ihr Kundenkonto */
/* Hilfe: 'Support-Assistent' #Support-Assistent */
/* Hilfe: 'Einführungen' #Einführungen */
/* Hilfe: 'null' # */
/* Hilfe: 'DEVONtechnologies' #DEVONtechnologies */
/* Hilfe: 'Anwenderforum' #Anwenderforum */
/* Hilfe: 'Kontakt' #Kontakt */
/* Hilfe: 'Fehler melden' #Fehler melden */

Thanks so much for this. I will have to spend some time investigating but this should solve my problem.