Google Analytics v4 Archivierung

Kennst du das Gefühl, wenn du einen Kunden lange betreut hast und nach viel, oftmals anstrengender Arbeit endlich siehst, wie sich die Anzahl der Konversionen oder Klicks über die Jahre langsam verbessert? Du hast den endgültigen Beweis in der Hand, dass deine Ideen und Empfehlungen richtig waren – und die Zweifel des Kunden an deiner Arbeit unbegründet. Ein großartiges Gefühl! Aber was wäre, wenn ich dir sage, dass die DSGVO dabei ist, dir dieses Gefühl zu nehmen? Google Analytics v4 speichert nämlich keine Daten über 14 Monate hinaus, es sei denn, du zahlst sehr viel für Google 360.

In diesem Blogbeitrag zeigen wir dir Schritt für Schritt, wie du deine GAv4-Daten automatisiert archivierst und nie wieder manuell eingreifen musst.

Die Daten monatlich manuell herunterzuladen, ist für diese Problematik nämlich keine Lösung. Der Zeitaufwand wäre groß und die Arbeit schlicht nervig. Sicherlich, man könnte nur einmal im Jahr die Daten archivieren, aber dann hättest du auch nur einmal jährlich den Gesamtüberblick. Die Lösung ist ein Script, das über die Google Analytics API automatisch jeden Monat die wichtigsten Daten in Google Sheets speichert. Wenn du die Daten dann noch im Looker Studio (ehemals Data Studio) einbindest, hast du nur einmal einen überschaubaren Arbeitsaufwand. Folgende drei Schritte musst du für unsere Lösung beachten.

Schritt 1: Erstelle eine Google-Tabelle

Der erste Schritt ist ganz einfach. Lege die Google-Tabellen an, in die du deine Daten archivieren möchtest. Es ist sinnvoll, für jede Tabelle eine eigene Datei zu nutzen und nicht Sheets einer Tabelle, da dies Übersichtlichkeit schafft und die Ladegeschwindigkeit reduziert, wenn die Tabelle nach einigen Monaten oder Jahren sehr groß wird. Jede Tabelle hat eine eigene ID. Diese findest du in der URL. Wir benötigen diese später für das Script.

Die Spreadsheet ID

Google Analytics Demo & Tools

Schritt 2: Stelle deine Metriken zusammen

Nun entscheidest du, welche Dimensionen und Metriken deine Tabellen enthalten sollen. Um die richtigen Variablen und Kombinationen zu finden, kannst du das Google Analytics Demo & Tools nutzen. Hier kann es sein, dass du dich mit deinem Google-Account einloggen musst. Wähle das Google-Analytics-Konto, aus dem die Daten exportiert werden sollen. Google listet dann alle für deinen Kunden erstellten Events auf.

Achte dabei darauf, dass der API-Download nicht für Events funktioniert, deren Namen Leerzeichen, Bindestriche oder andere Sonderzeichen enthalten – Unterstriche sind erlaubt. Das ist ärgerlich, aber bisher haben wir keinen Weg gefunden, Events mit Sonderzeichen herunterzuladen. Die Lösung ist, neue Events ohne Sonderzeichen zu erstellen, entweder im Tag Manager oder direkt in Google Analytics v4. Dafür gehst du in Analytics v4 auf „Verwaltung“ (unten links) und dann im Bereich „Datenanzeige“ auf „Ereignisse“. Hier kannst du ein neues Ereignis auf Basis eines bestehenden Events erstellen. Es hat sich als nützlich erwiesen, den Inkognito-Modus im Chrome-Browser zu verwenden, da die Seite sonst manchmal nicht lädt.

In Analytics Demo & Tools wählst du schließlich alle Dimensionen und Metriken aus, die du in eine Tabelle packen möchtest. Die Seite zeigt dir auch, welche Messwerte zusammenpassen – viele Messwerte lassen sich nicht kombinieren, hier ist also etwas Fummelarbeit gefragt. Nach der Auswahl gehst du zum „Query Explorer“, wo dir die gewählten Messwerte in der benötigten Code-Form angezeigt werden.

Google Analytics Demo & Tools

Schritt 3: Das Script

Um unser Script zu nutzen, gehst du in einer geöffneten Google-Tabelle auf den Reiter „Erweiterungen“ und dann auf „App Script“. Auch hier kann es nötig sein, den Inkognito-Modus zu verwenden. Im Script-Editor fügst du unseren Code (siehe Seitenende) in das Textfeld ein. Folgendes musst du im Code ergänzen:

Das Script

  • PropertyID: Diese Zahl findest du in Analytics unter „Verwaltung“ im Bereich „Property“ und „Property-Details“.
  • SpreadsheetID: Die ID deiner Google-Tabelle.
  • Metrics: Die gewählten Metriken.
  • Dimensions: Die gewählten Dimensionen.
  • dateRange: Standardmäßig lädt das Script den letzten Monat herunter. Du kannst jedoch im Abschnitt „Datum“ einen festen Zeitraum angeben, indem du das Anfangs- und Enddatum im Format „YYYY-MM-TT“ einträgst.
  • Limit: Wir verwenden ein Limit für bestimmte sehr große Tabellen (z. B. Landing-Page-Daten). Wenn du das nicht möchtest, kannst du diesen Code-Abschnitt entfernen.

