Category Archives: lotus

Lotus Notes Tweak: End of Message, No Response Needed

Taking a quick break from Javascript hacking to post this Lotus Notes tweak.

Following Susan Schreitmueller’s advice in the 28-hour Workday presentation she gave, I started replying in subject lines and using [EOM, NRN] to indicate the end of the message and that no response is necessary.

Not everyone’s familiar with this convention, so I always included a short explanation in the body of the message. After a number of these EOM/NRN messages, I created an AutoHotkey macro to save me a few keystrokes. I set up !eomnrn to expand to “EOM – end of message, NRN – no response needed”, and I used that in the body of the message.

I thought it still took too many keystrokes and mouse clicks to reply to a message, add my note to the subject line, add “[EOM, NRN]” to the end of the line, and type in the explanation in the body of the message. In fifteen minutes, I whipped up this little LotusScript agent that prompts you for a response, puts it in the subject line with an explanation, and sends the message off.

In Lotus Notes, use Create – Agent to create an agent called something like “1. EOM – NRN”. Edit the agent and put this in the Initialize sub.

	Dim workspace As New NotesUIWorkspace
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim collection As NotesDocumentCollection
	Dim memo As NotesDocument
	Dim reply As NotesDocument
	Set db = session.CurrentDatabase
	Set collection = db.UnprocessedDocuments
	Set memo = collection.getFirstDocument()
	While Not(memo Is Nothing)
		Set reply = memo.CreateReplyMessage( False )
		response = Inputbox("Response to " + memo.Subject(0))
		If (response <> "") Then
			reply.Subject = response + " re: " + memo.Subject(0) + " [EOM, NRN]"
			reply.Body = "EOM - end of message, NRN - no response necessary"
			reply.IsSavedMessageOnSend = True
		End If
		Set memo = collection.GetNextDocument(memo)		

Then you can select the message(s) you want to whiz through, type Alt-A 1 to call the action, and reply quickly. You can also call it while viewing a message, which is probably a safer place to start.


I like Lotus Notes 8.5 =)

Yes, I know, liking Lotus Notes is weird. It’s a little like liking Emacs, but even more inexplicable.

But Lotus Notes 8.5 lets me easily add my Google Calendar to my work calendar!

This rocks. =D

Oh, and I can work with Activities offline, too… I’m in love!

Lotus Notes mail merge from a Microsoft Excel spreadsheet

UPDATE: David Turner has shared his excellent improvements. Check them out! Or if you like the way this script handles mail merges, see Even more awesome LotusScript mail merge for Lotus Notes and Microsoft Excel

Updated May 6 2010 – added Call varXLFile.Quit()


I’ve been looking for ways to recognize people’s voluntary contributions to community discussions. E-mailed thanks are great because people can use the Memo-to-File feature to save it in their performance record, and copying their managers means extra kudos.

I wanted to thank 21 people for their contributions. With the Lotus Connections Communities API, a little bit of Ruby scripting and an internal tool for looking up people’s managers, I came up with a spreadsheet that listed people’s names, e-mail addresses, number of posts, first-line manager, and either “post” or “posts” depending on how many posts they had. Pulling random bits together from examples on the Net, I developed this super-nifty Lotus Notes script which does a flexible mail merge from a Microsoft Excel spreadsheet to Lotus Notes.

Create the agent and copy the following code into it. Then write an e-mail that you’ll use as the template for your new messages, and call the agent while the e-mail is selected. Give it a spreadsheet where the column headings are the tokens you’d like to replace in the template (body only). “<to>” and “<cc>” are special – they’ll also be replaced in the mail header. The resulting mail messages will be in the “Drafts” folder so that you can customize the messages before sending them out.

This may not work with multi-line replacements or fancy formatting. Review before sending, and have fun. =)

Sub Initialize
  Dim ws As New NotesUIWorkspace
  'Prompt for the filename - should be a Microsoft Excel file
  'with columns, where the first row of each column
  'is a token that will be used when replacing text in the body of the message
  'Special tokens: <to> and <cc> set the appropriate fields
  fileName$ = ws.Prompt(12, "Select file", "3")
  If fileName$ = "" Then 
    Exit Sub   'Cancel was presed
  End If
  strXLFilename = fileName$
  Dim s As New NotesSession  
  Dim uidoc As NotesUIDocument
  Dim partno As String
  Dim db As NotesDatabase
  Dim view As NotesView
  Dim doc As NotesDocument
  Dim collection As NotesDocumentCollection
  Dim memo As NotesDocument
  Dim body As NotesRichTextItem
  Dim newBody As NotesRichTextItem
  Dim range As NotesRichTextRange
  Dim count As Integer
  Set db = s.CurrentDatabase
  Set collection = db.UnprocessedDocuments
  Set memo = collection.getFirstDocument()
  'Get data from the spreadsheet
  Set varXLFile = CreateObject("Excel.Application")
  varXLFile.Visible = False
  Set varXLWorkbook = Nothing
  varXLFile.Workbooks.Open strXLFilename
  Set varXLWorkbook = varXLFile.ActiveWorkbook
  Set varXLSheet = varXLWorkbook.ActiveSheet
  lngRow = 2
  While (Not (varXLSheet.Cells(lngRow, 1).Value = ""))
    'Fill in the template
    subject = memo.Subject(0)
    Set body = memo.GetFirstItem("Body")
    'Compose message
    Set maildoc = New NotesDocument(db)
    Set maildoc= db.CreateDocument()    
    maildoc.Form = "Memo"
    maildoc.Subject = subject
    Set newBody = maildoc.CreateRichTextItem("Body")
    Call newBody.appendRTItem(body)  
    Set range = newBody.CreateRange      
    'Look up tokens from the column headings and replace them
    columnNo = 1
    While Not(varXLSheet.Cells(1, columnNo).Value = "")
      token = varXLSheet.Cells(1, columnNo).Value      
      value = varXLSheet.Cells(lngRow, columnNo).Value
      count = range.FindAndReplace(token, value, 16) 
      If (token = "<to>") Then
        maildoc.SendTo = value
      End If  
      If (token = "<cc>") Then
        maildoc.CopyTo = value
      End If
      columnNo = columnNo + 1
    Call maildoc.Save(True, False)
    lngRow = lngRow +1
  Call varXLFile.Quit()   
End Sub

Lotus Notes tweaks: Toolbar buttons to file mail

I like the GTD way of managing mail, and I’ve created folders for this. The three folders I use the most are AA Next Action, AA Waiting, and Done. Dragging messages down to the right folder is more mouse work than I like, though. I created three buttons on a custom toolbar. For example, the action that moves the current message to my Done folder runs this:

@Command([Folder]; “Done”; “1”)

I’d love to associate these with keyboard shortcuts, or spend some time hacking my mail template. That would be even awesomer! =)

Lotus Connections Communities topics+replies feeds to OPML

Keeping track of discussions in Lotus Connections Communities can be difficult, so I thought I’d use a feed reader to read new forum topics and replies. Instead of subscribing to each community by hand, I wrote a Ruby script that generated an OPML file, which I then imported into FeedDemon. Win!

Here’s the script:


email = ARGV[0]
password = ARGV[1]

