Centrum skryptów - Microsoft offce

Jak utworzyć listę adresów znajdujących się w folderze elementów wysłanych i zapisać ją w arkuszu programu Excel?

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 utworzyć listę adresów znajdujących się w folderze elementów wysłanych i zapisać ją w arkuszu programu Excel?

Cześć Skrypciarze! Pytanie

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ść Skrypciarze! Odpowiedź

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 Do początku strony

Centrum skryptów - Microsoft offce