Julz
Julz

Reputation: 69

Third Listbox populate from first 2 Listboxes e.parameter [GAS]

I'm having a similar issue to this question - however I am requiring to get 2 e.parameters of both 1st and 2nd list boxes in order to populate the spreadsheet for the 3rd list box.

The vert is being read by the e.parameter, but the chan is undefined, which I do not understand as it is fully functional in the second list box but not the third.

Is there something that I have overseen in this code?

  var channelBox = app.createListBox().setId('channelBox').setName('channelBox').setWidth(152).setHeight(22);
  var chanHandler = app.createServerChangeHandler('showChannelinfo');
  chanHandler.addCallbackElement(channelBox);
  channelBox.addChangeHandler(chanHandler);
  var chaArray = ['Select channel','--','Email','Phone','Chat']; for (var i=0;i<chaArray.length;++i) {channelBox.addItem(chaArray[i]);};

  var verticalBox = app.createListBox().setId('verticalBox').setName('verticalBox').setWidth(152).setHeight(22);
  var vertHandler = app.createServerChangeHandler('showVerticalinfo');
  vertHandler.addCallbackElement(verticalBox);
  verticalBox.addChangeHandler(vertHandler);

function showChannelinfo(e){
  var app = UiApp.getActiveApplication();
  var itemSpreadsheetKey = 'ABC------------123';
  var openedSS = SpreadsheetApp.openById(itemSpreadsheetKey);
  var sheetList3 = openedSS.getSheetByName("boolean3");//Vertical Lookup Sheet
  var channelBox = app.getElementById('channelBox');
  var verticalBox = app.getElementById('verticalBox');
  var chan = e.parameter.channelBox;

  if (chan == 'Phone')
  { verticalBox.clear();
   var marketFilter = sheetList3.getRange('A1').setFormula('=iferror(filter(boolean2!A:D,boolean2!B:B=TRUE))');}
  if (chan == 'Email')
  { verticalBox.clear();
   var marketFilter = sheetList3.getRange('A1').setFormula('=iferror(filter(boolean2!A:D,boolean2!D:D=TRUE))');}
  if (chan == 'Chat')
  { verticalBox.clear();
   var marketFilter = sheetList3.getRange('A1').setFormula('=iferror(filter(boolean2!A:D,boolean2!C:C=TRUE))');}

  var numItemList1 = sheetList3.getLastRow();//get the item array
  var list1ItemArray = sheetList3.getRange(1,1,numItemList1).getValues();//Add the items in ListBox
  for(var i=0; i<list1ItemArray.length; i++)
  {verticalBox.addItem(list1ItemArray[i][0]);}

  if (chan == '--')
  {verticalBox.clear();
   var vertArray = ['Select vertical','Hardware','Apps','Ebooks','Movies','Music','Nik','Shopping','Places','Wallet','YouTube','BeatThatQuote'];
   for (var i=0;i<vertArray.length;++i) {verticalBox.addItem(vertArray[i]);};}

  return app
};

function showVerticalinfo(e){
  var app = UiApp.getActiveApplication();
  var itemSpreadsheetKey = 'ABC------------123';
  var openedSS = SpreadsheetApp.openById(itemSpreadsheetKey);
  var sheetList4 = openedSS.getSheetByName("boolean4");//Language Lookup Sheet
  var channelBox = app.getElementById('channelBox');
  var verticalBox = app.getElementById('verticalBox');
  var langBox = app.getElementById('langBox');
  var chan = e.parameter.channelBox;
  var vert = e.parameter.verticalBox;

  langBox.clear();
  var langFilter = sheetList4.getRange('A1').setFormula('=iferror(filter(boolean!A:D,boolean!A:A="' + chan + '",boolean!B:B="' + vert + '",boolean!D:D=TRUE))');
  //**this returns as chan = undefined**
  var numItemList2 = sheetList4.getLastRow();//get the item array
  var list1ItemArray2 = sheetList4.getRange(1,3,numItemList2).getValues();//Add the items in ListBox
  for(var i=0; i<list1ItemArray2.length; i++){langBox.addItem(list1ItemArray2[i][0]);}

  if (chan == '--')
  {langBox.clear();
   var langArray = ['Select language','Dutch','French','German','Italian','Portuguese', 'Russian','Spanish'];
   for (var i=0;i<langArray.length;++i) {langBox.addItem(langArray[i]);};} 

  return app
};

If anyone can use their magic eyes to give me any advice, it would be greatly appreciated!

Upvotes: 0

Views: 99

Answers (1)

Srik
Srik

Reputation: 7967

The problem is with your callbackElement. What I suggest is that you put both these list boxes into a single panel and add this panel as the callback element to both the handlers. Something like

function doGet(){
   /* Your other code here */ 
   var panel = app.createVerticalPanel().setId('panel'); 

   var channelBox = app.createListBox().setId('channelBox').setName('channelBox').setWidth(152).setHeight(22);
  var chanHandler = app.createServerChangeHandler('showChannelinfo');
  chanHandler.addCallbackElement(panel); /* Add panel as the callback element */
  channelBox.addChangeHandler(chanHandler);
  var chaArray = ['Select channel','--','Email','Phone','Chat']; for (var i=0;i<chaArray.length;++i) {channelBox.addItem(chaArray[i]);};


  var verticalBox = app.createListBox().setId('verticalBox').setName('verticalBox').setWidth(152).setHeight(22);
  var vertHandler = app.createServerChangeHandler('showVerticalinfo');
  vertHandler.addCallbackElement(panel); /* Add panel as the callback element */
  verticalBox.addChangeHandler(vertHandler);

  panel.add(channelBox);
  panel.add(verticalBox);

  /* Your other UI Code here */

}

Upvotes: 1

Related Questions