moonorongo
11/22/2017 - 11:53 AM

DataStudio Connector

Ejemplo de codigo comentado para un conector de Datastudio

var SPREADSHEET_ID = "ID_de la planilla que queremos obtener datos",
    SITE_ID = id del sitio que queremos obtener los analytics


/* funcion que recolecta los parametros que necesita este conector
   por ejemplo: si quisieramos especificarle SPREADSHEET_ID lo podemos poner aca, 
   y que lo pregunte cada vez que lo agregamos a un reporte
*/
function getConfig(request) {
  var config = {
    configParams: [
      {
        type: "INFO",
        name: "connect",
        text: "This connector does not require any configuration. Click CONNECT at the top right to get started."
      }
    ]
  };
  return config;
}

// definicion del schema de datos total
var dataSchema = [
  {
    name: 'source',
    label: 'Source',
    dataType: 'STRING',
    semantics: {
      conceptType: 'DIMENSION'
    }
  },
  {
    name: 'visits',
    label: 'Visits',
    dataType: 'NUMBER',
    semantics: {
      conceptType: 'METRIC'
    }
  },
  {
    name: 'datasource',
    label: 'Datasource',
    dataType: 'STRING',
    semantics: {
      conceptType: 'DIMENSION'
    }
  }
];


// utilizada por Datastudio
function getSchema(request) {
  return {schema: dataSchema};
};


// fn para obtener los datos
function getData(request) {
  var data = [];
  
  // generar el schema en base a los fields requeridos
  var requestSchema = request.fields.map(function (field) {
    for (var i = 0; i < dataSchema.length; i++) {
      if (dataSchema[i].name == field.name) {
        return dataSchema[i];
      }
    }
  });  

  // process from Google Sheets
  var googleSheetData = getSpreadsheetData();

  googleSheetData.values.forEach(function(row) {
    // obtengo solo los valores segun el schema requerido
    var values = [];
    requestSchema.forEach(function(schemaRow) {
      switch(schemaRow.name) {
        case 'source' : 
          values.push(row[0]);
          break;
        case 'visits' :
          values.push(parseInt(row[1]));
          break;
        case 'datasource' : 
          values.push('Spreadsheet');
          break;            
        default : values.push('');
      }
    });
    
    data.push({"values" : values});
  });

  
  // process from Google Analytics
  var gaData = getGaData();

  gaData.rows.forEach(function(row) {
    var values = [];
    requestSchema.forEach(function(schemaRow) {
      switch(schemaRow.name) {
        case 'source' : 
          values.push(row[0]);
          break;
        case 'visits' :
          values.push(parseInt(row[2]));
          break;
        case 'datasource' : 
          values.push('Analytics');
          break;            
        default : values.push('');
      }
    });
    
    data.push({"values" : values});
  });

   
  var outData = {
    schema: requestSchema,
    rows: data
  };

  
  return outData;  
}



function getAuthType() {
  var response = {
    "type": "NONE"
  };
  return response;
}


function getSpreadsheetData() {
  return Sheets.Spreadsheets.Values.get(SPREADSHEET_ID, "Hoja1!A1:D10");
}



function getGaData() {
  var today = new Date(),
      daysAgo = 365,
      timeAgo = new Date(today.getTime() - daysAgo * 24 * 60 * 60 * 1000),
      startDate = Utilities.formatDate(timeAgo, Session.getTimeZone(),'yyyy-MM-dd'),
      endDate = Utilities.formatDate(today, Session.getTimeZone(),'yyyy-MM-dd'),
      tableId  = 'ga:' + SITE_ID, 
      metric = 'ga:visits',
      options = {
        'dimensions': 'ga:source,ga:keyword',
        'sort': '-ga:visits,ga:source',
        'filters': 'ga:medium==organic',
        'max-results': 25
      };
  
  return Analytics.Data.Ga.get(tableId, startDate, endDate, metric,options);  
}