You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@groovy.apache.org by Merlin Beedell <MB...@cryoserver.com> on 2017/11/16 15:48:21 UTC

Getting Methods/Properties of objects under "Scriptom"

I am trying to analyse a large chunk of emails in Outlook.  I thought that I could re-write my VBA script using Groovy with "scriptom" to access the COM objects - and indeed it works. Yippee! So I can send an email and query the folder tree etc.
However, I am a curious person, and sometime would like to "query" the methods and properties of an Object - and the "listMnP (Object)" [see below] works nicely for Java objects.
This often helps when I am trying to match the documentation that I can find on Google, to the various objects that I am accessing.
However, I get a "Can't map name to dispid: metaClass" error - which is probably quite understandable.  Is it possible to query the Methods and Properties of a dynamic object in any way?

org.codehaus.groovy.scriptom.Scriptom.inApartment {

    def OutApp = new org.codehaus.groovy.scriptom.ActiveXObject("Outlook.Application")
    def myNameSpace = OutApp.GetNameSpace("MAPI")
    println myNameSpace.Folders.Count
    def myFolder = myNameSpace.Folders.GetFirst()
    println myFolder.name

listMnP myFolder   /// this should cause the object "myFolder" to list its Methods and Properties - but it errors.

    def OutMail = OutApp.CreateItem(0)

    OutMail.to = "an email address!!"
    OutMail.CC = ""
    OutMail.BCC = ""
    OutMail.Subject = "This is the Subject line"
    OutMail.Body = "Hi there"
    OutMail.Send()
    OutMail = null
    OutApp = null
}

///////////////////// end ////////////////
void listMnP (def thing) {
  println " >> Methods of ${thing.class} >>"
  thing.metaClass.methods.each {  method ->
    println "$method.name -> $method.parameterTypes"
  }
  println " >> Properties >>"
  thing.metaClass.properties.each { prop ->
    print "$prop.name -> "
    try {println thing[prop.name]} catch (Exception e) {println "-NoValue-"}
  }
  try {println "Class Loader: ${thing.class.classLoader}"} catch (e) {println "No Class Loader"}

}

================== When run the "List Methods and Properties" function is not effective ===============

PS C:\opt\groovy\OutlookScripts> groovy .\scanMailbox.groovy
3
Online Archive - MBeedell@cryoserver.com
>> Methods of class org.codehaus.groovy.scriptom.ActiveXObject >>
Caught: com.jacob.com.ComFailException: Can't map name to dispid: metaClass
com.jacob.com.ComFailException: Can't map name to dispid: metaClass
        at com.jacob.com.Dispatch.invokev(Native Method)
        at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
        at com.jacob.com.Dispatch.get(Dispatch.java:1258)
        at com.jacob.activeX.ActiveXComponent.getProperty(ActiveXComponent.java:171)
        at scanMailbox.listMnP(scanMailbox.groovy:61)
        at scanMailbox$_run_closure2.doCall(scanMailbox.groovy:45)
        at scanMailbox$_run_closure2.doCall(scanMailbox.groovy)
        at scanMailbox.run(scanMailbox.groovy:37)

Merlin Beedell