Skip to content

Instantly share code, notes, and snippets.

@bactisme
Last active October 7, 2022 08:40
Show Gist options
  • Save bactisme/3279cfc861930a6aecc3f111f36ff8d1 to your computer and use it in GitHub Desktop.
Save bactisme/3279cfc861930a6aecc3f111f36ff8d1 to your computer and use it in GitHub Desktop.
GA4 to Google Sheet - Apps script. Configurable Reports
/**
== How to use ==
0/
Paste this code in Extensions > Apps Script
In Services, search and add "AnalyticsData" and "AnalyticsReportin"
1/ Create a sheet called "Reports configuration"
* Paste in A1 the following lines :
Configuration Options
Report Name
View ID
Start Date (must use format 2022-01-01, or "today")
End Date
Metrics
Dimensions
Order
Configurations will go by columns (B, C etc.)
2/ Run by hand via the menu.
3/ To schedule : In the code editor > Triggers > Add (button corner bottom left) > runConfiguredReports / Daily
*/
function onOpen(e) {
const ui = SpreadsheetApp.getUi();
ui.createMenu('Google Analytics Utilities')
.addItem('Run reports', 'runConfiguredReports').addToUi();
}
function runConfiguredReports(){
var confsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Reports configuration");
var reportid = 2;
do {
if (confsheet.getRange(2, reportid).getValue() != "" ){
// report have a name
var reportname = confsheet.getRange(2, reportid).getValue();
console.log(reportname);
//create a sheet with reportname, or clean it
var reportsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(reportname);
if (reportsheet){
reportsheet.getRange(1,1,reportsheet.getMaxRows() - 1,reportsheet.getMaxColumns() - 1).clearContent();
} else {
reportsheet = SpreadsheetApp.getActive().insertSheet();
reportsheet.setName(reportname);
}
var propertyId = confsheet.getRange(3, reportid).getValue();
var start = confsheet.getRange(4, reportid).getDisplayValue();
var end = confsheet.getRange(5, reportid).getValue();
var metrics = confsheet.getRange(6, reportid).getValue();
var dimensions = confsheet.getRange(7, reportid).getValue();
var order = confsheet.getRange(8, reportid).getValue();
runReportWithConf(reportsheet, propertyId, start, end, metrics, dimensions, order);
}else{
break; // escape loop
}
reportid += 1;
}while(true);
}
/**
* Runs a report of a Google Analytics 4 property ID. Creates a sheet with the
* report.
* Loosely based on Google's code
*/
function runReportWithConf(sheet, propertyId, startDate, endDate, metricsList, dimensionsList, orderList) {
try {
var metrics = metricsList.split(",").map((t) => {
var me = AnalyticsData.newMetric();
me.name = t;
return me;
});
var dimensions = dimensionsList.split(",").map((t) => {
var di = AnalyticsData.newDimension();
di.name = t;
return di;
});
var orderBys = orderList.split(",").map((t) => {
var mob = AnalyticsData.newOrderBy();
var dob = AnalyticsData.newDimensionOrderBy();
dob.dimensionName = t;
mob.dimension = dob;
return mob;
});
const dateRange = AnalyticsData.newDateRange();
dateRange.startDate = startDate;
dateRange.endDate = endDate;
const request = AnalyticsData.newRunReportRequest();
request.dimensions = dimensions;
request.metrics = metrics;
request.dateRanges = dateRange;
request.orderBys = orderBys;
const report = AnalyticsData.Properties.runReport(request,
'properties/' + propertyId);
if (!report.rows) {
sheet.getRange(1,1).setValue("No rows returned.");
Logger.log('No rows returned.');
return;
}
// Append the headers.
const dimensionHeaders = report.dimensionHeaders.map(
(dimensionHeader) => {
return dimensionHeader.name;
});
const metricHeaders = report.metricHeaders.map(
(metricHeader) => {
return metricHeader.name;
});
const headers = [...dimensionHeaders, ...metricHeaders];
// headers
sheet.getRange(2,1,1,headers.length).setValues([headers]);
// Append the results.
const rows = report.rows.map((row) => {
const dimensionValues = row.dimensionValues.map(
(dimensionValue) => {
return dimensionValue.value;
});
const metricValues = row.metricValues.map(
(metricValues) => {
return metricValues.value;
});
return [...dimensionValues, ...metricValues];
});
let currentTime = Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "yyyy-MM-dd HH:mm:ss");
sheet.getRange(1,1).setValue("Last run : " + currentTime);
sheet.getRange(3, 1, report.rows.length, headers.length)
.setValues(rows);
} catch (e) {
// TODO (Developer) - Handle exception
sheet.getRange(1,1).setValue("Failed with error: "+e);
Logger.log('Failed with error: %s', e);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment