
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。私は、スクリプト センターで紹介されていた、Outlook の受信トレイ内にあるすべての添付ファイルを保存するスクリプトをテストしました。これはすばらしいスクリプトです。ですが、1 つ質問があります。このスクリプトを変更して、新しい電子メールだけを操作対象にすることはできますか。
-- CN

CN さん、こんにちは。Hey, Scripting Guy! コラムへようこそ。今回は、アイダホ州モスコーの美しい中心街にある La Quinta Inn からロケでお送りします。
何ですって。このコラムを執筆している Scripting Guy がアイダホ州モスコーの美しい中心街にある La Quinta Inn にいる理由ですか。もちろん、今日が Vandal Preview Day の日だからですよ。
当然でしょう・・・。
何ですって。Vandal Preview Day を知らないんですか。なんということでしょう。皆さんは、ここ数年間、洞窟にでも住んでいたんですか。
それはお気の毒に。私たちは、皆さんが、ようやくその洞窟から出ることができて、嬉しく思っています。きっと大変だったでしょうね。とにかく、説明していたとおり、Vandal Preview Day は、アイダホ大学 (アイダホ州モスコーの美しい中心街にあります) が主催する半年に 1 回のイベントです。入学を考えている学生とその両親が大学を訪れて、キャンパス ツアーを体験したり、学食で昼食を食べたり、それから、私たちが受け取った電子メールによると、お土産にお金を使ったりするというイベントです。お土産には、黒と金に彩られたアイダホ大学特製のレイなどがあります。
まあ、少なくとも、このレイをまだ持っていない人へのお土産にはいいかもしれません。
では、Scripting Guy 一家は、なぜ約 300 マイルも車を走らせて Vandal Preview Day に参加したのでしょうか (ええ、わかりました、インターネットによると、彼らの走行距離は 297.17 マイルです)。その質問にはお答えすることができます。答えは、Scripting Guy の息子が、来年アイダホ大学に入学することを真剣に考えているからです。Scripting Guy の息子が来年アイダホ大学に入学することを真剣に考えている理由ですか。それは難しい質問ですね。その答えについては、後で改めてお伝えする必要があります。
注 : アイダホ大学の “特色のあるカリキュラムが、知識を深めて世界をより良いものにする方法を探るまたとない機会を提供する” からかもしれないとお考えですか。違います。いとこが 2 人通っている大学だからというのが主な理由です。 |
ともかく、Scripting Guy 一家は今、無料のコンチネンタル ブレックファーストを食べに行こうとしているところで、それからキャンパスに向かうつもりです。でも、出掛ける前に少し時間をとって、Outlook の受信トレイ内にあるすべての添付ファイル (ただし新しい電子メールの添付ファイルのみ) を保存することができるスクリプトをご紹介したいと思います。
このようなスクリプトをご紹介することなくしては、アイダホ州モスコーの美しい中心街への旅は完璧なものになりませんからね。
スクリプトを以下に示します。
Const olFolderInbox = 6
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)
Set colItems = objFolder.Items
Set colFilteredItems = colItems.Restrict("[UnRead] = 'True'")
For Each objMessage In colFilteredItems
intCount = objMessage.Attachments.Count
If intCount > 0 Then
For i = 1 To intCount
objMessage.Attachments.Item(i).SaveAsFile "C:\Temp\" & _
objMessage.Attachments.Item(i).FileName
Next
End If
Next
私たちがこのスクリプトを記述し始めたときに直面した最大の問題は、どのようなものを新しい電子メールと見なし、どのようなものを新しい電子メールと見なさないかを決めることでした。私たちは、この最初のスクリプトを記述するに際しては、新しい電子メールとは単に未読の電子メールのことであると決めました。もちろん、「新しい電子メール = 特定の日付より後に受信した電子メール」という考え方も、十分理にかなっています。こちらの “新しい電子メール” の定義の方がお好きですか。でしたら、朗報があります。この後すぐに、特定の日付より後に受信した電子メールだけを操作対象とするスクリプトをご紹介します。
ですが、とりあえずは、(受信した日付にかかわらず) すべての未読メッセージの添付ファイルを保存するスクリプトについて説明します。この処理を実行するには、まず olFolderInbox という名前の定数を定義し、値を 6 に設定します。この定数は、操作対象とするメールボックス フォルダを Outlook に通知するために使用します。続いて、次の 3 行のコードを使用して、Outlook.Application オブジェクトのインスタンスを作成し、MAPI 名前空間にバインドし、受信トレイ フォルダへのオブジェクト参照を作成します。
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)
受信トレイ フォルダに接続したら、次のコード行を使用して、受信トレイ内にあるすべての電子メールのコレクションを取得します。
Set colItems = objFolder.Items
いいところに気が付きましたね。受信トレイ内にあるすべての電子メールが必要なわけではありませんよね。必要なのは、未読のメッセージだけです。ご心配なく。これを行うのが次のコード行です。
Set colFilteredItems = colItems.Restrict("[UnRead] = 'True'")
ここでは、Restrict メソッドを使用して、電子メールのコレクションにフィルタを適用しています。この場合は、返されるデータを、UnRead プロパティの値が True であるメッセージに限定しています。ご想像のとおり、UnRead プロパティの値が True であるということは、その電子メールは未読だということです。
注 : プロパティ名が角かっこで囲まれている理由ですか。いい質問ですね。正直なところ、私たちは「そういう決まりにになっているから」としかお答えできません。 少なくとも、ここアイダホでは、そうすることになっています。 |
フィルタ処理されたコレクション (colFilteredItems という名前を付けたコレクション) を取得したら、このコレクション内のすべての電子メールをループ処理する For Each ループを設定します。このループ内では、まず、次のようにして、コレクション内の最初のメッセージに添付されているファイルの数 (添付されている場合) を取得します。
intCount = objMessage.Attachments.Count
Count プロパティの値が 0 の場合は、メッセージにファイルが添付されていないということです。Count プロパティの値が 0 を超える場合は、メッセージに少なくとも 1 つのファイルが添付されているということです。これを念頭に置いて、次は、カウンタ変数の値が 1 から "そのメッセージに添付されているファイルの総数" までの間実行される For Next ループを設定します (ご存じのとおり、受信する電子メールには複数のファイルが添付されていることがあります)。続いて、添付ファイルごとに SaveAsFile メソッドを呼び出して、(添付ファイルの FileName プロパティの値を使用して) ファイルを C:\Temp フォルダに保存します。
objMessage.Attachments.Item(i).SaveAsFile "C:\Temp\" & _
objMessage.Attachments.Item(i).FileName
最初のメッセージの添付ファイルをすべて保存したら、ループ処理の先頭に戻り、コレクション内の次のメッセージについても同じ処理を繰り返します。
注 : ちなみに CN さんは、ファイルを保存する際にファイル名を変更する方法に関しても質問してくださったのですが、この質問には、またの機会にお答えする必要があります。 |
では、特定の日付より後に受信したすべての電子メールの添付ファイルを保存するスクリプトは、どのように記述すればよいでしょうか。返されるメッセージを、2007 年 10 月 1 日の 24 時以降に受信したメッセージに限定するサンプル スクリプトをご紹介します。
Const olFolderInbox = 6
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)
Set colItems = objFolder.Items
Set colFilteredItems = colItems.Restrict("[ReceivedTime] > '10/1/2007 12:00 AM'")
For Each objMessage In colFilteredItems
intCount = objMessage.Attachments.Count
If intCount > 0 Then
For i = 1 To intCount
objMessage.Attachments.Item(i).SaveAsFile "C:\Temp\" & _
objMessage.Attachments.Item(i).FileName
Next
End If
Next
どことなく見覚えがあるかもしれませんが、当然です。このスクリプトと最初にご紹介したスクリプトとの違いは、適用しているフィルタだけですからね。このスクリプトのフィルタは次のとおりです。
Set colFilteredItems = colItems.Restrict("[ReceivedTime] > '10/1/2007 12:00 AM'")
ご覧のとおり、ここでは、返されるメッセージを、ReceivedTime プロパティ (メッセージを受信した日時) の値が 10/1/2007 12:00 AM を超えるメッセージに限定しています。返されるメッセージを特定の期間内に受信したメッセージに限定するフィルタを適用することは可能か、ですって。もちろん可能です。2007 年 10 月 1 日または 2007 年 10 月 2 日に受信したメッセージ以外はすべて除外するフィルタを以下に示します。
Set colFilteredItems = colItems.Restrict _
("[ReceivedTime] > '10/1/2007 12:00 AM' AND [ReceivedTime] < '10/3/2007 12:00 AM'")
ええ、こうして 1 日中スクリプトの説明をしていてもよいのですが、そういうわけにもいきません。Vandal Preview Day に参加する時間が来てしまいました。このイベントの最も重要な部分が始まります。それは、「親が大学の授業料を工面する方法」という題名の講演です。
いいえ、自らの命を絶って生命保険金が息子の手に入るようにするという方法は選択肢として考えていません。
少なくとも今のところは。
ご参考までに言っておくと、このコラムを執筆している Scripting Guy がアイダホ大学について知っていることは 2 つだけです。1 つ目は、Scripting Guy の兄 (前述の 2 人のいとこの父親) によると、Vandals のマーチング バンドには “世界一おもしろいチューバ奏者” がいるということです。2 つ目は、Vandals のバスケットボールを応援する掛け声として人気があるのが次のようなものだということです。
I、D、A、H、O、アイダホ、アイダホ、ゴー、ゴー、ゴー!
今考えてみると、Vandal Preview Day にわざわざ来る意味はありませんでした。この学校にはおもしろいチューバ奏者がいて、バスケットボールを応援するための素敵な覚えやすい掛け声もあるということは既にわかっていたのです。それで十分ではありませんか。