命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術についてのメモ。

Outlookの規定の予定表にある各予定表の予定一覧を出力する。

特化しすぎてタイトルが長い!

概要

Outlookの予定表を複数用意して、定時タスクを登録している。 複数の予定表から特定の日付のタスクを全部リストアップしたい。

ソースコード

以下のソースで適当にvbs作って呼ぶだけ。
必要に応じてテキストにリダイレクトでもすればいい。

cscript //nologo [VBSファイル名] [取得したい日付] [取得したい予定表の名前(N個)] 
' 引数チェック!
if WScript.Arguments.Count < 2 Then
  WScript.Echo "引数が少なすぎます。 [日付] [予定表名(任意の数)]"
  WScript.Quit
End if
Set args = WScript.Arguments
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set defFolder = objNamespace.GetDefaultFolder(9)

' 指定の日付(第一引数)
dt = CDate(args(0))
' それ以降の対象の予定表名をループ
For i = 1 to args.Count - 1
    calName = CStr(args(i))
    Set calFolder = defFolder.Folders(calName)
    Call EchoEvents(calFolder, dt)
Next

' 指定のカレンダーの指定の日付のイベントを出力
Sub EchoEvents(calFolder, dt)
    Set colItems = calFolder.Items
    calName = calFolder.Name
    ' 普通のイベント
    For Each objItem In colItems
        If GetDateOnly(objItem.Start) = GetDateOnly(dt) Then
            ' CSV形式で [予定表名],[予定名],[開始時刻] で出力
            WScript.Echo calName & "," & objItem.Subject & "," & Hour(objItem.Start) & ":" & Minute(objItem.Start)
        End If
    Next
    
    ' 定期イベント
    Set colFilteredItems = colItems.Restrict("[IsRecurring] = TRUE")
    For Each objItem In colFilteredItems
        ' DayOfWeekMaskの各曜日の値はWeekDayで取得できる数値から1引いて2乗した値になる。
        maskValue = 2^(Weekday(dt) - 1)
        Set objPattern = objItem.GetRecurrencePattern
        ' ANDで一致すればOK
        If objPattern.DayOfWeekMask AND maskValue = maskValue Then
            ' CSV形式で [予定表名],[予定名],[開始時刻] で出力
            WScript.Echo calName & "," & objItem.Subject & "," & Right("00" & Hour(objItem.Start), 2) & ":" & Right("00" & Minute(objItem.Start), 2)
        End If
    Next
End Sub

' 日付のみ取得。DateTimeをシンプルなDateに変える。
Function GetDateOnly(dt)
  GetDateOnly = CDate(Year(dt) & "/" & Month(dt) & "/" & Day(dt))
End Function