我如何使用 google 应用程序脚本修改从 google 分析中提取的数据?
How do i use google apps script to modify data that i pull from google analytics?
我正在使用 google 应用程序脚本从 google 分析中提取数据,并在 google sheet 秒后将其放入报告中。对于这个具体的报告,拉取的数据非常大,我想在我把它放在google sheet之前修改它。我需要你的帮助来弄清楚如何使用 javascript/google 应用程序脚本来完成。
这是我当前的代码:
function testReport() {
var profileId = XXXXXXX;
var tableId = 'ga:' + profileId;
var startDate = 'yesterday';
var endDate = 'yesterday';
var metrics = 'ga:sessions';
var optionalArgs = {
'dimensions': 'ga:landingPagePath, ga:date',
'filters': 'ga:sessions>0',
};
var report = Analytics.Data.Ga.get(tableId, startDate, endDate, metrics, optionalArgs);
if (report.rows) {
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, report.rows.length, report.rows[0].length).setValues(report.rows);
}
}
report.rows
是一个对象,格式如下:
[[/,20191228,100],[/locationOne,20191228,10],[/locationTwo,20191228,1],[/locationOne?s=a,20191228,10]]
这将创建一个 google sheet,如下所示:
Landing Page Date Sessions
/ 20191228 100
/locationOne 20191228 10
/locationTwo 20191228 1
/locationOne?s=a 20191228 10
但是,我的网站上有很多登陆页面,因此我需要在将这些数据粘贴到 google sheet 之前压缩这些数据。理想情况下,我想做两件事:
- 根据着陆页值创建一个名为 'Web Section' 的新列。例如,如果
着陆页包含 'One' 然后是新列中的值
应该是 'Location One'。如果着陆页包含 'Two',则该值应为 'Location Two'。如果未指定值,则所有数据都应属于 'Others'
- 对数据进行分组,以便数据按列 'Web Section' 和 'Date' 分组并显示会话总和
基于此,我应该得到一个新的 table,如下所示:
Web Section Date Sessions
Location One 20191228 20
Location Two 20191228 1
Others 20191228 100
谢谢你帮我解决这个问题!
你想实现如下情况
来自
[["/",20191228,100],["/locationOne",20191228,10],["/locationTwo",20191228,1],["/locationOne?s=a",20191228,10],["/locationOne",20191229,10]]
至
Web Section Date Sessions
Location One 20191228 20
Location One 20191229 10
Location Two 20191228 1
Others 20191228 100
您想将location
修改为Location
。
- 如果日期不同,你想把日期分开。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
流量:
修改后的脚本流程如下
- 检索值为
report
和 Analytics.Data.Ga.get()
。
- 创建对象。这用于计算"Sessions".
- 创建数组。这用于放入电子表格。
- 将数组放入电子表格。
修改后的脚本:
当你的脚本修改后,变成如下。
从:
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, report.rows.length, report.rows[0].length).setValues(report.rows);
到:
// Please set the key words for using as "Web Section".
var searchValues = ["One", "Two"];
// Create object.
var object = report.rows.reduce(function(o, e) {
var idx = -1;
var check = searchValues.some(function(f, j) {
if (e[0].indexOf(f) != -1) {
idx = j;
return true;
}
return false;
});
if (check) {
var s = searchValues[idx];
var key = e[0].replace(/\//g, "").split(s).shift().replace(/^[a-z]/g, function(f) {return f.toUpperCase()}) + " " + s + "_" + e[1];
o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
} else {
var others = "Others_" + e[1];
o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
}
return o;
}, {});
// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
// Put array to Spreadsheet.
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, array.length, array[0].length).setValues(array);
用于检查脚本:
var report = {rows: [["/",20191228,100],["/locationOne",20191228,10],["/locationTwo",20191228,1],["/locationOne?s=a",20191228,10],["/locationOne",20191229,10]]};
// Please set the key words for using as "Web Section".
var searchValues = ["One", "Two"];
// Create object.
var object = report.rows.reduce(function(o, e) {
var idx = -1;
var check = searchValues.some(function(f, j) {
if (e[0].indexOf(f) != -1) {
idx = j;
return true;
}
return false;
});
if (check) {
var s = searchValues[idx];
var key = e[0].replace(/\//g, "").split(s).shift().replace(/^[a-z]/g, function(f) {return f.toUpperCase()}) + " " + s + "_" + e[1];
o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
} else {
var others = "Others_" + e[1];
o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
}
return o;
}, {});
// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
console.log(array);
注:
- 在这个修改后的脚本中,为了搜索用作"Web Section"的关键字,我使用了
var searchValues = ["One", "Two"];
。因为我不确定locationOne
、locationTwo
的模式。所以在这个修改后的脚本中,首先,请设置这个。
- 不幸的是,我不确定
["/",20191228,100]
的 20191228
和 100
是数字还是字符串。所以我在修改后的脚本中使用了Number(e[2])
。
- 如果不想对数组进行排序,请去掉
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
。
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。到时候能不能提供更多的样本值和你期望的输出?借此,我想确认一下。
已添加:
- 您想使用
One
、Two
作为搜索值。
- 您想使用
First Output
、Second Output
作为用于放置电子表格的名称。
关于你的附加问题,我可以像上面那样理解。如果我的理解是正确的,下面的示例脚本怎么样?
// Please set the key words and names for using as "Web Section".
var searchValues = {
search: ["One", "Two"],
name: ["First Output", "Second Output"]
};
// Create object.
var object = report.rows.reduce(function(o, e) {
var idx = -1;
var check = searchValues.search.some(function(f, j) {
if (e[0].indexOf(f) != -1) {
idx = j;
return true;
}
return false;
});
if (check) {
var key = searchValues.name[idx] + "_" + e[1];
o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
} else {
var others = "Others_" + e[1];
o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
}
return o;
}, {});
// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
// Put array to Spreadsheet.
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, array.length, array[0].length).setValues(array);
- 在此示例脚本中,请将
search
的索引和name
的索引对应到searchValues
中。
- 在上述情况下,
One
和Two
搜索的值分别使用First Output
和Second Output
的名称。
不太确定你的范围(如果你只计划做 4 个 LP,或者如果有 n 个 LP),但更简单的方法是在 GA 上为你想要提取的 LP 创建细分。然后使用 GA 加载项创建一个 Google Sheet 从这些段中提取数据。
我正在使用 google 应用程序脚本从 google 分析中提取数据,并在 google sheet 秒后将其放入报告中。对于这个具体的报告,拉取的数据非常大,我想在我把它放在google sheet之前修改它。我需要你的帮助来弄清楚如何使用 javascript/google 应用程序脚本来完成。
这是我当前的代码:
function testReport() {
var profileId = XXXXXXX;
var tableId = 'ga:' + profileId;
var startDate = 'yesterday';
var endDate = 'yesterday';
var metrics = 'ga:sessions';
var optionalArgs = {
'dimensions': 'ga:landingPagePath, ga:date',
'filters': 'ga:sessions>0',
};
var report = Analytics.Data.Ga.get(tableId, startDate, endDate, metrics, optionalArgs);
if (report.rows) {
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, report.rows.length, report.rows[0].length).setValues(report.rows);
}
}
report.rows
是一个对象,格式如下:
[[/,20191228,100],[/locationOne,20191228,10],[/locationTwo,20191228,1],[/locationOne?s=a,20191228,10]]
这将创建一个 google sheet,如下所示:
Landing Page Date Sessions
/ 20191228 100
/locationOne 20191228 10
/locationTwo 20191228 1
/locationOne?s=a 20191228 10
但是,我的网站上有很多登陆页面,因此我需要在将这些数据粘贴到 google sheet 之前压缩这些数据。理想情况下,我想做两件事:
- 根据着陆页值创建一个名为 'Web Section' 的新列。例如,如果 着陆页包含 'One' 然后是新列中的值 应该是 'Location One'。如果着陆页包含 'Two',则该值应为 'Location Two'。如果未指定值,则所有数据都应属于 'Others'
- 对数据进行分组,以便数据按列 'Web Section' 和 'Date' 分组并显示会话总和
基于此,我应该得到一个新的 table,如下所示:
Web Section Date Sessions
Location One 20191228 20
Location Two 20191228 1
Others 20191228 100
谢谢你帮我解决这个问题!
你想实现如下情况
来自
[["/",20191228,100],["/locationOne",20191228,10],["/locationTwo",20191228,1],["/locationOne?s=a",20191228,10],["/locationOne",20191229,10]]
至
Web Section Date Sessions Location One 20191228 20 Location One 20191229 10 Location Two 20191228 1 Others 20191228 100
您想将
location
修改为Location
。- 如果日期不同,你想把日期分开。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
流量:
修改后的脚本流程如下
- 检索值为
report
和Analytics.Data.Ga.get()
。 - 创建对象。这用于计算"Sessions".
- 创建数组。这用于放入电子表格。
- 将数组放入电子表格。
修改后的脚本:
当你的脚本修改后,变成如下。
从:var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, report.rows.length, report.rows[0].length).setValues(report.rows);
到:
// Please set the key words for using as "Web Section".
var searchValues = ["One", "Two"];
// Create object.
var object = report.rows.reduce(function(o, e) {
var idx = -1;
var check = searchValues.some(function(f, j) {
if (e[0].indexOf(f) != -1) {
idx = j;
return true;
}
return false;
});
if (check) {
var s = searchValues[idx];
var key = e[0].replace(/\//g, "").split(s).shift().replace(/^[a-z]/g, function(f) {return f.toUpperCase()}) + " " + s + "_" + e[1];
o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
} else {
var others = "Others_" + e[1];
o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
}
return o;
}, {});
// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
// Put array to Spreadsheet.
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, array.length, array[0].length).setValues(array);
用于检查脚本:
var report = {rows: [["/",20191228,100],["/locationOne",20191228,10],["/locationTwo",20191228,1],["/locationOne?s=a",20191228,10],["/locationOne",20191229,10]]};
// Please set the key words for using as "Web Section".
var searchValues = ["One", "Two"];
// Create object.
var object = report.rows.reduce(function(o, e) {
var idx = -1;
var check = searchValues.some(function(f, j) {
if (e[0].indexOf(f) != -1) {
idx = j;
return true;
}
return false;
});
if (check) {
var s = searchValues[idx];
var key = e[0].replace(/\//g, "").split(s).shift().replace(/^[a-z]/g, function(f) {return f.toUpperCase()}) + " " + s + "_" + e[1];
o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
} else {
var others = "Others_" + e[1];
o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
}
return o;
}, {});
// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
console.log(array);
注:
- 在这个修改后的脚本中,为了搜索用作"Web Section"的关键字,我使用了
var searchValues = ["One", "Two"];
。因为我不确定locationOne
、locationTwo
的模式。所以在这个修改后的脚本中,首先,请设置这个。 - 不幸的是,我不确定
["/",20191228,100]
的20191228
和100
是数字还是字符串。所以我在修改后的脚本中使用了Number(e[2])
。 - 如果不想对数组进行排序,请去掉
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
。
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。到时候能不能提供更多的样本值和你期望的输出?借此,我想确认一下。
已添加:
- 您想使用
One
、Two
作为搜索值。 - 您想使用
First Output
、Second Output
作为用于放置电子表格的名称。
关于你的附加问题,我可以像上面那样理解。如果我的理解是正确的,下面的示例脚本怎么样?
// Please set the key words and names for using as "Web Section".
var searchValues = {
search: ["One", "Two"],
name: ["First Output", "Second Output"]
};
// Create object.
var object = report.rows.reduce(function(o, e) {
var idx = -1;
var check = searchValues.search.some(function(f, j) {
if (e[0].indexOf(f) != -1) {
idx = j;
return true;
}
return false;
});
if (check) {
var key = searchValues.name[idx] + "_" + e[1];
o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
} else {
var others = "Others_" + e[1];
o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
}
return o;
}, {});
// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
// Put array to Spreadsheet.
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data');
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, array.length, array[0].length).setValues(array);
- 在此示例脚本中,请将
search
的索引和name
的索引对应到searchValues
中。 - 在上述情况下,
One
和Two
搜索的值分别使用First Output
和Second Output
的名称。
不太确定你的范围(如果你只计划做 4 个 LP,或者如果有 n 个 LP),但更简单的方法是在 GA 上为你想要提取的 LP 创建细分。然后使用 GA 加载项创建一个 Google Sheet 从这些段中提取数据。