前回は仕組みの概要を確認しました。
今回はVBSからOutlookの今日の予定一覧を取得し、指定条件の予定を検索するところまで進めます。
目次:
Outlookから今日の予定一覧を取得する
まずはOutlookから今日の予定一覧を取得しましょう。
今日の予定一覧を取得するコード
' 今日の予定一覧を取得します Function getTodaySchedule(ByRef colAppts,Byval addCase) ' Outlookオブジェクト格納用 Dim oApp Set oApp = CreateObject("Outlook.Application") Dim myNameSpace Set myNameSpace = oApp.GetNamespace("MAPI") '範囲を考える Dim STDATE Dim ENDATE STDATE = Date ENDATE = DateAdd("d", 1, STDATE) ' 9=規定のフォルダを取得 Set colAppts = myNameSpace.GetDefaultFolder(9).Items colAppts.Sort "[Start]" colAppts.IncludeRecurrences = True '定期的な予定があってもこの行で取得可能! ' 今日の予定を取得する Set getTodaySchedule = colAppts.Find("[Start] >= '" & STDATE & "' AND [Start] < '" & ENDATE & "'" & addCase) End Function
何度か使う処理なので関数を定義します。
このコードでアクセスしているのはOutlookで規定の予定表に設定されている予定表です。
関数の引数について
- colAppts
今日の予定一覧を格納します。
この関数はあくまで今日の予定一覧を取得するだけで、休憩時間の検索などは呼び出し元で実装します。 - addCase
今日の予定一覧はItemsObjectのFind関数で取得します。
この関数は検索条件を文字列で指定します。
今日の予定一覧中の終日予定だけが欲しい場合など、条件を追加したい場合はこの引数で追加します。
戻り値について
関数の戻り値は今日の予定一覧の最初の予定を返します。
Outlookの規定の予定表の確認方法
今回のコードではOutlookの規定の予定表から今日の予定一覧を取得しています。Outlookで規定の予定表は下記の方法で確認できます。
現在の予定が休憩中か判断する(使用例)
予定の組み方は人によって違うと思います。
私は予定の種類によって色分けをしたかったので、Outlookの分類(カテゴリ)を使用しています。分類を確認すると休憩中かわかります。
ここでは予定の分類で休憩時間か判断する方法を使用例として載せておきます。
検索条件については、自分の環境に合わせてカスタマイズしてみてください。
Outlookでは休憩時間に「4-」睡眠に「9-」という分類をつけています。
Outlookの分類は予定ItemObjectの「category」プロパティで取得します、分類を複数指定した場合「category」には分類名が「,」区切りで入ります。そのため「category」の判定には正規表現を使用し、カテゴリ名が含まれるかを判断します。
休憩中か判断する処理の呼び出し元
休憩中の判定をするときは、事前に正規表現のパターンを定義します。
下のコードで「”^.4-.$”」「”^.9-.$”」としているところが正規表現のパターンです。
Option Explicit 'オブジェクトを生成 Dim objWsh Set objWsh = WScript.CreateObject("WScript.Shell") ' カテゴリ確認用の正規表現を準備 Dim rePattern1,rePattern2 Set rePattern1 = CreateObject("VBScript.RegExp") Set rePattern2 = CreateObject("VBScript.RegExp") rePattern1.Pattern = "^.*4-.*$" rePattern2.Pattern = "^.*9-.*$" ' 休憩中かを確認 if check_DuringBreakTime <> 0 Then ' 休憩中の場合はロックアウトを実行して終了 objWsh.Run "sysLockWorkStation.vbs 0",0 WScript.Quit() End if
現在の予定が正規表現のパターンに合致するか判断するコード
正規表現のパターンは、グローバルスコープで定義しているのでそちらを直接参照しています。
' -------------------------------------------------------------------------------- ' 現在の予定が休憩(4-)・睡眠(9-)であるかを確認する ' 休憩=4 睡眠=9を返す。それ以外の場合は0を返す ' -------------------------------------------------------------------------------- Function check_DuringBreakTime() check_DuringBreakTime = 0 Dim colAppts ' 今日の予定を取得する Dim todayAppts Set todayAppts = getTodaySchedule(colAppts,"") Do While Not todayAppts Is Nothing ' 現在進行中の予定を探します If todayAppts.Start <= Now And todayAppts.End >= Now Then if rePattern1.test(todayAppts.Categories) Then check_DuringBreakTime = 4 Elseif rePattern2.test(todayAppts.Categories) Then check_DuringBreakTime = 9 Else Exit Do End if End If Set todayAppts = colAppts.FindNext Loop End Function
今後の課題
グローバルスコープでのパターン定義は可読性の面からも問題があります。
また、別の情報を調査している際に、Outlookの分類はFind関数の条件として指定ができるという内容を見つけました。
サンプルコードが連絡帳を探しているのですが、Find関数の使い方としては同じ様です。予定表にも当てはまるのか検証してみたいところですね。
上記の使用例のコードはFind関数を使用する方向で、そのうち整理したいと思います。
この記事で必要なコードがすべて出揃ったわけではありませんが、仕組みを説明するためには順を追う必要があります。
ここではこれらのコードを「scdlCheckBreakTimeSchedule.vbs」として保存しておきましょう。
全文を先に確認したい方は第5回をご参照ください。
今回はここまでです。
今回の仕組み必要なステップは下記になります。
この断片があなたの星へ続く道を、少しでも照らすことを願って
<参考>
予定アイテムオブジェクトについて
VBでの正規表現について
「【1】Outlookの今日の予定一覧をVBSで取得し、進行中の予定を確認する」への2件のフィードバック