require 'rubygems'
require 'rexml/document'
require 'open-uri'
require 'cgi'
require 'net/https'
base_url = ''
url = base_url + 'communities/my'
opml ='<opml version="1.0"><head></head><body></body></opml>')
body = opml.elements['opml/body']
while url
  # Fetch the page
  $stderr.puts "Fetching " + url
    my_communities = open(url)
  rescue OpenURI::HTTPError
      my_communities = open(url, 
                                                {:http_basic_authentication => [email, password]})

    rescue OpenURI::HTTPError
      url = nil
  my_communities.elements.each('*/entry') { |x|
    # Add it to the OPML
    $stderr.puts "Found " + x.elements['title'].text
    if x.elements['id'].text =~ /communityUuid=([^&]+)/
      uuid = Regexp.last_match(1)
    body.add_element 'outline', {'title' => x.elements['title'].text,
      'xmlUrl' => '' + uuid
  # Set the URL to the next one
  url = nil
  if my_communities.elements['feed/link[@rel="next"]']
    url = my_communities.elements['feed/link[@rel="next"]'].attributes['href']
  sleep 5
puts opml.to_s

If you want just discussion topics and replies, use this instead of the xmlUrl line above:

'xmlUrl' => base_url + 'community/forum?communityUuid=' + uuid

Microblogging talk

I’ve promised to give a short talk on microblogging for the knowledge and collaboration community (KCBlue) at work. Might be a good time to practice animation, too. =)

5 minutes: 750 words, 20 minutes: 3,000 words (throw pauses in there too)

Creativity loves constraints. I want to fit the core of my message into 5 minutes (approximately 750 words), with each “part” being 140 characters or less.

This will be a launching pad for discussion, which will take up most of the allotted time. I’ll switch to Q&A with a summary slide that includes Why and Beyond the Basics so that it’s easy for people to remember what they want to ask questions about. I’ll use five minutes at the end to wrap up, and I’ll post links and follow-up material in a blog post. I’ll collect e-mail addresses so that I can notify people when I’ve posted an update.

I plan to make hand-drawn slides for each of the sections, and maybe even animation if I get around to it. =)


The Whys and Hows of Microblogging

Why use Twitter? Why update your status on Facebook or Lotus Connections? Let’s talk about why people microblog and how you can get more value out of these tools.

Don’t know whom to e-mail? Don’t have the time to write a blog post? Post a short, quick update that people can read if they’re there.

What can you fit in 140 or so characters? A single thought. A question. Maybe a link.

What can you get? Broad, rapid, almost real-time conversations, if you’ve got a good network.

Here’s what you can do to build that network, and why you’d want to.

  • Learning: Follow role models and learn from what they’re doing. Build the relationship by thanking them for tips and ideas.
  • Updates: Do your favourite stores post updates? Find out what’s on sale and when the cookies have come out of the oven.
  • Customer service: Good experience? Bad experience? Post an update and you might be surprised by who’s listening.
  • Events: Interested in an event? Find out who’s going and what people think. Going there in person? Meet up at tweetups and get to know more people.
  • Awareness: Miss those watercooler chats? Microblogging’s better. You can keep in touch with way more people, and you don’t even have to stand up.
  • Passing things along: Like what someone shared? Share the good stuff by re-posting with credit. Look at how people do it, and follow their example.
  • Sharing: Want to build your network? Make people happy and help them grow by sharing tips and answering questions.
  • Questions: Need a quick answer but don’t know whom to ask? Post your question and you just might get a tip. You’ll need a good network for this.

NOTE: No one expects you to read everything. Don’t get addicted. It’s okay if you miss people’s updates.

How to get started:

Twitter: Sign up on Look for people. Follow them. Reply when you have something to say. Share what you’re doing and learning.

Lotus Connections Profiles: Log in. Look for people. Invite them to your network. Reply when you have something to say. Share what you’re doing and learning.

There are more microblogging services out there. Explore. Find out what works for you.

Beyond the basics:

  • Apps: Use a microblogging client like Tweetdeck to make reading and posting easier. Explore and find out which tool fits you.
  • Cross-posting: Synchronize automatically, or use a tool to post on multiple services. MicroBlogCentral can handle Twitter and Lotus Connections Profiles.
  • Personas: Don’t want to mix work and life? Don’t want to overwhelm people with too many updates? Use multiple accounts to give people choices.
  • Group posting: Corporate brand? Team account? You can use tools to make it easy for many people to post to the same account.
  • Strategy: Where does microblogging fit into your strategy? Post quick updates and interact with people. Link to your main site in your profile.

Next steps:

Pick a reason why you want to microblog, and go for it. How can I help you make the most of these tools?