0

J'essaie d'automatiser certains rapports Google Analytics personnalisés avec Google Apps Script et d'exporter les données dans une feuille de calcul Google Documents. Je suivais un cours d'instruction et obtenu fonctionnant avec le code suivant:Google Apps Script: création de rapports automatisée avec Google Analytics

function runDemo() { 
    try { 

    var firstProfile = getFirstProfile(); 
    var results = getReportDataForProfile(firstProfile); 
    outputToSpreadsheet(results); 

    } catch(error) { 
    Browser.msgBox(error.message); 
    } 
} 

//traverse down the Management API hierarchy - Account >> Property ID >> View ID - returns TJ main site view (profile) 

function getFirstProfile() { 
    var accounts = Analytics.Management.Accounts.list(); 
    if (accounts.getItems()) { 
    var firstAccountId = accounts.getItems()[0].getId(); 

    var webProperties = Analytics.Management.Webproperties.list(firstAccountId); 
    if (webProperties.getItems()) { 

     var firstWebPropertyId = webProperties.getItems()[25].getId(); // The property id for TJ is 26 but it is an array so 25 starting from 0 
     var profiles = Analytics.Management.Profiles.list(firstAccountId, firstWebPropertyId); 

     if (profiles.getItems()) { 
     var firstProfile = profiles.getItems()[0]; 
     return firstProfile; 

     } else { 
     throw new Error('No views (profiles) found.'); 
     } 
    } else { 
     throw new Error('No webproperties found.'); 
    } 
    } else { 
    throw new Error('No accounts found.'); 
    } 
} 

// Querying for Google Analytics report data 

function getReportDataForProfile(firstProfile) { 

    var profileId = firstProfile.getId(); 
    var tableId = 'ga:' + profileId; 
    var startDate = getLastNdays(7); // Sets the start date to 7 days ago. 
    var endDate = getLastNdays(1);  // Yesterday. 

    var optArgs = { 
    //'dimensions': 'ga:keyword',    // Comma separated list of dimensions. 
    // 'sort': '-ga:sessions,ga:keyword',  // Sort by sessions descending, then keyword. 
    // 'segment': 'dynamic::ga:isMobile==Yes', // Process only mobile traffic. 
    // 'filters': 'ga:source==google',   // Display only google traffic. 
    // 'start-index': '1', 
    // 'max-results': '250'      // Display the first 250 results. 
    }; 


    // Make a request to the API. 
    var results = Analytics.Data.Ga.get(
     tableId,     // Table id (format ga:xxxxxx). 
     startDate,     // Start-date (format yyyy-MM-dd). 
     endDate,     // End-date (format yyyy-MM-dd). 
     'ga:sessions,ga:pageviews,ga:sessionDuration,ga:pageviewsPerSession,ga:bounceRate,ga:percentNewSessions', // Comma seperated list of metrics. 
     optArgs); 


    if (results.getRows()) { 
    return results; 

    } else { 
    throw new Error('No views (profiles) found'); 
    } 
} 

function getLastNdays(nDaysAgo) { 
    var today = new Date(); 
    var before = new Date(); 
    before.setDate(today.getDate() - nDaysAgo); 
    return Utilities.formatDate(before, 'GMT', 'yyyy-MM-dd'); 
} 


// Print on the sheet 

function outputToSpreadsheet(results) { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(); 

    // Print the headers. 
    var headerNames = []; 
    for (var i = 0, header; header = results.getColumnHeaders()[i]; ++i) { 
    headerNames.push(header.getName()); 
    } 
    sheet.getRange(1, 1, 1, headerNames.length) 
     .setValues([headerNames]); 

    // Print the rows of data. 
    sheet.getRange(2, 1, results.getRows().length, headerNames.length) 
     .setValues(results.getRows()); 
} 

Cela fonctionne très bien, mais le problème apparaît lorsque je tente d'interroger l'API Google Analytics pour une deuxième série de résultats. Le reporting que je dois faire nécessite différents segments et filtrage, donc je suppose que je dois créer plusieurs ensembles de résultats à écrire sur la feuille mais le code supplémentaire ne fonctionne pas - il y a une deuxième feuille créée mais les données écrites dessus sont les données issues de var 'results' et non 'results1'. Voici le code:

function runDemo() { 
    try { 

    var firstProfile = getFirstProfile(); 
    var results = getReportDataForProfile(firstProfile); 
    var results1 = getReportDataForProfile(firstProfile); 
    outputToSpreadsheet(results); 
    outputToSpreadsheet(results1); 

    } catch(error) { 
    Browser.msgBox(error.message); 
    } 
} 

//traverse down the Management API hierarchy - Account >> Property ID >> View ID - returns TJ main site view (profile) 

