Lunatic Sol

IT Tips

GetLastUpdatedBy

2004-04-24 22:51:11 | LotusScript
文書の $UpdatedBy フィールド見れば更新者のリストはピックアップできます。でも、それを LotusScript でやりたい場合、GetItemValue で $UpdatedBy を Variant でとって、配列の最後を取得しないといけません。数行ですが、毎回書くのが面倒って時に使えるかな?っていう程度のシンプルなファンクションです。

NotesDocument オブジェクトを引数に渡して、NotesName クラスオブジェクトを戻り値として受け取ります。NotesName クラスなので Common プロパティ、Abbreviated プロパティなど任意のものを使えるので、取り扱いやすいと思います。

Function GetLastUpdatedBy(doc As NotesDocument) As NotesName
    Dim updatedBy As Variant
    updatedBy = doc.GetItemValue("$UpdatedBy")
    Set GetLastUpdatedBy = New NotesName(updatedBy(Ubound(updatedBy)))
End Function

GetAgentUNID

2004-04-06 20:15:48 | LotusScript
NotesAgent の UNID が必要になるケースはまぁそうそうないと思いますが、諸事情により LotusScript 内で取得する必要がありました。NotesAgent クラスには UNID を表示するプロパティがありません。よって、別の方法で取得しないといけません。

そこで目をつけたのは NotesURL プロパティです。NotesURL は notes:// ではじまる URL 形式で NotesAgent の UNID をその戻り値に含んでいます。そこを加工して取得することにしました。先に書いた IsValidUNID を使っているので、忘れずに同じオブジェクト内に Function を入れておいてください。

引数は NotesAgent オブジェクトで、戻り値は String 型の UNID です。何らかの理由で正しい UNID が取得できない場合は空白文字を返すようにしています。

Function GetAgentUNID(agent As NotesAgent) As String
    Dim splitURL As Variant
    splitURL = Split(agent.NotesURL, "/")
    GetAgentUNID = splitURL(Ubound(splitURL))
    If Instr(GetAgentUNID, "?OpenAgent") Then
        GetAgentUNID = Strleft(GetAgentUNID, "?OpenAgent")
    End If
    If Not IsValidUNID(GetAgentUNID) Then
        GetAgentUNID = ""
    End If
End Function

IsValidUNID

2004-04-06 20:01:41 | LotusScript
LotusScript で UNID を扱う場合、プロパティで見るコロン (:) やハイフン (-) の入った形式ではなくて、32文字のつながった文字列である必要があります。

クラスプロパティからとる場合は問題ないでしょうが、文字列を整形して作った UNID の場合チェックしておいた方が無難です。ということで、そのためのファンクションを書いてみました。

引数として strUnid (String 型) を受け取り、その文字列の Validity をチェックします。True が返れば Valid、False が返れば Invalid ということになります。

Function IsValidUNID(strUnid As String) As Boolean
    If Len(strUnid) <> 32 Then
        IsValidUNID = False
    Elseif strUnid Like "*[!0-9a-fA-F]*" Then
        IsValidUNID = False
    Else
        IsValidUNID = True
    End If
End Function

Boolean 型は Notes 6 からの型なのでノーツ R5 では上のが使えません。なので、下の IsValidUNIDR5 を使います。Integer 型の戻り値なので 1 が Valid で 0 が Invalid です。

Function IsValidUNIDR5(strUnid As String) As Integer
    If Len(strUnid) <> 32 Then
        IsValidUNIDR5 = 0
    Elseif strUnid Like "*[!0-9a-fA-F]*" Then
        IsValidUNIDR5 = 0
    Else
        IsValidUNIDR5 = 1
    End If
End Function