How to determine what kind of object something is in Apps Script

If you liked Reporting file, function and line number in Apps Script, you'll probably also like this one. This shows how to get some properties about an object in apps script, and can be useful for debugging. 

Here's how 

This function is available in the Useful stuff library, or you can copy from here. It will return information about JavaScript primitives or objects

 * return an object describing what was passed
 * @param {*} ob the thing to analyze
 * @return {object} object information
function whatAmI (ob) {

  try {
    // test for an object
    if (ob !== Object(ob)) {
        return {
          type:typeof ob,
          value: ob,
          length:typeof ob === 'string' ? ob.length : null 
        } ;
    else {
      try {
        var stringify = JSON.stringify(ob);
      catch (err) {
        var stringify = '{"result":"unable to stringify"}';
      return {
        type:typeof ob ,
        value : stringify,
        name:ob.constructor ? : null,
        nargs:ob.constructor ? ob.constructor.arity : null,
        length:Array.isArray(ob) ? ob.length:null
  catch (err) {
    return {
      type:'unable to figure out what I am'
    } ;

Returned values for primitives

  Not super useful, but just to complete the picture.

   {length=null, value=1.7, type=number}

   {length=null, value=true, type=boolean}

  Logger.log(cUseful.whatAmI('some string'));
   {length=11, value=some string, type=string}

 and these special ones

    {length=null, value=null, type=object}

    {length=null, value=NaN, type=number}

    {length=null, value=null, type=undefined}


Of course Arrays are just a kind of object, and typeof [] will return 'object'. You can see here that the name property returned will be 'Array' - so an Array is defined as type:object, name:Array

    {name=Array, length=0.0, value=[], nargs=1, type=object}
    {name=Array, length=3.0, value=[1,2,3], nargs=1, type=object}

Custom Objects

The main usage of this is to help with debugging your custom objects. An anonymous objects is detected as type:object, name:Object

  Logger.log (cUseful.whatAmI({}));
    {name=Object, length=null, value={}, nargs=1, type=object}
  Logger.log (cUseful.whatAmI({a:'a',b:'b'}));
    {name=Object, length=null, value={"a":"a","b":"b"}, nargs=1, type=object}


When you create your own 'classes', then the constructor is a function. A constructor is detected like any other function - type:function , name:Function

    {name=Function, length=null, value=null, nargs=1, type=function}

Object instance

Testing an instance of a 'class' will give you something more interesting. The name property will be the name of the constructor function used to create the object, the nargs property will show how many arguments that function expects to receive, and the value will be the stringified properties of the instance. 

  Logger.log(cUseful.whatAmI(new SomeClass()));
    {name=SomeClass, length=null, value={"someProperty":"2args"}, nargs=2, type=object}
  Logger.log(cUseful.whatAmI(new AnotherClass()));
    {name=AnotherClass, length=null, value={"someProperty":"4args"}, nargs=4, type=object}

Apps Script Services

Unfortunately, there's not a lot of info on Apps Script services - they are detected as an Anonymous object. 

    {name=Object, length=null, value={}, nargs=1, type=object}

You want to learn Google Apps Script?

Learning Apps Script, (and transitioning from VBA) are covered comprehensively in my my book, Going Gas - from VBA to Apps script, available All formats are available now from O'Reilly,Amazon and all good bookshops. You can also read a preview on O'Reilly

If you prefer Video style learning I also have two courses available. also published by O'Reilly.
Google Apps Script for Developers and Google Apps Script for Beginners.

See  Google Apps Scripts snippets for more like this

For help and more information join our forumfollow the blogfollow me on twitter