function getFirstProfile() { 
    var accounts = Analytics.Management.Accounts.list(); 
    if (accounts.getItems()) { 
    var firstAccountId = accounts.getItems()[0].getId(); 

    var webProperties = Analytics.Management.Webproperties.list(firstAccountId); 
    if (webProperties.getItems()) { 

     var firstWebPropertyId = webProperties.getItems()[25].getId(); // The property id for TJ is 26 but it is an array so 25 starting from 0 
     var profiles = Analytics.Management.Profiles.list(firstAccountId, firstWebPropertyId); 

     if (profiles.getItems()) { 
     var firstProfile = profiles.getItems()[0]; 
     return firstProfile; 

     } else { 
     throw new Error('No views (profiles) found.'); 
     } 
    } else { 
     throw new Error('No webproperties found.'); 
    } 
    } else { 
    throw new Error('No accounts found.'); 
    } 
} 

// Querying for Google Analytics report data 

function getReportDataForProfile(firstProfile) { 

    var profileId = firstProfile.getId(); 
    var tableId = 'ga:' + profileId; 
    var startDate = getLastNdays(7); // Sets the start date to 7 days ago. 
    var endDate = getLastNdays(1);  // Yesterday. 


    //Optional Arguments - all commented out because the first one is empty 
    var optArgs = { 
    //'dimensions': 'ga:keyword',    // Comma separated list of dimensions. 
    // 'sort': '-ga:sessions,ga:keyword',  // Sort by sessions descending, then keyword. 
    // 'segment': 'dynamic::ga:isMobile==Yes', // Process only mobile traffic. 
    // 'filters': 'ga:source==google',   // Display only google traffic. 
    // 'start-index': '1', 
    // 'max-results': '250'      // Display the first 250 results. 
    }; 

    //Optional arguments - this time I need the organic only 

    var optArgs1 = { 

    'segment': 'gaid::-5'     // Process only Non paid search traffic. 

    }; 


    // Make the fist request to the API. 
    var results = Analytics.Data.Ga.get(
     tableId,     // Table id (format ga:xxxxxx). 
     startDate,     // Start-date (format yyyy-MM-dd). 
     endDate,     // End-date (format yyyy-MM-dd). 
     'ga:sessions,ga:pageviews,ga:sessionDuration,ga:pageviewsPerSession,ga:bounceRate,ga:percentNewSessions', // Comma seperated list of metrics. 
     optArgs); //This time we pass the optArgs - ie the empty one 

     // Make the second request to the API. 
    var results1 = Analytics.Data.Ga.get(
     tableId,     // Table id (format ga:xxxxxx). 
     startDate,     // Start-date (format yyyy-MM-dd). 
     endDate,     // End-date (format yyyy-MM-dd). 
     'ga:sessions', // Comma separated list of metrics. 
     optArgs1); //This time we pass the optArgs1 - ie the one with segment=organic 


    if (results.getRows()) { 
    return results; 

    } else { 
    throw new Error('No views (profiles) found'); 
    } 
} 

function getLastNdays(nDaysAgo) { 
    var today = new Date(); 
    var before = new Date(); 
    before.setDate(today.getDate() - nDaysAgo); 
    return Utilities.formatDate(before, 'GMT', 'yyyy-MM-dd'); 
} 


// Print on the sheet - 

function outputToSpreadsheet(results) { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(); 

    // Print the headers. 
    var headerNames = []; 
    for (var i = 0, header; header = results.getColumnHeaders()[i]; ++i) { 
    headerNames.push(header.getName()); 
    } 
    sheet.getRange(1, 1, 1, headerNames.length) 
     .setValues([headerNames]); 

    // Print the rows of data. 
    sheet.getRange(2, 1, results.getRows().length, headerNames.length) 
     .setValues(results.getRows()); 
} 

// Print again, this time the data from results1 - ie the organic visits 

function outputToSpreadsheet(results1) { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(); 

    // Print the headers. 
    var headerNames = []; 
    for (var i = 0, header; header = results1.getColumnHeaders()[i]; ++i) { 
    headerNames.push(header.getName()); 
    } 
    sheet.getRange(1, 1, 1, headerNames.length) 
     .setValues([headerNames]); 

    // Print the rows of data. 
    sheet.getRange(2, 1, results1.getRows().length, headerNames.length) 
     .setValues(results1.getRows()); 
} 

Le message d'erreur que je reçois est: « résultats » ne sont pas définis et rien ne s'écrit sur la feuille. Je m'attendais à obtenir au moins les résultats de la première requête à apparaître comme le code pour var «résultats» est toujours le même. C'est le 'results1' qui est ajouté.

Comme vous pouvez probablement deviner, je ne suis pas un développeur et mon exposition à JavaScript est minime alors j'apprécierais vraiment toute aide avec cela. Merci d'avance!

+0

Votre getReportDataForProfile-fonction retourne pas des résultats variables importe, donc Résultats1 ne seront jamais réellement utilisés. Mon conseil serait de ne pas réinventer la roue - Google fournit une feuille de calcul avec des scripts GA intégrés: https://chrome.google.com/webstore/detail/google-analytics/fefimfimnhjjkomigakinmjileehfopp, alors installez et configurez le script et mettre en place un déclencheur. Cela prendra une dizaine de minutes (à moins bien sûr que vous voulez l'expérience d'apprentissage, mais il semble que vous êtes après les résultats plutôt). –

Répondre

1

Je pense que c'est à cause de 2 choses: Vous copiez et collez l'ensemble de la fonction outputToSpreadsheet deux fois. Vous n'avez pas besoin de faire cela. Vous pouvez supprimer la deuxième fonction outputToSpreadsheet. La deuxième chose est parce que vous appelez l'API deux fois dans la même fonction getReportDataForProfile mais vous renvoyez juste le résultat du premier appel. Regardez ces lignes:

if (results.getRows()) { 
    return results; 

    } else { 
    throw new Error('No views (profiles) found'); 
    } 

Dans la fonction getReportDataForProfile vous demandez de vérifier si le résultat n'existe que des résultats et non pour Résultats1.

Pour le rendre plus facile pour vous, je changer le code et au fond de votre code doit être:

function runDemo() { 
    try { 

    var firstProfile = getFirstProfile(); 

    //First Call 
    var results = getReportDataForProfile(firstProfile); 
    outputToSpreadsheet(results); 

    //Second Call 
    var results1 = getReportDataForProfile2(firstProfile); 
    outputToSpreadsheet(results1); 

    } catch(error) { 
    Browser.msgBox(error.message); 
    } 
} 

//traverse down the Management API hierarchy - Account >> Property ID >> View ID - returns TJ main site view (profile) 

function getFirstProfile() { 
    var accounts = Analytics.Management.Accounts.list(); 
    if (accounts.getItems()) { 
    var firstAccountId = accounts.getItems()[0].getId(); 

    var webProperties = Analytics.Management.Webproperties.list(firstAccountId); 
    if (webProperties.getItems()) { 

     var firstWebPropertyId = webProperties.getItems()[25].getId(); // The property id for TJ is 26 but it is an array so 25 starting from 0 
     var profiles = Analytics.Management.Profiles.list(firstAccountId, firstWebPropertyId); 

     if (profiles.getItems()) { 
     var firstProfile = profiles.getItems()[0]; 
     return firstProfile; 

     } else { 
     throw new Error('No views (profiles) found.'); 
     } 
    } else { 
     throw new Error('No webproperties found.'); 
    } 
    } else { 
    throw new Error('No accounts found.'); 
    } 
} 

// Querying for Google Analytics report data 

function getReportDataForProfile(firstProfile) { 

    var profileId = firstProfile.getId(); 
    var tableId = 'ga:' + profileId; 
    var startDate = getLastNdays(7); // Sets the start date to 7 days ago. 
    var endDate = getLastNdays(1);  // Yesterday. 


    //Optional Arguments - all commented out because the first one is empty 
    var optArgs = { 

    }; 

    // Make the fist request to the API. 
    var results = Analytics.Data.Ga.get(
     tableId,     // Table id (format ga:xxxxxx). 
     startDate,     // Start-date (format yyyy-MM-dd). 
     endDate,     // End-date (format yyyy-MM-dd). 
     'ga:sessions,ga:pageviews,ga:sessionDuration,ga:pageviewsPerSession,ga:bounceRate,ga:percentNewSessions', // Comma seperated list of metrics. 
     optArgs); //This time we pass the optArgs - ie the empty one 


    if (results.getRows()) { 
    return results; 

    } else { 
    throw new Error('No views (profiles) found'); 
    } 
} 

function getReportDataForProfile2(firstProfile) { 

    var profileId = firstProfile.getId(); 
    var tableId = 'ga:' + profileId; 
    var startDate = getLastNdays(7); // Sets the start date to 7 days ago. 
    var endDate = getLastNdays(1);  // Yesterday. 


    //Optional arguments - this time I need the organic only 

    var optArgs1 = { 

    'segment': 'gaid::-5'     // Process only Non paid search traffic. 

    }; 


    var results1 = Analytics.Data.Ga.get(
     tableId,     // Table id (format ga:xxxxxx). 
     startDate,     // Start-date (format yyyy-MM-dd). 
     endDate,     // End-date (format yyyy-MM-dd). 
     'ga:sessions', // Comma separated list of metrics. 
     optArgs1); //This time we pass the optArgs1 - ie the one with segment=organic 


    if (results1.getRows()) { 
    return results1; 

    } else { 
    throw new Error('No views (profiles) found'); 
    } 
} 

function getLastNdays(nDaysAgo) { 
    var today = new Date(); 
    var before = new Date(); 
    before.setDate(today.getDate() - nDaysAgo); 
    return Utilities.formatDate(before, 'GMT', 'yyyy-MM-dd'); 
} 


// Print on the sheet - 

function outputToSpreadsheet(results) { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(); 

    // Print the headers. 
    var headerNames = []; 
    for (var i = 0, header; header = results.getColumnHeaders()[i]; ++i) { 
    headerNames.push(header.getName()); 
    } 
    sheet.getRange(1, 1, 1, headerNames.length) 
     .setValues([headerNames]); 

    // Print the rows of data. 
    sheet.getRange(2, 1, results.getRows().length, headerNames.length) 
     .setValues(results.getRows()); 
}