Centrum skryptów - Systemy operacyjne

Jak sprawdzić, czy osoba z moich kontaktów ma urodziny w tym miesiącu?

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 sprawdzić, czy osoba z moich kontaktów ma urodziny w tym miesiącu?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak sprawdzić, czy ktoś z moich kontaktów ma urodziny w tym miesiącu?

-- VG

Cześć Skrypciarze! Odpowiedź

Cześć, VG. Urodziny to ważna sprawa, nikt nie lubi, kiedy się o nich zapomina. Nie lubią tego zwłaszcza jubilaci (a jeżeli zapomina o nich najbliższe otoczenie, to już w ogóle klapa), ale zapominania o urodzinach nie lubią też osoby, które szczególnie powinny o nich pamiętać. Najgorsze w tym jest dowiedzieć się już po fakcie, głupio się tłumaczyć (bo jak tu się mądrze wytłumaczyć, że się zapomniało o urodzinach np. teściowej) i próbować się jakoś zrehabilitować. Zapominalskim proponujemy lecytynę, a tym, którzy planują urodziny przyjaciół, znajomych, kolegów z dużym wyprzedzeniem, proponujemy skrypt, który powie nam, która osoba z naszych kontaktów obchodzi urodziny w tym miesiącu. Oto on:

Zanim wyjaśnimy, jak działa ten skrypt, zauważmy, iż założenie jest takie, że wszystkie nasze kontakty znajdują się w tym samym folderze. Jeżeli tak nie jest, jeżeli w głównym folderze kontaktów znajdują się jeszcze podfoldery, cóż, skrypt nie zadziała dla wszystkich: przekaże nam informacje o kontaktach znajdujących się w głównym folderze, pominąwszy kontakty zapisane w podfolderach. Jeżeli mamy kontakty w podfolderach, będziemy musieli napisać rekurencyjną funkcję, która będzie miała dostęp do informacji znajdujących się w tych podfolderach. Jak to zrobić? Cóż, nie jest to łatwe. Jednak przykład rekurencyjnej funkcji współpracującej z programem Microsoft Outlook można znaleźć w archiwum artykułów Cześć Skrypciarze!.

Wróćmy do samego skryptu. Zaczynamy od instrukcji On Error Resume Next. Nie jest to narzędzie, które często stosujemy w naszych skryptach, jednak w przypadku urodzin kontaktów trafiają się czasami błędy. Nie mamy pewności, skąd biorą się te błędy, jednak widząc, jak radzi sobie z nimi instrukcja On Error Resume Next, po prostu przestaliśmy się nimi przejmować. Jeżeli kiedyś wrócimy do tego tematu i głębiej mu się przyjrzymy, na pewno o tym napiszemy.

Nie chcąc przedłużać chwil oczekiwania...

Po uruchomieniu obsługi błędów, określamy stałą o nazwie olFolderContacts; zastosujemy tę stałą do wskazania naszemu skryptowi, z którym folderem programu Outlook będziemy pracować. Następnie, za pomocą poniższych dwóch wierszy kodu tworzymy wystąpienie obiektu Outlook.Application i łączymy się z przestrzenią nazw MAPI:

Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Należy także zauważyć, że ten skrypt zakłada wcześniejsze uruchomienie programu Outlook. Ale co w wypadku, gdy program Outlook nie jest uruchomiony? Mamy problem. Ale w archiwum Office Space (j.ang.) możemy znaleźć przykładowy skrypt, który określa, czy program Outlook został uruchomiony czy nie (jeżeli nie, należy go uruchomić).

Teoretycznie, możliwe byłoby utworzenie skomplikowanego filtra, automatycznie odrzucającego kontakty, które nie mają urodzin w tym miesiącu. Prawdę mówiąc, za dużo z tym sposobem zachodu. W tym samym czasie (i o wiele prościej) można sprawdzić urodziny każdego kontaktu z osobna. Dlatego też naszym następnym krokiem jest zastosowanie następującego wiersza kodu do pobrania kolekcji wszystkich kontaktów znajdujących się w folderze Contacts:

Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items

Co zrobimy z taką kolekcją? Zabawne, że o to pytacie. Na początek, uruchamiamy pętlę For Each, która przejdzie przez całą kolekcję. Dla każdego kontaktu z tej kolekcji zastosujemy poniższy wiersz kodu, aby określić, czy ma on urodziny w bieżącym miesiącu:

If Month(objContact.Birthday) = Month(Date) Then

Zastosujemy teraz polecenie Month(objContact.Birthday), aby określić wartość numeryczną miesiąca, w którym kontakt ma urodziny (1 dla stycznia, 2 dla lutego, 3 dla marca, etc.). Następnie porównujemy tę wartość z bieżącym miesiącem; do tego posłuży nam funkcja Month(Date). Jeżeli wartości się zgadzają, kontakt ma urodziny w tym miesiącu. Teraz z kolei wywołujemy echo informacji o nazwie kontaktu i dacie urodzin:

Wscript.Echo objContact.FullName, objContact.Birthday

Jeżeli natomiast wartości miesięcy się nie zgadzają, uruchamiamy pętlę i sprawdzamy następny kontakt w kolekcji.

Po zakończeniu, powinniśmy otrzymać raport podobny do poniższego (zakładając, że skrypt uruchamiamy w marcu):

Jonathan Haas 3/28/1977

Ken Myer 3/21/1938

Pilar Ackerman 3/14/1968

Należy zwrócić uwagę na jeszcze jedną rzecz. Jeżeli nie określiliśmy daty urodzin dla jakiegoś kontaktu, program Outlook automatycznie przypisze tej osobie datę urodzin 01.01.4501. Oznacza to, że każdy kontakt, któremu nie przypisaliśmy daty urodzin zostanie wskazany przez skrypt jako osoba mająca urodziny w styczniu. Będzie tak, dopóki nie uruchomimy zmodyfikowanego skryptu, który ignoruje osoby z przypisaną datą urodzin 01.01.4501:

On Error Resume Next



Const olFolderContacts = 10



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")



Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items



For Each objContact In colContacts    

    If objContact.Birthday <> #1/1/4501# Then

        If Month(objContact.Birthday) = Month(Date) Then

            Wscript.Echo objContact.FullName, objContact.Birthday

        End If

    End If

Next

Z takim skryptem na pewno nie zapomnimy o niczyich urodzinach.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne