/**
* Runs a report of a Google Analytics 4 property ID. Creates a sheet with the
* report.
*/
function runReport() {
/**
* TODO(developer): Uncomment this variable and replace with your
* Google Analytics 4 property ID before running the sample.
*/
const propertyId = 'XXXXXX'
try {
// create the request
const request = AnalyticsData.newRunReportRequest();
request.dimensions = [
{ "name": "date" },
// { "name": "googleAdsCampaignName" }
//,{ "name": "googleAdsAdGroupName" }
//,{ "name": "googleAdsAdGroupId" }
//,{ "name": "googleAdsCreativeId" }
{ "name": "sessionGoogleAdsCampaignName" }
,{ "name": "sessionGoogleAdsAdGroupName" }
,{ "name": "sessionGoogleAdsAdGroupId" }
,{ "name": "sessionGoogleAdsCreativeId" }
];
request.metrics = [
{ "name": "advertiserAdClicks" }
,{ "name": "advertiserAdImpressions" }
// no match found for ga:CTR
,{ "name": "advertiserAdCost" }
,{ "name": "transactions" }
,{ "name": "totalRevenue" }
,{ "name": "sessions" }
,{ "name": "screenPageViews" }
,{ "name": "bounceRate" }
,{ "name": "averageSessionDuration" }
];
request.dateRanges = [
{
"startDate": "yesterday" //"yesterday" "2023-06-19"
,"endDate": "yesterday" //"yesterday"
}
];
request.limit = 1000;
// ignore where campaign or ad group not set
request.dimensionFilter = {"andGroup":{"expressions":[{"notExpression":{"filter":{"stringFilter":{"value":"(not set)","caseSensitive":false,"matchType":"EXACT"},"fieldName":"sessionGoogleAdsCampaignName"}}},{"notExpression":{"filter":{"stringFilter":{"value":"(not set)","caseSensitive":false,"matchType":"EXACT"},"fieldName":"sessionGoogleAdsAdGroupName"}}}
//,{"filter":{"fieldName":"sessionGoogleAdsCampaignName","stringFilter":{"matchType":"BEGINS_WITH","value":"Shopping","caseSensitive":false}}}
]}};
// only where clicks > 0
request.metricFilter = {"filter":{"fieldName":"advertiserAdClicks","numericFilter":{"operation":"GREATER_THAN","value":{"doubleValue":"0"}}}};
request.orderBys = [{"metric":{"metricName":"advertiserAdCost"},"desc":true}];
request.keepEmptyRows = true;
//request.metricAggregations = "";
const report = AnalyticsData.Properties.runReport(request, 'properties/' + propertyId);
if (!report.rows) {
console.log('No rows returned.');
return;
}
//const spreadsheet = SpreadsheetApp.create('Google Analytics Report');
// load the linked spreadsheet
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();// ( ('Google Analytics Report');
const sheet = spreadsheet.getSheetByName('Analytics');
sheet.clear();
// 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];
sheet.appendRow(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];
});
sheet.getRange(2, 1, report.rows.length, headers.length)
.setValues(rows);
console.log('Report spreadsheet created: %s',
spreadsheet.getUrl());
} catch (e) {
// TODO (Developer) - Handle exception
console.log('Failed with error: %s', e.error);
// throw full error when testing so we can see more detail
throw e;
}
}