Outlookの今日の予定一覧をVBSで取得し、進行中の予定を確認する

Outlookの今日の予定一覧をVBS取得し、進行中の予定を確認する

適度な休憩で高い集中力を作る。これを習慣化するには意思の力だけでは難しいところもあります。仕組みを作って休憩時間を強制してるので、その仕組を紹介していきます。今回はOutlookの今日の予定一覧を取得し、進行中の予定を確認するところまで進めます。私の予定表で休憩中を判断する方法を使用例として載せておきます。

前回は仕組みの概要を確認しました。

今回は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の分類はここにあります
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」として保存しておきましょう。

今回はここまでです。

今回の仕組み必要なステップは下記になります。

0.1up project
0.1up project
イラスト制作をとおして「つくる」と「つたえる」に改めて向き合うためのサイト
  1. 次の休憩時間にパソコンをロックするタスクを登録する
  2. 今回作った仕組みを実行するタスクを作る

この断片があなたの星へ続く道を、少しでも照らすことを願って


<参考>

予定アイテムオブジェクトについて

VBでの正規表現について

投稿者: 0.1

厚塗りで「存在感や重さ、質感による説得力」のあるイラストを目指しています。 日本では線画をベースとしたイラストが主流ですが、そこから外れたモノもイラストの世界を広げる為に必要だと考えています。「世界観にもう一味試したい」そんなときには、ぜひお声がけください。

COMMENT