【5】Outlookの予定を確認し、予定に合わせた処理を呼び出すVBSファイルを完成させる

Outlookの予定を確認し、予定に合わせた処理を呼び出すVBSファイルを完成させる

適度な休憩で高い集中力を作る。これを習慣化するには意思の力だけでは難しいところもあります。仕組みを作って休憩時間を強制してるので、その仕組を紹介していきます。今回は第1回で作成したVBSファイルに、次の休憩予定に合わせてタスクを作成する依頼処理を追記し、完成させます。

前回は 指定された時間にPCをロックするタスクを準備する仕組みをつくるところまで進めました。

今回は、第1回で準備したVBSファイルへ、前回までに準備した休憩時間以外のときの処理を呼び出す記述を追記し、完成させます。

次の休憩時間を取得する

第2回~前回までに準備した仕組みには次の休憩時間の開始時刻の情報が必要です。

Outlookの予定を確認する関数を第一回で作りました。これを利用して次の休憩の開始時刻を取得します。

ここで取得した時刻データを前回準備したVBSファイルに渡し、タスクの実行時間を更新します。

ただ、Outlookの時間データの書式と、タスクの時間データの書式が違うため、変換が必要になります。

Outlookの時間データの書式

yyyy/MM/dd hh:mm:ss

タスクの時間データの書式

yyyy-MM-ddThh:mm:ss

時間データの書式の変換はReplace関数を使用して行ないます。

次の休憩時間を取得するコード

実装:scdlCheckBreakTimeSchedule.vbs

'--------------------------------------------------------------------------------
'現在時刻以降の休憩を探す
'--------------------------------------------------------------------------------
Public Function getNextBreakTime(Byval addNValue)

    getNextBreakTime = ""
    
    Dim colAppts
    
    ' 今日の予定を取得する
    Dim todayAppts
    Set todayAppts = getTodaySchedule(colAppts,"")
    
    
    Do While Not todayAppts Is Nothing
    
        ' 現在進行中の予定を探します
        If todayAppts.Start >= Now And rePattern1.Test(todayAppts.Categories) Or todayAppts.Start >= Now And rePattern2.Test(todayAppts.Categories) Then
    		
    		' 取得した日時データをyyyy-MM-ddThh:mm:ss形式で返します
            getNextBreakTime = Replace(Replace(DateAdd("n", addNValue, todayAppts.Start),"/","-")," ","T")
            
            Exit Do
    
        End If
    
        Set todayAppts = colAppts.FindNext
    Loop
    
End Function

引数について

  • addNValue
    タスクの実行時間を調整する場合に、分数を指定します。

タスク開始時間を渡し、タスク作成を依頼する

取得したデータを引数に、前回準備したVBSファイルを呼び出します。

タスク作成を依頼するコード

実装:scdlCheckBreakTimeSchedule.vbs

' 次の休憩時間を指定してタスクを登録
Dim nextBreakTime
nextBreakTime = getNextBreakTime(0)

objWsh.Run "scdlSetBreakTimeSchedule.vbs nextBreakTime",0

Outlookの予定を確認し、休憩時間になったらパソコンをロックするコード全文

第1回の処理と合わせて「scdlCheckBreakTimeSchedule.vbs」のコードは下記になります。

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

' 次の休憩時間を指定してタスクを登録
Dim nextBreakTime
nextBreakTime = getNextBreakTime(0)

objWsh.Run "scdlSetBreakTimeSchedule.vbs nextBreakTime",0

' --------------------------------------------------------------------------------
' 現在の予定が休憩(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

'--------------------------------------------------------------------------------
'現在時刻以降の休憩(4-)・睡眠(9-)を探す
'--------------------------------------------------------------------------------
Public Function getNextBreakTime(Byval addNValue)

    getNextBreakTime = ""
    
    Dim colAppts
    
    ' 今日の予定を取得する
    Dim todayAppts
    Set todayAppts = getTodaySchedule(colAppts,"")
    
    
    Do While Not todayAppts Is Nothing
    
        ' 現在進行中の予定を探します
        If todayAppts.Start >= Now And rePattern1.Test(todayAppts.Categories) Or todayAppts.Start >= Now And rePattern2.Test(todayAppts.Categories) Then
    		
    		' 取得した日時データをyyyy-MM-ddThh:mm:ss形式で返します
            getNextBreakTime = Replace(Replace(DateAdd("n", addNValue, todayAppts.Start),"/","-")," ","T")
            
            Exit Do
    
        End If
    
        Set todayAppts = colAppts.FindNext
    Loop
    
End Function

' 今日の予定一覧を取得します
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

' 指定プロセスの起動を確認します
Function checkProcessExec(byval processName)

	Dim Service,QfeSet

	Set Service = CreateObject("WbemScripting.SWbemLocator").ConnectServer
	Set QfeSet = Service.ExecQuery("Select * From Win32_Process Where Caption='" & processName & "'")

	checkProcessExec = QfeSet.Count > 0

	
End Function

今回はここまで。次回に続きます。

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

投稿者: 0.1

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

COMMENT