適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

PowerShellでNotesを操作する

  • この記事ではPowerShellを使ってNotesを操作する方法を解説しています。
  • Notesメールの取得を試みています。

PowerShellでNotesを操作する

PowerShellからNotesを操作する方法を紹介したいと思います。

「PowerShellでNotesを操作する」という需要があるかどうかわかりませんが・・・。
誰かの役に立つことを願って書き残します。

32Bit版のPowerShelじゃないと動きません・・・

PowerShellからNotesを操作するためには、NotesのCOMオブジェクトを使います。

NotesのCOMオブジェクトを操作するためには、32bitのPowerShellを使う必要があります。

64bitのWindows10であれば、スタートメニューの「WindowsPowerShell」の中に「WindowsPowerShell(x86)」があります。

間違えて64bitで実行すると、エラーになります・・・。

Lotus.NotesSessionを使う

32bitのPowerShellを使って、まずは、次の通り実行してみます。

PS C:\> $notesSession=New-Object -ComObject Lotus.NotesSession

これで、$notesSessionのCOMオブジェクトが使えるようになります。
せっかくなのでこのオブジェクトの中身を少し見てみましょう。 Get-Memberに渡してみます。 f:id:shinmai_papa:20190914124820p:plain

PowerShellでNotesメールを取得する

ここまで来れば、後の使い方はVBAでNotesを操作する手順とほとんど同じになります。
ここでは例として、過去の記事で紹介した手順でメールの一覧を取得してみることにします。

www.tekizai.net

記事を参考に、まずはinitializeを行います。

PS C:\> $notesSession.Initialize(パスワードを入れてください)

これでNotesにつながりました。 このコマンドだと、実行したPCのデフォルトユーザーに繋がります。
別途ユーザー名を指定するときは、InitializeUsingNotesUserNameメソッドを使います。

次にメールアプリケーションにアクセスし、最初の文書(メールです)を変数に格納してみたいと思います。

PS C:\>$db=$notesSession.GetDatabase("サーバ名","○○.nsf")
PS C:\> $doc=$db.AllDocuments.GetFirstDocument()

次は、この文書の次の文書の中身を確認してみましょう。
先ほどの記事のやり方を参考にします。

PS C:\>$db.AllDocuments.GetNextDocument($doc)

これで次の文書が取得できるはず・・・実行!!

PS C:\> $db.AllDocuments.GetNextDocument($doc)
Document is not from this collection
発生場所 行:1 文字:1
+ $db.AllDocuments.GetNextDocument($doc)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

なんと!!エラーが発生してしまいました。

どうすれば、メールの一覧が取得できるのでしょうか・・・。

仕方がないので、GetNextDocumentの代わりになりそうなものを探してみると、GetNthDocumentメソッドというのが使えそうです。
引数に文書の順番を渡すことで該当の文書が取得できるようです。

これを使えば、ループですべてのメールにアクセスできそうです!!

PS C:\> for($i=1;$i -le $db.AllDocuments.count;$i++){
>> $doc=$db.AllDocuments.GetNthDocument($i)
>> $doc.GetItemValue("Subject")
>> }

これで無事全メールの件名が取得できました。よかった。

しかし、IBMのヘルプを見ると、よくないことが書いてあります・・・。

使用法
パフォーマンス上の理由により、GetNthDocument を使用してループを繰り返すことは避けてください。推奨されるループ構造については、GetDocument、GetFirstDocument、GetLastDocument、GetNextDocument、GetPrevDocumentを参照してください。
『IBM Knowledge Center』のGetNthDocumentより引用
→NotesはIBMから売却されたため、見られなくなてしまいました。

何かパフォーマンス的によろしくないようですが・・・。
もし、もし、これを見られた方でGetNextDocumentメソッドを使ってループする方法をご存知の方がおりましたら教えてください。

おわりに

PowerShellでNotesの操作は、ちょっとしたことをやるのに便利かも知れないですね。 メールの一覧をCSVにしたり、カレンダーの予定をCSVにしたり・・・ってCSVばっかりじゃん!!

ここまでお読みいただき、ありがとうございました。

参考サイト

IBM Knowledge Center

【参考】VBAでNotesを操作するシリーズ

VBAでNotesの特定のフォルダのメールを参照する - 適材適所
VBAでNoteメールの添付ファイルを保存する - 適材適所
VBAでNotesメールを作成・送信する_ファイル添付 - 適材適所
VBAでNotesメールを作成・送信する_CC/BCCの追加 - 適材適所
VBAでNotesメールを作成・送信する_最も簡単なサンプル - 適材適所
VBAでNotesカレンダーを取得する簡単なサンプル - 適材適所
VBAでNotesメールを取得する簡単なサンプル - 適材適所