適材適所

システム屋のくらげが気ままに書いているブログです。PowerShellやVBAなどプログラミング系の話をメインに書いています。

MENU

Notesカレンダーを取得する【PowerShell】

HCL Notes(旧Lotus Notes、IBM Notes)からカレンダーの情報を取得する方法です。

需要があるかわかりませんが、せっかく作ったのでエントリに残しておきます。

VBAで同じようなことをした記事も読んで頂けると嬉しいです。

www.tekizai.net

検証した環境

Windows10

Notes 9

PSVersion 5.1

Notesカレンダーを取得する関数

32bitのPowerShellで実行する必要があります。

引数にサーバー名、データベース名、パスワードを指定する必要があります。

サーバー名などの調べ方は下記の記事をご参照頂ければ幸いです。

 
function Get-NotesCalendar
{
    param([Parameter(Mandatory=$true)]$server,[Parameter(Mandatory=$true)]$database,[Parameter(Mandatory=$true)]$password)
       
    #セッションを開始する
    $ntSession=New-Object -ComObject Lotus.NotesSession
    [void]$ntSession.Initialize($password)
    
    #データベースのオープン
    $ntDB = $ntSession.GetDatabase($server, $database)
    $cal=$ntDB.GetView('$Calendar')
    $doc=$cal.GetFirstDocument()
    $objs=@()
    $parentUNIDAray=@()
    while(!($doc -eq $null))
    {
        ##繰り返し予定をうまく処理するためにParentDocumentUNIDを調べる。既に処理済みのIDはスキップする。
        if($parentUNIDAray.Contains($doc.ParentDocumentUNID))
        {
            $doc=$cal.GetNextDocument($doc)
            continue
        }
    
        ##一日の予定かどうか判定
        if($doc.GetItemValue("AppointmentType") -match '[03]')
        {
            $StartName='StartDateTime'
            $EndName='EndDateTime'
            $allDay=$false
        }
        else
        {
            $StartName='StartDate'
            $EndName='EndDate'
            $allDay=$true
        }

        ##繰り返し予定を含めて全ての予定を取得する
        for($i=0;$i -lt $doc.GetItemValue($StartName).count;$i++ )
        {
            ##ここで予定のオブジェクトを作成する。よく使いそうな項目だけピックアップして設定。
            $obj=[pscustomobject]@{
                Subject=$doc.GetItemValue("Subject")[0]
                StartDateTime=$doc.GetItemValue($StartName)[$i]
                EndDateTime=$doc.GetItemValue($EndName)[$i]
                AllDay=$allDay
                Form=$doc.GetItemValue("form")[0]
            }
            $objs+=$obj
        }

        ##同じ繰り返し予定を取得しないようにするためにParentDocumentUNIDが同じ予定は処理しないように配列に格納しておく
        if($doc.ParentDocumentUNID -ne $null)
        {
            $parentUNIDAray+=$doc.ParentDocumentUNID
        }
        ##次の予定を変数に格納する
        $doc=$cal.GetNextDocument($doc)
    }
    return $objs
}

コードの補足

コードの中の変数$objsの中にNotesの1つ1つの予定が入ります。変数$objは1つの予定を表します。中身は件名と開始・終了日時、一日の予定かどうか、予定の種類(TaskやAppointment)というプロパティを持っています。

$obj変数について、一日の予定の場合、開始時間が4:00:00、終了時間が20:00:00となっていますのでご注意ください。

AllDayプロパティがありますので、これを参照して一日かどうかの判定を必要に応じて行ってください。

【先に謝っておきます】注意!

Notes周りについて、私も調べながら作っていることもあり、間違いがありましたら申し訳ございません。

繰り返し予定や日付時間のプロパティの設定など、理解が浅い部分があります。わからないなりにHCLのヘルプ等の参考文献には当たっていますが、非効率的な方法を取っている可能性があります。1日の予定の判定や、繰り返しの判定について、詳しい方がいらしたら教えて頂けるととっても嬉しいです。

(ただでさえNotesを知っている人が減ってきているのに、さらにその詳しい仕様まで知っている人がこんなブログを見ている可能性は限りなくゼロに近いですが・・・)

終わりに

いつも思うのですが、Notesのドキュメント、もっとわかりやすくなってほしいです・・・。

あまりにも分からなさ過ぎて悲しくなります・・・。

私の読解力の問題でしょうか・・・。そうかも知れません・・・。

なにはともあれ、ここまでお読みいただきありがとうございました!!