Event Category Monitor Using Google AppScript and Sheet

1–2 minutes

End Result

Code

// updated: 8/08/2022

function list_event_categories_drop_off() {
  var tableId = 'ga:2415606'; // from Query Explorer, the number is the profile id
  var metrics = ['ga:totalEvents'];
  var options = {
    'dimensions': 'ga:eventCategory',
    //'filters':'',
    'sort': '-ga:eventCategory',
    //'segment': '',
    'samplingLevel': 'HIGHER_PRECISION'
    //'max-results':'5'
  }  
  //get tag names
  //tags = getTagsListFromGA(tableId, metrics, options, anchorStartDate, anchorEndDate);
  //tags = getTagsListFromGTM("accounts/364874/containers/31314328/workspaces/861");
  var truthStartDate='2022-04-25';
  var truthEndDate='2022-05-01';
  var days = 7; //to later get the average number of ec event count instead

  truthDateData = gaGet(tableId, truthStartDate, truthEndDate, metrics, options);
  truthDateData = truthDateData.rows;
  //set up the object
  var eventsStatusData={};
  for(var i=0;i<truthDateData.length;i++){
    //var ob={[tags[i]]:[]};
    var num = truthDateData[i][1];
    num = +num; //convert string to integer
    eventsStatusData[truthDateData[i][0]]=[];
    eventsStatusData[truthDateData[i][0]].push(num/7);
  }


  yesterdayData = gaGet(tableId, "yesterday", "yesterday", metrics, options);
  yesterdayData = yesterdayData.rows;
  var currentLength=1;
  for(var i=0;i<yesterdayData.length;i++){
    //var ob={[tags[i]]:[]};
    if(eventsStatusData[yesterdayData[i][0]]){ //if ec appears yesterday and also on truthDate (!0 & !0, !0 & 0)
      eventsStatusData[yesterdayData[i][0]].push(yesterdayData[i][1]);
      currentLength = eventsStatusData[yesterdayData[i][0]].length;
    }else{ // if ec appears yesterday but not on truthDate => new event category
      eventsStatusData[yesterdayData[i][0]] =[];
      eventsStatusData[yesterdayData[i][0]].push(0);
      eventsStatusData[yesterdayData[i][0]].push(yesterdayData[i][1]);
    }
  }

  // if ec did not appear yesterday but appeared on truthDate => ec drop off
  for(var key in eventsStatusData){
  //eventsStatusData.forEach(tagStatusData => {
    while(eventsStatusData[key].length < currentLength){
      eventsStatusData[key].push(0);
    }
  };

  var threshold = 0.2;
  for (let key in eventsStatusData) {

    
    if(eventsStatusData[key][0]>0){
      var change = eventsStatusData[key][1]/eventsStatusData[key][0]-1;
      eventsStatusData[key].push(change);
    }else if(eventsStatusData[key][0]==0 && eventsStatusData[key][1]>0){
      eventsStatusData[key].push("new");
    }

    var status = "";
    if(eventsStatusData[key][2]>threshold){
      status="spike";
    }else if(eventsStatusData[key][2] == "-1"){
      status= "dead";
    }else if(eventsStatusData[key][2]<(-1*threshold)){
      status="drop off";
    }else if(eventsStatusData[key][2] == "new"){
      status= "n/a";
    }else{
      status="ok";
    }
    eventsStatusData[key].push(status);
  }

  //convert tagsStatusData to 2 dimensional array
  twoDTagsData=Object.keys(eventsStatusData).map((key)=>[key,...eventsStatusData[key]]);
  var headerData = [["Event Category"]];
  headerData[0].push("ws " + truthStartDate);
  headerData[0].push("yesterday");
  headerData[0].push("% change");
  headerData[0].push("EC health");

  //** WRITE VALUES TO SHEET */
  writeToSheet("ga_event_category_monitor", headerData, twoDTagsData);
}