google apps script - Trigger UiApp-builder callback within another routine -


serge's solution here seemed way go this, i'm bit afraid circumstances may different...

i have button users can add new set of rows controls flextable, in order allow them insert new member record set. after designing , building app (and despite assurances contrary), requirement added users able edit record sets @ later date.

i've managed data retrieved , correctly displayed on ui - single member record sets. final stage, attempting extend accommodate record sets having more 1 member. requires determining how many members there in record set, , adding new rows/control group flextable, before loading member each control group.

so within routine, (depending on how many members there are) may need trigger same callback, user button. however, difference serge's fine example, code triggers checkbox callback @ end of routine once ui components in place. situation needs on fly - , far i'm getting 'unexpected error', suggests me ui not able update added flextable controls before code attempts assign values them.

does have insight problem? recourse re-build fixed ui , dispense dynamic rowset model?

code follows -

1. event adding controls:

var app = uiapp.getactiveapplication(); var oflexgrid = app.getelementbyid('expensedetail'); var orowcount = app.getelementbyid('rowcount'); var oscriptdbid = app.getelementbyid('scriptdbid'); var irows = parseint(e.parameter.rowcount);       var svid = e.parameter.scriptdbid;  var vgriddefs = loadarraybyid(svid); //retrieve upload definition array scriptdb var vcontrolnames = [];  if (isodd(irows)){   var scolour = 'aliceblue'; } else {   var scolour = 'lavenderblush';            };  oflexgrid.insertrow(0); oflexgrid.insertrow(0); oflexgrid.insertrow(0); oflexgrid.insertrow(0);  oflexgrid.setrowstyleattributes(0,{'backgroundcolor':scolour}); oflexgrid.setrowstyleattributes(1,{'backgroundcolor':scolour}); oflexgrid.setrowstyleattributes(2,{'backgroundcolor':scolour}); oflexgrid.setrowstyleattributes(3,{'backgroundcolor':scolour});     var vexpensedef = get_namedrangevalues_(const_sskey_app,'uiapp_gridexpense'); irows = irows+1;     vcontrolnames = creategrid_mixedset_(irows, vexpensedef, oflexgrid, app);   orowcount.settext(irows.tostring()).setvalue(irows.tostring());         //some inconsequential code removed here, let me know if need  vgriddefs = vgriddefs.concat(vcontrolnames); // unify grid definition arrays      var saryid = savearray('expensefielddef', vgriddefs); oscriptdbid.settext(saryid).setvalue(saryid); //store array , save scriptdb id          if (e.parameter.source == 'btnexpenseadd'){   hidedialog(); //ignore chekcbox-driven calls };  return app; 

2. routine calls event

var app = uiapp.getactiveapplication(); var opanelexpense = app.getelementbyid('mainpanelexpense'); var opanelincome = app.getelementbyid('mainpanelincome'); var opaneledit = app.getelementbyid('mainpaneledit');      var chkexpenseadd= app.getelementbyid('chkexpenseadd');     var bexpensetrigger = e.parameter.chkexpenseadd;  var svoucherid = nngenericfunclib.cacheloadobject(cache_edit_voucherid); var svoucher = e.parameter.listsearch1vouchers;      var aryvoucherinfo = getvouchereditdetail(svoucherid);      //save record marking callback nngenericfunclib.cachesaveobject(cache_edit_oldrecords, json.stringify(aryvoucherinfo), cache_timeout);  svoucher = nngenericfunclib.textpad(svoucher, '0', 7);     var bexp = (svoucher.substring(0,2) == '03')  var orowcount = app.getelementbyid('rowcount'); var irowcount = parseint(e.parameter.rowcount);  var scontrolname = ''; var vcontrolval = ''; var iexpidx = 0; var scontroltype = ''; var ocontrol = ''; var vsummarytotal = 0;  (var ival in aryvoucherinfo){       scontrolname = aryvoucherinfo[ival][2];   vcontrolval = aryvoucherinfo[ival][3];    switch (scontrolname){     case 'esum60':        vsummarytotal = vcontrolval;       break;     case 'exusrn':        continue; //don't overwrite current username       break;   };                if (scontrolname.indexof('_')!=-1){ //test control set member           var arycontrolset = scontrolname.split('_');      if (parseint(arycontrolset[1])>irowcount){//*** trigger event ***                 logger.log(bexpensetrigger + ' - ' + !bexpensetrigger);       chkexpenseadd.setvalue(!bexpensetrigger, true);       irowcount = irowcount +1;     };    };    ocontrol = app.getelementbyid(scontrolname);         var vcache = cachesavereturn(cache_uiex_lists,scontrolname);    if (typeof vcache == 'undefined'){             ocontrol.setvalue(vcontrolval);     ocontrol.settext(vcontrolval);        //controlsettextbox(ocontrol,vcontrolval);     //controlsetdatebox(ocontrol,vcontrolval);     } else {      if (!(nngenericfunclib.arrayisreal(vcache))){       vcache = json.parse(vcache);      };      vcache = vcache.indexof(vcontrolval);              if (vcache != -1){       ocontrol.setselectedindex(vcache);     } else {       controlsetlistbox(ocontrol,vcontrolval);     };   };  };  //some code removed here  hidedialog();     return app; 

mogsdad rescue!

the answer (see above) @ of class (with me) pass app instance parameter (e) event function, calling directly main routine, keeping chronology in step when returns app complete routine. no need checkbox in situation.

this took me day, mogsdad! :)

snippet below taken 1/2 way down code sample 2 in op:

  if (scontrolname.indexof('_')!=-1){ //test control set member           var arycontrolset = scontrolname.split('_');      if (parseint(arycontrolset[1])>irowcount){             eventaddexpense(e); //that's takes       irowcount = irowcount +1;     };    }; 

Comments

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -