Jak sprawdzić, czy osoba z moich kontaktów ma urodziny w tym miesiącu?
Skrypciarze odpowiadają na Wasze pytania
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! Jak sprawdzić, czy ktoś z moich kontaktów ma urodziny w tym miesiącu?
-- VG
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 |