Bevor du die Zeitsteuerung konfigurierst, musst du im Reiter „Dienste“ (links) den Dienst „AnalyticsData“ auswählen. Dann setzt du die Zeitsteuerung unter „Trigger“, indem du einen neuen Trigger erstellst und die ausführende Funktion sowie den Monatstimer auswählst. Schließlich legst du den Tag im Monat fest, an dem das Script ausgeführt werden soll.

Jetzt ist die automatische Archivierung fertig! Es ist natürlich sinnvoll, deinen Code einmal manuell zu testen, und den Report im Looker Studio musst du natürlich noch erstellen – aber das kennst du sicherlich schon.

Wenn alles eingerichtet ist, kannst du dich zurücklehnen und deinem Script bei der Arbeit zuschauen.

Das Script

Script

/**
* GAv4 Archivierung
*/
function NameDerFunktion() {
const properties = [

{
propertyId: ‚deineProperty-ID‘,
spreadsheetId: ‚deineSpreadsheetID1‘,
metrics: [
{ name: ‚averagePurchaseRevenue‘ },
{ name: ‚userEngagementDuration‘ },
{ name: ‚ecommercePurchases‘ },
{ name: ‚engagedSessions‘ },
{ name: ’newUsers‘ },
{ name: ‚purchaseRevenue‘ },
{ name: ’sessions‘ },
{ name: ’sessionsPerUser‘ },
{ name: ‚totalUsers‘ },
{ name: ‚transactions‘ }
],
dimensions: [
{ name: ‚date‘ },
{ name: ’sessionPrimaryChannelGroup‘ }
]
} ,
{
propertyId: ‚deineProperty-ID‘,
spreadsheetId: ‚deineSpreadsheetID2‘,
metrics: [
{ name: ‚averagePurchaseRevenue‘ },
{ name: ‚userEngagementDuration‘ },
{ name: ‚ecommercePurchases‘ },
{ name: ‚engagedSessions‘ },
{ name: ’newUsers‘ },
{ name: ‚purchaseRevenue‘ },
{ name: ’sessions‘ },
{ name: ’sessionsPerUser‘ },
{ name: ‚totalUsers‘ },
{ name: ‚transactions‘ }
],
dimensions: [
{ name: ‚date‘ },
{ name: ’sessionSourceMedium‘ }
]
}
];

const sheetName = ‚Tabellenblatt1‘;

for (var p = 0; p < properties.length; p++) { const propertyId = properties[p].propertyId; const spreadsheetId = properties[p].spreadsheetId; const metrics = properties[p].metrics; const dimensions = properties[p].dimensions; try { // Calculate the date range (last month) const today = new Date(); const firstDayOfCurrentMonth = new Date(today.getFullYear(), today.getMonth(), 1); const lastDayOfPreviousMonth = new Date(today.getFullYear(), today.getMonth(), 0); const firstDayOfPreviousMonth = new Date(today.getFullYear(), today.getMonth() - 1, 1); const dateRange = { startDate: Utilities.formatDate(firstDayOfPreviousMonth, Session.getScriptTimeZone(), 'yyyy-MM-dd'), endDate: Utilities.formatDate(lastDayOfPreviousMonth, Session.getScriptTimeZone(), 'yyyy-MM-dd') }; // Set limit to 50000 rows for landingPage or pagePath dimensions let limit = 0; if (dimensions.some(d => d.name === ‚landingPage‘ || d.name === ‚pagePath‘ || d.name === ‚itemName‘ )) {
limit = 50000;
}

// Create the request
const request = {
dimensions: dimensions,
metrics: metrics,
dateRanges: [

{
startDate: dateRange.startDate, // Dynamically calculated start date (first day of previous month)
endDate: dateRange.endDate // Dynamically calculated end date (last day of previous month)
}
/**
//Manueller Zeitraum
{
startDate: „2023-09-01“, // Dynamically calculated start date (first day of previous month)
endDate: „2024-09-30“ // Dynamically calculated end date (last day of previous month)
} */

],
limit: limit > 0 ? limit : undefined // Only apply limit if it is set
};

// Run the report
const report = AnalyticsData.Properties.runReport(request, ‚properties/‘ + propertyId);
if (!report.rows) {
Logger.log(‚No rows returned for property: ‚ + propertyId);
continue;
}

// Open the existing Google Sheet by ID
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
let sheet = spreadsheet.getSheetByName(sheetName);

if (!sheet) {
Logger.log(‚Sheet not found. Creating new sheet for property: ‚ + propertyId);
sheet = spreadsheet.insertSheet(sheetName);
}

// Append the headers if the sheet is empty
if (sheet.getLastRow() === 0) {
const headers = […report.dimensionHeaders.map(d => d.name), …report.metricHeaders.map(m => m.name)];
sheet.appendRow(headers);
}

// Append the results with rounding to 2 decimal places
const rows = report.rows.map(row => {
return [
…row.dimensionValues.map(d => d.value),
…row.metricValues.map(m => {
let num = parseFloat(m.value);
return isNaN(num) ? m.value : num.toFixed(2).replace(‚.‘, ‚,‘); // Rounds to 2 decimal places and replaces ‚.‘ with ‚,‘
})
];
});

sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, rows[0].length).setValues(rows);

Logger.log(‚Report data appended to spreadsheet: ‚ + spreadsheetId);
} catch (e) {
// Handle exception
Logger.log(‚Failed with error for property: ‚ + propertyId + ‚ – ‚ + e.message);
}
}
}

Kontaktieren Sie uns gerne unverbindlich

Kontaktieren Sie uns gerne unverbindlich