schattengestait
Goto Top

Outlook Besprechung - Skript zum Einfügen von Standarddaten

Hallo zusammen,

ich suche schon seit längerem die Option, bei Outlook-Besprechungen Standard-Daten, die entweder ich einfüge oder die mir durch ein Zoom-Addon automatisch ausgefüllt werden, in das Textfeld einer Nachricht einzufügen.

Bei meiner Suche stieß ich auf diesen Post, befürchte aber, dass das Skript für meinen Ansatz nicht so viel bringen würde.

Automatische Anrede mit Name in Outlook beim Antworten auf Mails


Konkret würde ich mir gerne ein Skript erstellen, das auf die benötigten Daten aus derselben Mail zugreift und mir diese vorausfüllt. Gerne würde ich dabei lernen, wie das Skript funktioniert und wo es die Daten findet, um es für andere Themen umschreiben zu können. Meine Vorerfahrung liegt jedoch leider bei null.


Ein paar grundsätzliche Fragen:
Ist mein Vorhaben mit einem einfachen Skript möglich? Oder kommt das Skript gar nicht an die Daten aus der Eingabemaske heran?

Gibt es vielleicht ein Skript, das solche Funktionen in Teilen ausführt?

Gibt es irgendwo Anleitungen, die helfen, sich solche Skripte selbst zu basteln?

Wie heißen die Parameter in Codeform:
[Besprechungseinladung] [Datum aus Besprechungseinladung] [Zoom-Link aus Besprechungseinladung]
Wie kann ich einzelne Wörter aus dem Titel für die weitere Bearbeitung extrahieren?


Ich hatte auch darüber nachgedacht, solche Funktionen über eine Art Mausbot umzusetzen. Hierfür müsste aber die Fensterposition und -größe immer identisch sein und der Aufwand das zu bewerkstelligen wäre vermutlich nicht viel geringer als ein entsprechendes Skript. Zudem wäre ein Skript natürlich eine 'sauberere' Lösung.


Vielen Dank vorab für jegliche Unterstützung!
1

Content-ID: 32368078695

Url: https://administrator.de/forum/outlook-besprechung-skript-zum-einfuegen-von-standarddaten-32368078695.html

Ausgedruckt am: 02.04.2025 um 08:04 Uhr

colinardo
Lösung colinardo 03.07.2024, aktualisiert am 08.07.2024 um 11:35:40 Uhr
Goto Top
Servus @SchattengestaIt, willkommen auf Administrator.de!
Zitat von @SchattengestaIt:
Ein paar grundsätzliche Fragen:
Ist mein Vorhaben mit einem einfachen Skript möglich?
Ja, "einfach" kommt dann aber auf die Kenntnisse des Betrachters an face-smile.
Oder kommt das Skript gar nicht an die Daten aus der Eingabemaske heran?
Das ist kein Problem.
Gibt es vielleicht ein Skript, das solche Funktionen in Teilen ausführt?
s.u.
Gibt es irgendwo Anleitungen, die helfen, sich solche Skripte selbst zu basteln?
https://learn.microsoft.com/de-de/office/vba/outlook/concepts/getting-st ...
https://learn.microsoft.com/de-de/office/vba/outlook/concepts/getting-st ...
https://learn.microsoft.com/de-de/office/vba/api/overview/outlook/object ...
Wie heißen die Parameter in Codeform:
[Besprechungseinladung] [Datum aus Besprechungseinladung]
Für das aktuelle Element das aktiven Inspectors
ActiveInspector.CurrentItem.Start
[Zoom-Link aus Besprechungseinladung]
Für das aktuelle Element das aktiven Inspectors
ActiveInspector.CurrentItem.Location

Weitere mögliche Eigenschaften eines AppointmentItems kannst du hier nachschlagen
https://learn.microsoft.com/en-us/office/vba/api/outlook.appointmentitem ...

Wie kann ich einzelne Wörter aus dem Titel für die weitere Bearbeitung extrahieren?
Dafür gibt es mehrere Methoden, z.B. Splitten anhand von Zeichen, extrahieren über Zeichindizes oder Regular Expressions (zuverlässiger wenn sich Text unbekannt ändert, aber für Anfänger komplizierter zu Handhaben).

Habe dir für dein Vorhaben mal eine Vorlage geschrieben die du nach deinen Anforderungen anpassen kannst:
(Den Code solltest du nur ausführen wenn ein entsprechender Inspector geöffnet ist, kannst du dir z.B. auf einen Button legen).
Sub InsertStandardAppointmentBody()
    ' Variablen  
    Dim cInspector As Inspector, regex As Object, strClientName As String, strMessageType As String, strDate As String
    ' Objekte initialisieren  
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True
    ' aktiven Inspector finden  
    Set cInspector = Application.ActiveInspector
    If cInspector Is Nothing Then
       MsgBox "Kein Element offen!", vbExclamation  
       Exit Sub
    End If
    ' mit aktivem Element im Inspector arbeiten  
    With cInspector.CurrentItem
        ' elemente aus dem Subject mit Regex extrahieren  
        regex.pattern = "([^\s]+) für (.*)$"  
        ' regex pattern anwenden  
        Set match = regex.Execute(.subject)
        ' Fallback für Nutzername und Messagetype  
        strClientName = "User"  
        strMessageType = "Gespräch"  
        ' Wenn Regex-Match erfolgreich war  
        If match.Count > 0 Then
            ' Submatch 2 aus dem Regex dem Namen zuweisen  
            strClientName = match(0).submatches(1)
            ' Submatch 1 aus dem Regex dem Typen der Nachricht zuweisen  
            strMessageType = match(0).submatches(0) & "gespräch"  
        End If
        ' Standard-Datum formatieren  
        strDate = Format(.Start, "dddd, \d\e\n dd. mmmm \u\m hh:nn \U\h\r")  
        ' wenn das Datum heute ist formatiere das Datum um  
        If DateValue(.Start) = Date Then
            strDate = "heute um " & Format(.Start, "hh:nn")  
        End If
        ' Fülle den Inhalt des Bodies aus  
        .Body = "Hallo " & strClientName & "." & vbNewLine & vbNewLine & _  
                "hiermit erhalten sie die Einladung zu einem Zoom-Meeting für ein " & strMessageType & " mit Max Mustermann." & vbNewLine & vbNewLine & _  
                "Das Gespräch findet " & strDate & " statt." & vbNewLine & _  
                .Location & vbNewLine & vbNewLine & _
                "Herr Mustermann freut sich auf das gemeinsame Gespräch." & vbNewLine & vbNewLine & _  
                "Mit besten Grüßen"  
        .Save
    End With
End Sub

Code Ergebnis mit heutigem Beispiel Meeting:

screenshot

Viel Erfolg bei deinen ersten Gehversuchen in der Outlook-Automation mittels VBA!
Grüße Uwe
SchattengestaIt
SchattengestaIt 03.07.2024 um 17:14:13 Uhr
Goto Top
Wahnsinn!

Vielen herzlichen Dank schonmal für deine Mühe und deine detaillierten Antworten. Ich werde ein Weilchen brauchen, um mich in alles reinzulesen und dann auch souverän damit arbeiten zu können. Auch werde ich versuchen, erste Fragen erstmal selbst zu klären und berichte anschließend nochmal oder stelle Rückfragen.

An dieser Stelle auf jeden Fall schonmal vielen Dank für deine Zeit und das bereits ausgearbeitete Beispielskript.
SchattengestaIt
SchattengestaIt 07.07.2024 um 21:42:16 Uhr
Goto Top
Hallo colinardo,

ich habe mich heute einige Stunden hineingefuchst und kam auch schon zu einer praktikablen Lösung die folgendes kann:
- Unterscheidung Gesprächstypen (Update -> Updategespräch, Analyse femininer Artikel, Rest unverändert)
- Unterscheidung Zoom / vor Ort (Zoom-Meeting, findet via Zoom statt, folgender Link...)
- Unterscheidung Datum heute / Zukunft (quasi identisch zu deinem Vorschlag)

Sehr lange brauchte ich, um mit Redex zu indizieren und zu verstehen, welche Codeformen was tun. Das glaube ich jetzt für meine Zwecke verstanden zu haben.
Wo ich nicht weiter kam, ist die Extraktion der E-Mail Adressen. Unsere Mailadressen haben das Format vorname.nachname@unternehmensmail.de. Ich würde gerne im ersten Schritt die Mailadresse extrahieren und im zweiten den Vorname + Nachname für die Verwendung in der Nachricht optimieren (inkl. Umwandlung erster Buchstabe in groß).

Der zuständige Titel für das Feld ist wohl .Recipients, aber egal was ich damit machte, der Code funktionierte nicht mehr.
Auch die alleinige Verwendung von
With cInspector.CurrentItem
regex.Pattern = "([^\s]+)@unternehmensmail.de"  
Set match = regex.Execute(.Recipients)
If match.Count > 0 Then
            strGPMail = match(0).submatches(0)

brachte keinen Erfolg. Beim Einfügen der Mailadresse in der Betreffzeile hätte dieser Code den Namensteil der Mail extrahiert (= vorname.nachname).

Bei meiner Internetrecherche wurden jeweils unterschiedliche Codes verwendet, damit spuckte mir Outlook aber auch nichts aus. Gibt es da irgendeine einfachere Methode? Falls nein, welcher der folgenden Codes sollte grundsätzlich funktionieren?
https://stackoverflow.com/questions/12641704/how-do-you-extract-email-ad ...


Anbei mein bisheriger Code. Für Optimierungen im Code bin ich natürlich auch offen, damit er so sauber wie möglich ist.
Sub NAME_Terminbestätigung()
    ' Variablen  
    Dim cInspector As Inspector, regex As Object, strLocation, strLocation1, strLocation2, strLocation3, strMessageType, strDate As String
    ' Objekte initialisieren  
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True
    ' aktiven Inspector finden  
    Set cInspector = Application.ActiveInspector
    If cInspector Is Nothing Then
       MsgBox "Kein Element offen!", vbExclamation  
       Exit Sub
    End If
    ' mit aktivem Element im Inspector arbeiten  
    With cInspector.CurrentItem
        ' Fallback für alle Variablen  
        strLocation = "strLocation not found"  
        strLocation1 = "strLocation1 not found"  
        strLocation2 = "strLocation2 not found"  
        strLocation3 = "strLocation3 not found"  
        strMessageType = "Gespräch"  
        ' Elemente aus der Betreffzeile mit Regex extrahieren  
        ' ([^\s]+) Alle Zeichen außer Leerzeichen - nur ein Wortgebilde; (.*) = alle Zeichen // 3 Submatches werden gesucht  
        regex.Pattern = "([^\s]+): (.*) ([^\s]+) für"  
        Set match = regex.Execute(.Subject)
        ' Wenn Regex-Match erfolgreich war  
        If match.Count > 0 Then
            ' Submatch 1 aus dem Regex dem Einladungsort zuweisen  
            strLocation = match(0).submatches(0)
            ' Submatch 3 aus dem Regex dem Typen der Nachricht zuweisen  
            strMessageType = match(0).submatches(2)
        End If
        ' bei verschiedenen Gesprächstypen unterschiedlich umformen  
        If strMessageType = "Update" Then  
            strMessageType = " Updategespräch"  
        ElseIf strMessageType = "Wirtschaftsanalyse" Then  
            strMessageType = "e persönliche Wirtschaftsanalyse"  
        Else
            strMessageType = " " & strMessageType  
        End If
        ' Unterscheidung Zoom / nicht Zoom in Nachricht  
        If strLocation = "Zoom-Einladung" Then  
            strLocation1 = "zu einem Zoom-Meeting "  
            strLocation2 = "via Zoom statt."  
            strLocation3 = "Unter folgendem Link können Sie sich einwählen:"  
        Else
            strLocation1 = ""  
            strLocation2 = "persönlich statt."  
            strLocation3 = "Unter folgender Adresse finden Sie zu uns:"  
        End If
        ' Standard-Datum formatieren  
        strDate = Format(.Start, "\a\m dddd, \d\e\n dd. mmmm yyyy \u\m hh:nn \U\h\r")  
        ' wenn das Datum heute ist formatiere das Datum um  
        If DateValue(.Start) = Date Then
            strDate = "heute um " & Format(.Start, "hh:nn \U\h\r")  
        End If
        ' Fülle den Inhalt des Bodies aus - Name + Signatur manuell einfügen  
        .Body = "Sehr geehrte #####," & vbNewLine & vbNewLine & _  
                "hiermit erhalten sie die Einladung " & strLocation1 & "für ein" & strMessageType & " mit Ihrem Wirtschaftsberater NAME." & vbNewLine & vbNewLine & _  
                "Das Gespräch findet " & strDate & " " & strLocation2 & "" & vbNewLine & _  
                "" & strLocation3 & "" & vbNewLine & _  
                .Location & vbNewLine & vbNewLine & _
                "Herr NAME freut sich auf das gemeinsame Gespräch." & vbNewLine & vbNewLine & _  
                ""  
    End With
