Javascript 谷歌应用脚本:谷歌分析自动报告
我正在尝试使用谷歌应用程序脚本自动化一些定制的谷歌分析报告,并将数据输出到谷歌文档电子表格中。我遵循了一个教程,并使用以下代码进行了操作:Javascript 谷歌应用脚本:谷歌分析自动报告,javascript,google-apps-script,google-analytics,google-analytics-api,google-spreadsheet-api,Javascript,Google Apps Script,Google Analytics,Google Analytics Api,Google Spreadsheet Api,我正在尝试使用谷歌应用程序脚本自动化一些定制的谷歌分析报告,并将数据输出到谷歌文档电子表格中。我遵循了一个教程,并使用以下代码进行了操作: function runDemo() { try { var firstProfile = getFirstProfile(); var results = getReportDataForProfile(firstProfile); outputToSpreadsheet(results); } catch(er
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());
}
这很好,但当我试图查询Google Analytics API以获取第二组结果时,问题就出现了。我需要做的报告需要不同的分段和过滤,因此我假设我需要创建多组结果写入工作表,但额外的代码不起作用-创建了第二个工作表,但其中写入的数据是var“results”的数据,而不是“results1”的数据。代码如下:
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());
}
我得到的错误消息是:“结果”没有定义,并且没有在工作表上写入任何内容。我希望至少能得到第一个查询的结果,因为var'results'的代码仍然是一样的。添加到上的是“results1”
正如您可能猜到的,我不是一名开发人员,而且我对JavaScript的接触很少,因此我非常感谢您在这方面的帮助。提前谢谢 我认为这是因为两件事: 复制并粘贴整个函数OutputSpreadSheet两次。您不需要这样做。您可以删除第二个函数OutputSpreadSheet 第二件事是因为在同一个函数getReportDataForProfile中调用API两次,但只返回第一次调用的结果。 请看以下几行:
if (results.getRows()) {
return results;
} else {
throw new Error('No views (profiles) found');
}
在函数getReportDataForProfile中,您要求检查结果是否仅存在于results而不存在于results1
为了方便您,我更改了代码,基本上您的代码必须是:
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());
}
我知道这个问题由来已久,但这可能对你仍有帮助。有一个Google Analytics插件,可以完成所有繁重的工作。然后,您可以根据需要操作工作表中的数据。您可以在下面的链接中查看文档
getReportDataForProfile函数会返回结果变量,因此永远不会实际使用results1。我的建议是不要重新发明轮子-谷歌提供了一个内置GA脚本的电子表格:,所以安装和配置脚本并设置触发器。这将需要大约十分钟(当然,除非你想要学习体验,但看起来你更追求的是结果)。