b谷歌显示网络(GDN)是两个b谷歌AdWords网络之一,它允许企业在网络上的大量网站上放置显示广告。虽然与b谷歌的搜索网络相比,这是一种被动的广告形式,但该公司估计,GDN涉及90%以上的互联网用户。
GDN的问题
在线展示广告位置的阴暗面是,你需要花费大量时间过滤数百个你不希望出现的关于你的公司、产品或服务的信息的位置。营销人员、SEO专家、作家、网络开发人员和其他负责任的员工面临的问题是,即使使用过滤器,他们也要花几个小时来处理这种类型的组织。
谷歌AdWords提供了在系统界面内直接使用javascript管理广告活动的选项,因此使用可以自动完成这项工作的脚本清理GDN位置的想法是有希望的。我们的团队在一段时间前开始研究这个主题领域,我们研究了通过使用脚本来解决这个问题的尝试。
我们发现以下两个选项特别有用:第一个是由Alexey Jaroshenko开发的,第二个是由Derek Martin开发的。他们的一些想法和部分剧本被用来开发一个解决方案。
通解
要充分了解我们的逐步解决方案是如何工作的,以及您有什么选择,请考虑以下重要细节。
主要条件
该脚本指的是谷歌AdWords在指定时间段内的自动投放报告。它制作了几个样本,其中所选的放置位置满足以下条件:
费用超过X美元且无折算;
转换费用在X美元以上;
印象超过X次,点击率低于Y %,没有转化;
有超过X个印象,CTR大于Y %,没有转化。
上述所有标准都可以在谷歌电子表格的“config”列表中手动设置,因为脚本会从中导入数据。
不必要的域
执行相同的过程来分析域名中不需要的“坏”单词的条目,而不进行转换。这些标记的列表在“ exclude_domain ”列表中指定。
图1:谷歌电子表格“exclude_domain”列表的示例。
例外情况一览表
选择的位置被添加到帐户共享库级别的例外列表中。
对于每个示例,共享库中都有一个单独的列表(必须首先创建它们),您可以随意命名它们,但它必须包含—list1、list2、list3、list4和list5。此外,文件本身也提供了相关信息(见图2和图3)。
图2:带有列表的共享库的示例。
图3:谷歌电子表格报告的示例。
您可以添加移动应用程序,匿名。谷歌和YouTube的“ except_domain ”列表。
图4:“except_domain”列表的示例。
结果通知邮件
脚本执行完成后,会发送邮件到config列表中指定的联系人地址。电子邮件包含前两个样本的统计数据和剩余选择的排除位置的数量,以及谷歌电子表格的链接。请注意,您需要在脚本的各自行中设置谷歌电子表格的链接和项目的标题。
一步一步的解决方案
1. 注明谷歌电子表格链接和项目名称:
Var config = {
SPREADSHEET_URL:链接到谷歌电子表格‘,
PROJECT_NAME:“项目名称”,
}
2. 指定列表的标题,其中第5个位置选择的“坏”,表现不佳的域的标记在第一列中显示:
函数getConfigData(电子表格){
var excludeDomainSheet = spreadsheet.getSheetByName(‘exclude_domain‘),
values =exclude DomainSheet.getSheetValues(1,1,excludeDomainSheet.getLastRow(),1);
配置。排除= [];
If (typeof values == “object“) {
(我= 0;I < values.length;我+ +){
config.exclude.push(值[我][0]);
}
}
Logger.log (config.exclude)
3. 指出列表的标题,其中不包括在统计分析中的域的标记:
var except DomainSheet = spreadsheet.getSheetByName(‘except_domain‘),
values = except DomainSheet.getSheetValues(1,1,exceptDomainSheet.getLastRow(),1);
配置。Except = [];
If (typeof values == “object“){
(我= 0;I < values.length;我+ +){
config.except.push(值[我][0]);
}
}
Logger.log (config.except)
4. 指定你的选择标准:
列表标题,
联系电子邮件,
报告时段;
第一次选择位置的最大费用,
第二次选择投放的最大转换成本,
第三次选择的最小印象数,
第三个选择的最大点击率;
第四次选择的最小印象数,以及
第四次选择的最低点击率。
var configSheet = spreadsheet.getSheetByName(‘config‘);
配置。email = configSheet.getRange(1,2,1,1).getValues();
配置。timeperiod = configSheet.getRange(2,2,1,1).getValue();
配置。listCost = configSheet.getRange(3,2,1,1).getValue();
配置。list2converoncost = configSheet.getRange(4,2,1,1).getValue();
配置。list3Impressions = configSheet.getRange(5,2,1,1).getValue();
配置。list3Ctr = configSheet.getRange(6,2,1,1).getValue();
配置。list4Impressions = configSheet.getRange(7,2,1,1).getValue();
配置。list4Ctr = configSheet.getRange(8,2,1,1).getValue()
5. 考虑到脚本执行的最后日期,更新文档的标题:
main() {
var spreadsheet = SpreadsheetApp.openByUrl(config.SPREADSHEET_URL);
var curDate =实用程序。formatDate(new Date(), “GMT+3“, “yyyy- mm -dd“);
getConfigData(电子表格);
电子表格。setName(“GDN报告”+ config. conf)项目名称+ “ “ +当前日期)
6. 生成报告:
var body = “
谷歌显示网络-报告表现不佳的广告
“;body += “
花费超过”listCost +“美元和没有带来转换:
”;Body += “
- “;
- “ + list[i]。位置+ ‘ - ‘ + list[i]。cost + ‘ USD ‘ + “ “;
var list = runHightCostAndNoConvertingReport();
var = [];
(我= 0;I < list.length;我+ +){
Body += “
}
addPlacementList (list1,列表,电子表格);
Body += “
body += “
位置的转换成本高于” + config。list2converoncost + “ USD:
;Body += “
- “;
- “ + list2[i]。位置+ ‘ - ‘ + list2[i]。cost + ‘ USD ‘ + ‘ -转换成本- ‘ + list2[i]。costperconversion + ‘ USD ‘ + “ “;
var list2 = runhighcostofconveronsreport ();
(我= 0;I < list2.length;我+ +){
Body += “
}
addPlacementList(“用于”,用于电子表格);
Body += “
body += “
位置大于”list3Impressions +“印象和点击率低于”+ config。list3Ctr + “%:
“;Body += “
- “;
- 异常的数量- “ + list3。长度+ “ “;
var list3 = runbadctrnoconveronsreport ();
body += “
addPlacementList (list3, list3、电子表格);
Body += “
body += “
位置大于”list4Impressions +“印象和点击率超过”+ config。list4Ctr + “%:
“;Body += “
- “;
- 异常的数量- “ + list4。长度+ “ “;
var list4 = runHighCtrReport();
body += “
addPlacementList (list4, list4、电子表格);
Body += “
body += “
的位置,其中域名包含不需要的词:
“;Body += “
- “;
- 异常的数量- “ + list5。长度+ “ “;
var list5 = gameplacement ();
body += “
addPlacementList (list5, list5、电子表格);
Body += “
body += “链接到报告谷歌电子表格“;
7. 发送带有选定位置的电子邮件:
如果(config.email.length) {
MailApp.sendEmail(配置。电子邮件,“显示网络警报-”+配置。PROJECT_NAME + “ - “ + curDate, body, {htmlBody: body});
}
8. 使用以下函数添加排除项中的位置:
addPlacementList(nameList,list,spreadsheet) {
Var rows = [],
床单,
范围内,
listSharedExcludedPlacementIterator;
sheet = spreadsheet.getSheetByName(nameList);
sheet.clear ();
范围=表。getRange(1,1,1,7).setValues([[‘Exclusion URL‘,‘Impressions‘,‘Clicks‘,‘CTR‘,‘Cost‘,‘Conversions‘,‘Cost Per Conversion‘]]);
range.setBackground(“黄色”);
listSharedExcludedPlacementIterator = AdWordsApp.excludedPlacementLists()
.withCondition(“Name CONTAINS ‘“ + nameList + “‘“).get();
while (listSharedExcludedPlacementIterator.hasNext()) {
listSharedExcludedPlacement = listSharedExcludedPlacementIterator.next();
}
(我= 0;I < list.length;我+ +){
listSharedExcludedPlacement.addExcludedPlacement([我].placement列表);
rows.push列表([[我]。位置,列出[我]。印象,列出[我]。点击,[我]列表。单击/ list[i]。印象* 100 +“%”,列表[i]。成本,(我)列表。转换,列表[我].costperconversion])
}
如果(rows.length)
床单。getRange(2,1,行)长度,7).setValues(行)。Sort ({column: 2,升序:false});
}
函数runHightCostAndNoConvertingReport() {
List = [];
var periodString = “;
如果(config.timeperiod) {
periodString = ‘DURING ‘ + config.timeperiod;
Logger.log (periodString);
} else {
Logger.log(‘DURING ALL TIME‘);
}
9. 确定花费超过X美元且没有带来转化的广告投放:
var report = AdWordsApp.report
‘选择域,点击,印象,CostPerConversion,转换,成本’ +
‘ from automatic_placements_performance_report ’ +
‘WHERE Cost > ’ + config。listCost * 1000000 +“”+
‘AND转换< 1 ’ +
periodString);
Var rows = report.rows();
while (rows.hasNext()) {
Var row = rows.next();
var anonymous = row[‘Domain‘].match(new RegExp(config.except.join(‘|‘).replace(/\./g,‘\\.‘),‘g‘));
If (anonymous == null) {
var placementDetail = new placementObject(行[‘Domain‘],行[‘Clicks‘],行[‘Impressions‘],行[‘CostPerConversion‘],行[‘Conversions‘],行[‘Cost‘]);
list.push (placementDetail);
}
}
返回列表;
}
函数runhighcostofconveronsreport () {
List = [];
var periodString = “;
如果(config.timeperiod) {
periodString = ‘DURING ‘ + config.timeperiod;
Logger.log (periodString);
} else {
Logger.log(‘DURING ALL TIME‘);
}
10. 确定转化率高于X USD的投放位置:
var report = AdWordsApp.report
‘选择域,点击,印象,CostPerConversion,转换,成本’ +
‘ from automatic_placements_performance_report ’ +
‘WHERE CostPerConversion > ’ + config。list2ConversionCost * 1000000 +“”+
‘AND转换> 1 ’ +
periodString);
Var rows = report.rows();
while (rows.hasNext()) {
Var row = rows.next();
var anonymous = row[‘Domain‘].match(new RegExp(config.except.join(‘|‘).replace(/\./g,‘\\.‘),‘g‘));
If (anonymous == null) {
var placementDetail = new placementObject(行[‘Domain‘],行[‘Clicks‘],行[‘Impressions‘],行[‘CostPerConversion‘],行[‘Conversions‘],行[‘Cost‘]);
list.push (placementDetail);
}
}
返回列表;
}
函数runbadctrnoconveronsreport () {
List = [];
var periodString = “;
如果(config.timeperiod) {
periodString = ‘DURING ‘ + config.timeperiod;
Logger.log (periodString);
} else {
Logger.log(‘DURING ALL TIME‘);
}
11. 确定没有转化率,印象超过X,点击率低于Y %的广告位置:
var report = AdWordsApp.report
‘选择域,点击,印象,CostPerConversion,转换,成本’ +
‘ from automatic_placements_performance_report ’ +
‘WHERE Impressions > ’ + config。list3印象+“”+
‘AND ctrl < ’ + config。list3Ctr * 0.01 +“”+
‘AND转换< 1 ’ +
periodString);
Var rows = report.rows();
while (rows.hasNext()) {
Var row = rows.next();
var anonymous = row[‘Domain‘].match(new RegExp(config.except.join(‘|‘).replace(/\./g,‘\\.‘),‘g‘));
If (anonymous == null) {
var placementDetail = new placementObject(行[‘Domain‘],行[‘Clicks‘],行[‘Impressions‘],行[‘CostPerConversion‘],行[‘Conversions‘],行[‘Cost‘]);
list.push (placementDetail);
}
}
返回列表;
}
函数runHighCtrReport() {
List = [];
var periodString = “;
如果(config.timeperiod) {
periodString = ‘DURING ‘ + config.timeperiod;
Logger.log (periodString);
} else {
Logger.log(‘DURING ALL TIME‘);
}
12. 找出那些没有转化率,但印象超过X,点击率超过Y %的广告位置:
var report = AdWordsApp.report
‘选择域,点击,印象,CostPerConversion,转换,成本’ +
‘ from automatic_placements_performance_report ’ +
‘WHERE Impressions > ’ + config。list4Impressions +“”+
‘AND ctrl b> ’ + config。list4Ctr * 0.01 +“”+
‘AND转换< 1 ’ +
periodString);
Var rows = report.rows();
while (rows.hasNext()) {
Var row = rows.next();
var anonymous = row[‘Domain‘].match(new RegExp(config.except.join(‘|‘).replace(/\./g,‘\\.‘),‘g‘));
If (anonymous == null) {
var placementDetail = new placementObject(行[‘Domain‘],行[‘Clicks‘],行[‘Impressions‘],行[‘CostPerConversion‘],行[‘Conversions‘],行[‘Cost‘]);
list.push (placementDetail);
}
}
返回列表;
}
函数gamePlacements() {
List = [];
var periodString = “;
如果(config.timeperiod) {
periodString = ‘DURING ‘ + config.timeperiod;
Logger.log (periodString);
} else {
Logger.log(‘DURING ALL TIME‘);
}
13. 添加任何没有转换的位置,哪个域包含不需要的单词:
var report = AdWordsApp.report
‘选择域,点击,印象,CostPerConversion,转换,成本’ +
‘ from automatic_placements_performance_report ’ +
‘WHERE转换< 1 ’ +
periodString);
Var rows = report.rows();
while (rows.hasNext()) {
Var row = rows.next();
var anonymous = row[‘Domain‘].match(new RegExp(config.except.join(‘|‘).replace(/\./g,‘\\.‘),‘g‘));
If (anonymous == null) {
var placement = row[‘Domain‘];
var clicks = row[‘ clicks ‘];
var impressions = row[‘ impressions ‘];
var costperconversion = row[‘ costperconversion ‘]
var conversions = row[‘ conversions ‘];
var cost = row[‘ cost ‘];
var placementDetail =新placementObject(位置,点击,印象,成本转换,转换,成本);
if (containsAny(placement.toString(), config.exclude)) {
var placementDetail =新placementObject(位置,点击,印象,成本转换,转换,成本);
list.push (placementDetail);
}
}
}
返回列表;
}
函数containsAny(str, substrings) {
For (var I = 0;= substrings.length;我+ +){
Var substring = substrings[i];
if (str.indexOf(substring) != - 1) {
返回字符串;
}
}
返回null;
}
函数placementObject(位置,点击,印象,成本,转换,转换,成本){
这一点。安置=安置;
这一点。点击=点击;
这一点。印象=印象;
这一点。Costperconversion = Costperconversion;
这一点。转换=转换;
这一点。Cost =成本;
}
结果
我们使用以下标准测试脚本(见下图)。
图5:用于测试脚本并找到“糟糕”位置的标准。
我们收到的邮件包含以下发现:
谷歌展示网络-表现不佳的广告投放报告:花费超过300美元但没有带来转化的广告投放;转化成本超过500美元的广告投放;展示次数超过100次且点击率低于0.05%的广告投放;
例外的数量- 3
展示次数超过50次,点击率超过8%的广告位:
例外的数量- 7
位置,哪个域名包含不需要的单词:
异常的数量- 382
链接到报告谷歌电子表格。
最后的评论
指出一些需要牢记的重要细节是公平的:
上述参数可以根据您的项目需要指定。
您可以在共享库中的异常列表中添加新的位置。
请记住,您可以每周或在必要时调整脚本的自动启动。
如果您的帐户有很长的历史,建议检查整个时间段,以获得所有表现不佳的位置。为此,只需将时间段字段留空即可。然后,您可以更改“LAST_WEEK”或“LAST_14_DAYS”的周期。
祝你好运,找到你的“坏”位置,提高你的表现!
对你有用吗?请在评论中告诉我们。