End Sub
colinardo
colinardo 08.07.2024 aktualisiert um 08:15:08 Uhr
Goto Top
Wo ich nicht weiter kam, ist die Extraktion der E-Mail Adressen.
Der zuständige Titel für das Feld ist wohl .Recipients, aber egal was ich damit machte, der Code funktionierte nicht mehr.
Recipients ist ein Array aus Recipient Objekten die bereits eine Eigenschaft namens Address besitzen, du musst hier also nicht mit Regex hantieren sondern kannst direkt auf die Mail-Adressen der Empfänger zugreifen
' ...  
Dim rec as Recipient
for each rec in .Recipients
    MsgBox rec.Address
Next
'...  
Auch auf die Anzeigenamen der Empfänger kannst du darin direkt zugreifen ohne sie extrahieren zu müssen, sofern sie im Recipient Objekt bereits vorhanden sind
https://learn.microsoft.com/en-us/office/vba/api/outlook.recipient.name

Grüße Uwe
SchattengestaIt
SchattengestaIt 08.07.2024 um 09:37:59 Uhr
Goto Top
Hallo Uwe,

ich stelle mich leider wohl recht blöd an. Egal, wo ich den Codeschnipsel einfüge, der Skript tut nichts mehr.

Dim rec as Recipient
habe ich ganz oben ergänzt (ohne Dim)

for each rec in .Recipients
    MsgBox rec.Address
Next
hätte ich dann direkt darunter eingefügt, aber auch innerhalb der Einbindung in "With cInspector.CurrentItem" geht der Skript nicht mehr.

Wie kann ich den Code einbinden, dass ich mit der Ausgabe der Schleife weiter arbeiten kann? Also beispielsweise entweder mit If (einfache Methode) oder mit einer Extraktion von vorname.nachname@mail.com?

Vielen Dank vorab für deine Hilfe...


Viele Grüße,
Daniel
SchattengestaIt
SchattengestaIt 08.07.2024 um 10:26:50 Uhr
Goto Top
Noch ein Nachtrag:

ich habe gerade das Skript erstmals verwendet - leider, ohne gleich nach der ersten Nachricht das Ergebnis zu prüfen.
Im Texteditor funktioniert alles wie erwartet. Ich füge Skript + Signatur ein und ergänze den Namen, anschließend sende ich. Beim Senden wird dann jedoch alles wieder zurückgesetzt und die vom Outlook-Plugin erstellte Ursprungsmail versandt.

Nur, wenn ich vorher alles kopiere und neu einfüge (Ctrl+C/Ctrl+V), wird der Text versandt.

Hast du eine Idee, wie ich dieses Verhalten unterbinden kann?