Last active
October 7, 2022 08:40
-
-
Save bactisme/3279cfc861930a6aecc3f111f36ff8d1 to your computer and use it in GitHub Desktop.
GA4 to Google Sheet - Apps script. Configurable Reports
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
== 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