balajiboss
balajiboss

Reputation: 968

How to use global variables in event handlers

I have a global variable contacts, var contacts = ContactsApp.getContacts();

I have an KeyUphandler for my textbox called search().

In search(), contacts[0].getPrimaryEmail() gives out an error, "Cant call method getPrimaryEmail of undefined"

However contacts[0].getPrimaryEmail() works fine in other normal functions.

Cant we use global variables in event handlers?

The code is given below,

//CODE starts

   var contacts = ContactsApp.getContacts();

function ShowAuto() {

    var app = UiApp.createApplication().setTitle('Simple Autocomplete');

    var Panel = app.createVerticalPanel().setId('mainPanel').setWidth('555px');

    var textBox = app.createTextBox().setName('textBox').setWidth('330px').setId('textBox');

    var tBoxHandler = app.createServerKeyHandler('search');
    tBoxHandler.addCallbackElement(textBox);
    textBox.addKeyUpHandler(tBoxHandler);

    var listBox =    app.createListBox().setName('list').setWidth("330px").setId('list').setVisibleItemCount(5)
               .setStyleAttribute("border", "1px solid white")
               .setStyleAttribute("background", "white").setVisible(false);

   Panel.add(app.createLabel().setId('label'));



   Panel.add(textBox);
   Panel.add(listBox);

   app.add(Panel);


   var ownerEmail  = Session.getActiveUser().getEmail();


   // I used this method first.. It din work.
   // var contacts = ContactsApp.getContacts();
   // for (var i in contacts) 
   // {
   //  var emailStr = contacts[i].getPrimaryEmail();
   //  conts[i]=emailStr;
   // Browser.msgBox(emailStr);
   // }

   //These two calls are just to test, the contacts Array, They work fine :)

   getContact(0);
   getContact(1);

   var ss = SpreadsheetApp.getActiveSpreadsheet();
   ss.show(app);


   }

   function getContact(n)
   {

    // Browser.msgBox(contacts[n].getPrimaryEmail());
     Logger.log(contacts[n].getPrimaryEmail());  //works  fine 
     return contacts[n].getPrimaryEmail();
   }


   function search(e)
   {
      var app = UiApp.getActiveApplication();

   //Logger.log(contacts[0].getPrimaryEmail()); //Not working

     app.getElementById('label').setText(e.parameter.textBox.toString());
    // app.getElementById('label').setText(conts[0]);
     app.getElementById('list').setVisible(true);

     var searchKey = new RegExp(e.parameter.textBox.toString(),"gi");
     if (searchKey == "") 
       app.getElementById('textBox').setValue('');


     var listBoxCount = 0;

     for (i=0;i<5;i++){

       //Here is where i get error
        if(contacts[i].indexOf(e.parameter.textBox)!=-1 && listBoxCount < 5)
        {
          app.getElementById('list').addItem(conts[i]);
          listBoxCount++;
        }
     }

     }

Sorry if i was unclear

Upvotes: 3

Views: 4097

Answers (1)

balajiboss
balajiboss

Reputation: 968

Well, I have used UserProperties.setProperty and getProperty function to avoid the use of global variables.

Whenever a server handler is invoked, the global variables will be recalculated as given in https://developers.google.com/apps-script/class_serverhandler, so mine was not working properly.

Thanks for the support guys :)

Upvotes: 6

Related Questions