Læs Begivenheder i Outlook via Python

Outlook har nogle ting at ønske – som viser flere månedsvisning

Så jeg besluttede at give det en chance ved at trække ud tilfælde data via python (og derefter finde en måde at vise det pænt). Google giver mig pore resultater, men stackoverflow har været meget hjælpsomme tidligere i forbindelse med brug af win32com og outlook.

Mit mål er følgende

  • læse en fælles kalender
  • læse de begivenheder, information som start, slut, emne, creater osv

Jeg ikke har fået langt, men dette er hvad jeg fik sammen (med inspiration fra denne hjemmeside)

import win32com.client, datetime
from dateutil.relativedelta import relativedelta

Outlook = win32com.client.Dispatch("Outlook.Application")
ns = Outlook.GetNamespace("MAPI")

appointments = namespace.GetDefaultFolder(9).Items 
# TODO: Need to figure out howto get the shared calendar instead Default [9] 
# (I have placed the shared folder into a separate folder - don't know if it matters)
# I would just like the user to select which calendar to execute on
appointments.Sort("[Start]")
appointments.IncludeRecurrences = "True"
begin = date.today().strftime("%m%d%Y")
end = (date.today() + relativedelta( months = 3 )).strftime("%m%d%Y")
appointments = appointments.Restrict("[Start] >= '" +begin+ "' AND [END] >= '" +end+ "'")

Fra her jeg har brug for hjælp med at loope gennem arrangementer og læse dem. Enhver hjælp er meget værdsat.

Mente du ns.GetDefaultFolder(9) i stedet for namespace.? Jeg får en NameError hvis jeg forsøger at din kode.

OriginalForfatteren Norfeldt | 2014-01-31

1 svar

  1. 19

    Fra her jeg har brug for hjælp med at loope gennem arrangementer og læse dem.

    Dybest set, alt hvad du skal gøre er at følge de KOM API-dokumentation fra Microsoft. For eksempel, Restrict() metoden returnerer AppointmentItem objekter, som er dokumenteret på AppointmentItem Objekt til Outlook 2010. Så, med udgangspunkt i en mappe, du kan få, og en liste over de aftaler som følger:

    # Get the AppointmentItem objects
    # http://msdn.microsoft.com/en-us/library/office/aa210899(v=office.11).aspx
    appointments = someFolder.Items
    
    # Restrict to items in the next 30 days (using Python 3.3 - might be slightly different for 2.7)
    begin = datetime.date.today()
    end = begin + datetime.timedelta(days = 30);
    restriction = "[Start] >= '" + begin.strftime("%m/%d/%Y") + "' AND [End] <= '" +end.strftime("%m/%d/%Y") + "'"
    restrictedItems = appointments.Restrict(restriction)
    
    # Iterate through restricted AppointmentItems and print them
    for appointmentItem in restrictedItems:
        print("{0} Start: {1}, End: {2}, Organizer: {3}".format(
              appointmentItem.Subject, appointmentItem.Start, 
              appointmentItem.End, appointmentItem.Organizer))

    Bemærk, at jeg var nødt til at bruge et lidt anderledes format for begrænsning udtryk ("%m/%d/%Y" i stedet for "%m%d%Y"). Den rigtige løsning ville være at bruge Outlook Format funktion som dokumenteret ved http://msdn.microsoft.com/en-us/library/office/ff869597(v=kontor.14).aspx, afsnit Dato. Bemærk også, at jeg var ved hjælp af Python 3.3, så du måske nødt til at bruge forskellige funktioner til at oprette datoer. I alle tilfælde, med henblik på test, kan du bruge en hardcoded udtryk som "[Start] >= '02/03/2014' AND [End] <= '03/05/2014'"

    At få en fælles kalender, følgende kode skal arbejde – det er den sædvanlige rækkefølge, der findes i API-dokumentation, men jeg var ikke i stand til rent faktisk at få det til at virke, men det kunne være på grund af en anden backend server (ikke bruger en Exchange-server):

    recipient = namespace.createRecipient("User Name")
    resolved = recipient.Resolve()
    sharedCalendar = namespace.GetSharedDefaultFolder(recipient, 9)

    For at vise alle tilgængelige mapper som et træ, kan du bruge noget, som

    def folderTree(folders, indent = 0):
        prefix = ' ' * (indent*2)
        i = 0
        for folder in folders:
            print("{0}{1}. {2} ({3})".format(prefix, i, folder.Name, folder.DefaultItemType))
            folderTree(folder.Folders, indent + 1)
            i = i + 1
    
    ...
    folderTree(namespace.Folders)

    At se en mappe, der med sin vej (fx at finde mappen kalender “[email protected]” under “Internet Kalendere” folder), kan du bruge noget, som

    def findFolder(folders, searchPath, level = 0):
        for folder in folders:
            if folder.Name == searchPath[level]:
                if level < len(searchPath)-1:
                    # Search sub folder
                    folder = findFolder(folder.folders, searchPath, level+1)
                return folder
        return None
    
    ...
    sharedCalendar = findFolder(namespace.Folders, ["Internet Calendars", "[email protected]"])

    Se også:

    Tak for dit svar – så min begrænsning string kommando var forkert. Jeg finder det svært at forstå MS API. Hvordan ville jeg gå om at vælge en anden kalender end standard. At tro, at en løkke gennem navnene på alle kalendere, ville være rart.
    Jeg er enig i, at det KOM API er ikke let at læse – men dybest set, at modellen er enkel: Der er objekter, som har Metoder og Egenskaber (og Hændelser). Metoder, der kan kaldes og kan returnere et resultat, som en reference til et andet objekt. Egenskaber kan læses (og skrevet, hvis ikke read-only), og læsning kan resultere igen i referencer til et andet objekt. Nogle metoder/egenskaber vende tilbage KOM samlinger, som kan blive behandlet, som er problemfrit integreret i Python, så du kan bruge for ... in ....
    Det er ikke sådan, at jeg ikke prøve. Men kan bare ikke gøre din folderTree arbejde – som jeg har brug for at få fat i den kalender, der er af interesse. Jeg er ikke ved hjælp af klasser i python.
    for folder in ns.Folders: print folder.Name giver mig “Internet Kalendere” “SharePoint-Lister” “[email protected]
    Lad os sige, jeg ønsker at få fat i en kalender i “Internet Kalendere” – hvordan vil jeg definere en modtagerens navn som en streng, der griber en kalender i “Internet Kalendere” mappe

    OriginalForfatteren Andreas Fester

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *