Centrum skryptów - Microsoft office

Jak pobrać listę terminów dla danego miesiąca?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak pobrać listę terminów dla danego miesiąca?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Jak mogę uzyskać listę swoich terminów dla danego miesiąca (na przykład wszystkich terminów w grudniu 2007 r.)?

-- HG

Cześć Skrypciarze! Odpowiedź

Cześć, HG. Zajmę się tym pytaniem już za chwilkę. Zanim jednak to zrobię, chciałbym spędzić jeszcze trochę czasu rozkoszując się ostatnimi dniami sierpnia (czyli zarazem ostatnimi dniami lata). A jest się czym rozkoszować, przecież mieliśmy cudowne lato. Pamiętacie, jakie były temperatury w ostatni weekend. Upały tego lata były takie, że nie sposób było usiedzieć w domu bez włączonego wiatraka. Robiłem często sztuczny przeciąg, a i tak powietrze stało w miejscu. Jedynie wieczorami pojawiały się burze, albo tylko straszyły. Ale te wieczorne burze były przecież bardzo potrzebne, w końcu nic tak nie oczyszcza dusznej atmosfery jak trochę deszczu.

Czując na twarzy ostatnie promienie letniego słońca i zapowiedź jesiennego wiatru podsumujmy mijające lato za pomocą skryptu pobierającego listę terminów na zimowy grudzień 2007.

Skryptu takiego, jak ten poniżej:

Const olFolderCalendar = 9



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objFolder = objNamespace.GetDefaultFolder(olFolderCalendar)



Set colItems = objFolder.Items



strFilter = "[Start] >= '07-12-01' AND [Start] <= '07-12-31'"

Set colFilteredItems = colItems.Restrict(strFilter)



For Each objItem In colFilteredItems

    If objItem.Start > Now Then

        Wscript.Echo "Meeting name: " & objItem.Subject

        Wscript.Echo "Meeting date: " & objItem.Start

        Wscript.Echo "Duration: " & objItem.Duration & " minutes"

        Wscript.Echo "Location: " & objItem.Location

        Wscript.Echo

    End If

Next

Jak widzimy, zaczynamy od zdefiniowania stałej o nazwie olFolderCalendar i nadajemy jej wartość 9; dzięki tej stałej skrypt będzie wiedział, z którym folderem programu Outlook chcemy się połączyć. (Jak by nie było, naprawdę chcemy się połączyć z folderem Calendar. Po zdefiniowaniu stałej tworzymy wystąpienie obiektu Outlook.Application, a następnie stosujemy metodę GetNamespace w celu połączenia się z przestrzenią nazw MAPI, która (na wypadek, gdyby ktoś się zastanawiał) jest jedyną przestrzenią nazw, z którą możemy się połączyć.

Uwaga. Jeżeli przestrzeń nazw MAPI jest jedyną przestrzenią nazw, z jaką możemy się połączyć, to czy w ogóle musimy się z nią łączyć? Dlaczego więc nie łączymy się z przestrzenią nazw MAPI automatycznie? Jest tak dlatego, że ..., że... dlatego... bo tak!

Kiedy już mamy połączenie z przestrzenią nazw MAPI, wywołujemy metodę GetDefaultFolder, która łączy nas z kalendarzem programu Outlook (zauważmy, że przekazujemy metodzie GetDefaultFolder stałą olFolderCalendar utworzoną na początku skryptu):

Set objFolder = objNamespace.GetDefaultFolder(olFolderCalendar)

W tym momencie możemy pobrać kolekcję wszystkich terminów, po prostu tworząc odniesienie obiektu do właściwości Items folderu w poniższy sposób:

Set colItems = objFolder.Items

Proste, prawda? Ale na tym zabawa się kończy: trzeba w końcu popracować. (Nie ma się jednak co martwić. Popracujemy tylko trochę) Jak pewnie pamiętacie, nie jesteśmy zainteresowani kolekcją wszystkich naszych terminów; obchodzą nas jedynie te zaplanowane terminy, które będą miały miejsce w grudniu 2007. Dlatego też, w celu ograniczenia naszej kolekcji do terminów zaplanowanych na grudzień 2007, musimy zastosować w kolekcji filtr Filter, co zrobimy za pomocą poniższych dwóch wierszy kodu:

wierszy kodu:

strFilter = "[Start] >= '07-12-01' AND [Start] <= '12/31/2007'"

Set colFilteredItems = colItems.Restrict(strFilter)

Co się tutaj dzieje? No cóż, w pierwszym wierszu ustawiamy kryteria dla filtra: chcemy pobrać tylko te wartości, w przypadku których wartość właściwości Start (zauważcie, że nazwy właściwości powinny być załączone w nawiasach kwadratowych) to co najmniej 1 grudnia 2007 (07-12-01) oraz dla których wartość właściwości Start jest mniejsza lub równa 31 grudnia 2007 (12/31/2007). Co nam to da? Otrzymamy tylko te terminy, które mają miejsce (czyli zaczynają się) w grudniu 2007.

W drugim wierszu kodu po prostu wywołujemy metodę Restrict, przekazując utworzony filtr (reprezentowany przez zmienną o nazwie strFilter). Dzięki temu otrzymamy całkiem nową kolekcję składającą się z tylko tych terminów, które mają miejsce w grudniu 2007. W tym momencie wystarczy tylko uruchomić pętlę For Each, która przejdzie przez tę podkolekcję i wywoła echo niektórych kluczowych wartości właściwości terminów (takich, jak nazwa spotkania, data, czas trwania oraz miejsce):

For Each objItem In colFilteredItems

    If objItem.Start > Now Then

        Wscript.Echo "Meeting name: " & objItem.Subject

        Wscript.Echo "Meeting date: " & objItem.Start

        Wscript.Echo "Duration: " & objItem.Duration & " minutes"

        Wscript.Echo "Location: " & objItem.Location

        Wscript.Echo

    End If

Next

I to wszystko na ten temat.

Jeżeli chodzi o ten skrypt, należy pamiętać o jednej rzeczy, a mianowicie, że ten skrypt niekoniecznie pokaże cykliczne terminy wypadające na grudzień 2007; dzieje się tak dlatego, że program Outlook traktuje cykliczne terminy inaczej niż spotkania. Jeżeli pierwsze zdarzenie cyklicznego terminu ma miejsce w grudniu 2007, to zostanie onoe uwzględnione przez skrypt. Jeśli jednak pierwsze zdarzenie cyklicznego terminu miało miejsce wcześniej niż w grudniu 2007, no cóż, wtedy nic z tego. Wiem jednak, że HG nie interesowały cykliczne terminy, tylko jednorazowe spotkania. Jeżeli dla was stanowi to jakiś problem (tzn. jeżeli chcecie pobrać listę zawierającą także cykliczne terminy), zajrzyjcie do artykułu w witrynie Office Space – Retrieving a List of Recurring Appointments from Microsoft Outlook (j.ang.), może on wam pomoże.

Office Outlook 2007. jeżeli zastosujecie ten skrypt w programie Outlook 2007, zobaczycie niektóre cykliczne spotkania wypadające na grudzień 2007. Zobaczycie jednak tylko te cykliczne terminy, których pierwsze zdarzenie jeszcze nie miało miejsca. Ponadto, jako data spotkania (objItem.Start) podana będzie data pierwszego zdarzenia w terminie cyklicznym. Przykładowo, jeżeli mamy cykliczne spotkanie w pierwszy piątek każdego miesiąca, poczynając od października 2007 r., spotkanie zostanie uwzględnione jedynie na naszej pobranej liście grudniowych spotkań (ponieważ będzie tam spotkanie zaplanowane na 7 grudnia), ale data zostanie wyświetlona jako 5 października. Jeżeli pierwsza data tego terminu cyklicznego wypadała przeszłości (na przykład 1 czerwca 2007 r.), nie zobaczymy zdarzenia grudniowego.

Wiem, że wielu naszych czytelników jest zainteresowanych pobraniem listy rzeczywistych dat cyklicznych terminów (w przeciwieństwie do komunikatu mówiącego o tym, że dane spotkanie ma miejsce w każdy czwartek od teraz do stycznia 2008). Tą kwestią zajmiemy się w przyszłości w rubryce Cześć Skrypciarze. Ale nie dzisiaj. Dziś to jeszcze nie przyszłość.

A przynajmniej mam nadzieję, że jeszcze nie. Rzeczywistość i tak jest wystarczająco przygnębiająca. Prognoza temperatury też nie jest pokrzepiająca. Zapowiadają ochłodzenie.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft office