Jak utworzyć listę adresów znajdujących się w folderze elementów wysłanych i zapisać ją w arkuszu programu Excel?
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 utworzyć listę adresów znajdujących się w folderze elementów wysłanych i zapisać ją w arkuszu programu Excel?
Cześć, Skrypciarze! Jak pobrać listę wszystkich adresów e-mail ze skrzynki elementów wysłanych i zapisać je w arkuszu programu Excel?
-- RD
Cześć, RD. Muszę przyznać, że jestem dość rozkojarzony. To co prawda nic niezwykłego – zawsze jestem rozkojarzony – ale dzisiaj moje rozkojarzenie przyjęło rozmiary większe niż zazwyczaj, a poza tym mam powód. Otóż właśnie wróciłem z otwarcia sezonu uniwersyteckich rozgrywek futbolowych i wyobraźcie sobie, że Washington Huskies spuścili łomot 42-12 drużynie z Syracuse. Co więcej, Michigan nie dało rady drużynie z Appalachian State University, Washington State University poniósł sromotną klęskę z Wisconsin, a drużyna z Florida State University przegrała – czy można sobie wyobrazić lepszy tydzień?
Pewnie można, i zaraz powiem, jakie warunki musiałyby zostać spełnione. Otóż University of Oregon musiałby...
Uwaga redaktorki. Wycięłam jakieś 3 strony bełkotu niezrozumiałego dla cywilizowanego człowieka. Następnie przywróciłam wydajność Skrypciarza; najpierw myślałam, że jej spadek wiąże się z tym, że korzysta on ze starej wersji Office, ale nie – Office 2007 jest na miejscu, produktywność powinna sięgać zenitu. Cóż, ze Skrypciarzem jak ze starym telewizorem – zadziałały dopiero dwa uderzenia w potylicę. |
A zatem przedstawiam skrypt, o który prosi RD:
Const olSentMail = 5
Set objDictionary = CreateObject("Scripting.Dictionary")
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olSentMail)
Set colItems = objFolder.Items
For Each objItem in colItems
Set colRecipients = objItem.Recipients
For Each objRecipient in colRecipients
strAddress = objRecipient.Address
If Not objDictionary.Exists(strAddress) Then
objDictionary.Add strAddress, strAddress
End If
Next
Next
i = 1
For Each strKey in objDictionary.Keys
objWorksheet.Cells(i, 1) = strKey
i = i + 1
Next
Zobaczmy, czy uda się nam rozszyfrować działanie tego skryptu. Na początek definiujemy stałą o nazwie olSentMail i przypisujemy jej wartość 5; użyjemy jej do poinstruowania skryptu, z którym folderem programu Outlook chcemy pracować. Po zdefiniowaniu stałej tworzymy dwa obiekty: Scripting.Dictionary i Excel.Application. Chyba jest oczywiste, do czego użyjemy obiektu Excel.Application object; w końcu mamy zamiar zapisać pobrane adresy w arkuszu Excel. Do czego nam jednak słownik (Scripting.Dictionary)? Nie denerwujcie się. Za chwilę to wyjaśnimy.
Mając te dwa obiekty możemy zająć się paroma ustawieniami. Najpierw ustawiamy wartość właściwości Visible obiektu Excel na True; dzięki temu arkusz będzie widoczny na ekranie. Następnie uruchamiamy poniższe dwa wiersze kodu, które dodadzą do programu Excel nowy skoroszyt, a następnie połączą nas z pierwszym arkuszem w tym skoroszycie:
Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)
Po przygotowaniu programu Excel możemy przygotować i skonfigurować Microsoft Outlook W tym celu tworzymy wystąpienie obiektu Outlook.Application, a następnie używamy metody GetNamespace, by połączyć się z obszarem nazw MAPI . (Jak wiadomo, jest to jedyny obszar nazw, z jakim się możemy połączyć. Nie oznacza to jednak, że możemy pominąć kod odpowiedzialny za połączenie z tym obszarem.) Natychmiast po nawiązaniu połączenia łączymy się z folderem Elementy wysłane, wywołując metodę GetDefaultFolder i przekazując jej stałą olSentMail:
Set objFolder = objNamespace.GetDefaultFolder(olSentMail)
Pomijając, że trzeba się trochę nastukać w klawiaturę, pierwszych 9 czy 10 wierszy kodu jest w miarę prostych.
Teraz jednak trzeba zakasać rękawy i zabrać się za porządną robotę. Na początek używamy poniższego wiersza kodu do pobrania kolekcji wszystkich elementów (czyli wiadomości) znajdujących się w folderze Sent Items:
Set colItems = objFolder.Items
Teraz wykonujemy kolejny krok: uruchamiamy pętlę For Each, która przejdzie przez wszystkie elementy w kolekcji:
For Each objItem in colItems
Teraz sprawy się komplikują. Kiedy zabierałem się za rozwiązanie tego problemu, założyłem, że każda wiadomość (czyli każde wystąpienie obiektu MailItem programu Outlook) ma jakąś właściwość wskazującą, do kogo została ona wysłana – coś w rodzaju SentTo albo SentToAddress. Co ciekawe jednak, okazało się, że wcale nie – MailItem nie ma żadnej właściwości wskazującej adresata
Jak się okazuje, musimy uzyskać dostęp do kolekcji Recipients każdej wiadomości. Robimy to za pomocą poniższego wiersza kodu:
Set colRecipients = objItem.Recipients
Ponieważ jest to kolekcja (jak wiadomo, wiadomości często wysyła się do kilku osób), musimy uruchomić drugą pętlę For Each. Załatwia to poniższy wiersz kodu:
For Each objRecipient in colRecipients
Co się dzieje wewnątrz tej pętli? No cóż, najpierw pobieramy wartość właściwości Address i przypisujemy ją do zmiennej o nazwie strAddress:
strAddress = objRecipient.Address
Uwaga. Próba uzyskania dostępu do właściwości Address spowoduje, że Outlook wyświetli okno dialogowe z pytaniem o zgodę na uzyskanie dostępu do adresów. Aby skrypt zadziałał, należy zaznaczyć pole Zezwalaj na dostęp i kliknąć przycisk Tak, aby umożliwić skryptowi pobranie adresów. Kliknięcie Nie lub zignorowanie okna dialogowego spowoduje, że skrypt nie zadziała. Tak więc nie można uruchamiać go w sposób w pełni automatyczny. |
Kolejna część skryptu jest opcjonalna, ale, jak sądzę, przydatna. Najprawdopodobniej odbiorcy wiadomości powtarzają się wielokrotnie – jeśli wysłano 10 wiadomości na adres kenmyer@fabrikam.com, w arkuszu Excel będzie 10 takich adresów. Aby tego uniknąć, użyliśmy – uwaga, uwaga – obiektu Dictionary!
So how are we going to use the Dictionary object? Like this:
If Not objDictionary.Exists(strAddress) Then
objDictionary.Add strAddress, strAddress
End If
Używamy tu metody Exists, aby określić, czy dany adres e-mail odbiorcy (reprezentowany przez zmienną strAddress) nie jest już wpisany jako klucz obiektu Dictionary. Jeśli jest już wpisany, nie robimy nic (obiekt Dictionary nie pozwala zresztą na duplikowanie się kluczy). Jeśli jednak w słowniku nie ma danego adresu, stosujemy metodę Add, by go dodać, używając zmiennej strAddress zarówno jako klucza, jak i wartości elementu:
objDictionary.Add strAddress, strAddress
Uwaga. Jeśli nie wiecie, o co chodzi, kiedy używam takich pojęć, jak „klucz” czy „wartość elementu”, zajrzyjcie do tego rozdziału (j.ang.) przewodnika Microsoft Windows 2000 Scripting Guide lub do artykułu Sesame Script (j.ang.) dotyczącego używania obiektu Dictionary. |
Po zapisaniu odbiorców pierwszej wiadomości, powtarzamy ten proces dla kolejnej. Kiedy skończymy, obiekt Dictionary będzie zawierać listę unikalnych odbiorców, pobranych ze wszystkich wiadomości w skrzynce Elementy wysłanie. Teraz wystarczy tylko zapisać te informacje w arkuszu Excel:
i = 1
For Each strKey in objDictionary.Keys
objWorksheet.Cells(i, 1) = strKey
i = i + 1
Next
Jak widać, proces zapisywania danych w programie Excel zaczyna się od przypisania wartości 1 do zmiennej licznika o nazwie i; użyjemy jej do śledzenia bieżącego wiersza w arkuszu. Następnie uruchamiamy kolejną pętlę For Each, która przejdzie przez wszystkie klucze obiektu Dictionary:
For Each strKey in objDictionary.Keys
Do czego służy ta pętla? To proste – przypisujemy wartość klucza słownika (odpowiadającego, jak wiadomo, jednemu z adresów odbiorcy) do komórki i, 1. Oznacza to, że przy pierwszym przejściu pętli adres e-mail zostanie zapisany w komórce w wierszu 1 i kolumnie 1; pamiętajmy, że wartość zmiennej i wynosi na początku 1. Podnosimy wartość i o 1 (dzięki czemu kolejny adres e-mail zostanie zapisany w wierszu 2 i kolumnie 1), następnie powtarzamy działanie pętli i cały proces dla kolejnego klucza w słowniku. Po zakończeniu, jak się zapewne domyślacie, uzyskamy arkusz programu Excel zawierający wszystkie adresy pobrane z wiadomości w folderze Elementy wysłane.
Do początku strony |