这个名字本身就说明了一切,但这完全是关于广泛匹配竞价——这很好,但可能会导致一些误导性的帐户效果数据。不同顺序的相同单词不会产生相同的性能。我们的脚本接受了这一事实,并对此采取了一些措施。
脚本是如何工作的?
该脚本将检查您的帐户并确定哪些关键字彼此等效并共同构成等效的关键字组。
对于每个等效的关键字组,将根据效果选择一个广泛匹配关键字——“最佳组合”——并被赋予一个标签。等效关键字组中的所有其他广泛匹配关键字将被赋予不同的标签。
标记完所有关键字后,您只需启用最佳的广泛关键字并暂停其余关键字即可。
我如何使用它?
您需要配置一些选项,然后就可以设置了。根据您的偏好和帐户设置选择这些选项:
- ACCOUNT_WIDE 将确定您的等效关键字组是可以从单个广告系列还是多个广告系列中提取的关键字组成。如果您希望仅由同一广告系列中的关键字组成等效关键字组,请设置为 false。
- METRIC 是 AdWords 效果指标,用于确定将保留等效关键字组中的哪个广泛匹配关键字。将保留具有最佳指标的广泛匹配关键字。您可以选择的指标包括点击率、质量得分、* 展示次数、平均每次点击费用和转化点击次数。
- CAMPAIGN_INCLUDE_FILTER 是一个术语列表,用于过滤您要查看的广告系列。营销活动的名称中必须包含此列表中的术语之一。
- CAMPAIGN_EXCLUDE_FILTER 是一个术语列表,用于过滤您要查看的广告系列。营销活动的名称中不能包含列表中的任何术语。
- DATE_RANGE 是比较您在上面选择的指标的日期范围。
- KEEP_LABEL 是您将用于标记具有最佳指标统计数据(例如,最高质量得分)的广泛匹配关键字的标签名称。
- PAUSE_LABEL 是为等效关键字组中所有未获得最佳指标统计数据的关键字提供的标签名称。
如果您发现脚本一直超时,可能是您的帐户太大。尝试使用 CAMPAIGN_INCLUDE_FILTER 和 CAMPAIGN_EXCLUDE_FILTER 多次运行脚本,以每次查看不同的广告系列。
*这是报告的质量得分 (QS)。报告的 QS 是与关键字完全匹配的搜索的 QS,而不是关键字为其投放广告的搜索的 QS 的总和。这对广泛匹配关键字没有多大用处。
暂停重复广泛关键字脚本代码
// ID: 87ea3268e7e6db5e86bc4671c61e65be
/**
*
* Broad-match keyword aggregator script
* This script will group equivalent broad match keywords and label based on performence
*
* Version: 1.1
* Updated 2016-10-11: replaced 'ConvertedClicks' with 'Conversions'
* Google AdWords Script maintained by brainlabsdigital.com
*
*/
function main() {
var ACCOUNT_WIDE = false;
// Defines whether the script looks at campaign-level or account-level broad match duplicate keywords
var METRIC = 'AverageCpc';
// Select the metric which will determine which duplicate keyword will be kept, choose from "Ctr", "QualityScore", "Impressions", "Conversions", "AverageCpc"
var CAMPAIGN_INCLUDE_FILTER = []; // e.g var CAMPAIGN_INCLUDE_FILTER = ["hey", "jude"];
// Campaign filter which will include any campaign with any of the included strings in the campaign name. Case insensitive matching
var CAMPAIGN_EXCLUDE_FILTER = []; // e.g var CAMPAIGN_EXCLUDE_FILTER = ["hey", "jude"];
// Campaign filter which will exclude any campaign with any of the included strings in the campaign name. Case insensitive matching
var DATE_RANGE = 'LAST_30_DAYS';
// Choose one from TODAY, YESTERDAY, LAST_7_DAYS, THIS_WEEK_SUN_TODAY, THIS_WEEK_MON_TODAY, LAST_WEEK, LAST_14_DAYS, LAST_30_DAYS, LAST_BUSINESS_WEEK, LAST_WEEK_SUN_SAT, THIS_MONTH
var KEEP_LABEL = 'DuplicateBroadKeyword_Enable';
// Label one keyword from each duplicate group
var PAUSE_LABEL = 'DuplicateBroadKeyword_Pause';
// Label all keywords which don't have the best statistic from selected
labelDuplicates(ACCOUNT_WIDE, CAMPAIGN_INCLUDE_FILTER, CAMPAIGN_EXCLUDE_FILTER, DATE_RANGE, METRIC, KEEP_LABEL, PAUSE_LABEL);
}
function labelDuplicates(ACCOUNT_WIDE, CAMPAIGN_INCLUDE_FILTER, CAMPAIGN_EXCLUDE_FILTER, DATE_RANGE, METRIC, KEEP_LABEL, PAUSE_LABEL) {
// Create labels
AdWordsApp.createLabel(KEEP_LABEL);
AdWordsApp.createLabel(PAUSE_LABEL);
// Metric data-validation
var allowedMetrics = ['Ctr', 'QualityScore', 'Impressions', 'Conversions', 'AverageCpc'];
var allowedMetrics_lowerCase = allowedMetrics.map(function (str) { return str.toLowerCase(); });
var metricIndex = allowedMetrics_lowerCase.indexOf(METRIC.toLowerCase());
if (metricIndex === -1) {
var error = "Metric '" + METRIC + "' not recognised, please set to one from '" + allowedMetrics.join("', '") + "'.";
Logger.log(error);
throw error;
}
var METRIC = allowedMetrics[metricIndex];
// Generate list of included campaigns
var includeCampaignIds = [];
var campaignIncludes = CAMPAIGN_INCLUDE_FILTER.map(function (str) { return str.toLowerCase(); });
var campaignIterator = AdWordsApp.campaigns()
.withCondition('CampaignStatus = ENABLED')
.get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
var campaignId = campaign.getId();
var campaignName = campaign.getName();
var campaignNameLower = campaignName.toLowerCase();
var flag = false;
for (var i = 0; i < campaignIncludes.length; i++) {
if (campaignNameLower.indexOf(campaignIncludes[i]) !== -1) {
flag = true;
break;
}
}
if (flag) {
includeCampaignIds.push(campaignId);
}
}
// Construct AWQL report query
var selectQuery = 'SELECT CampaignName, CampaignId, Id, AdGroupId, Criteria, ' + METRIC + ' ';
var fromQuery = 'FROM KEYWORDS_PERFORMANCE_REPORT ';
var whereQuery = 'WHERE KeywordMatchType = BROAD AND AdNetworkType1 = SEARCH ';
if (includeCampaignIds.length > 0) {
whereQuery += 'AND CampaignId IN [' + includeCampaignIds.join(',') + '] ';
}
for (var i = 0; i < CAMPAIGN_EXCLUDE_FILTER.length; i++) {
whereQuery += "AND CampaignName DOES_NOT_CONTAIN_IGNORE_CASE '" + CAMPAIGN_EXCLUDE_FILTER[i] + "' ";
}
var duringQuery = 'DURING ' + DATE_RANGE;
var query = selectQuery
+ fromQuery
+ whereQuery
+ duringQuery;
// Generate report
var report = AdWordsApp.report(query);
// Poll report rows
var campaignKeywords = {};
var rows = report.rows();
while (rows.hasNext()) {
var row = rows.next();
var keywordId = row.Id;
var adGroupId = row.AdGroupId;
var campaignId = row.CampaignId;
var keywordText = row.Criteria.toLowerCase();
var metricStat = parseFloat(row[METRIC].replace(/,/g, ''));
if (METRIC.toLowerCase() === 'AverageCpc'.toLowerCase()) {
if (metricStat > 0) {
metricStat = 1 / metricStat;
}
}
var stats = { metric: metricStat };
if (ACCOUNT_WIDE) campaignId = 1;
if (typeof (campaignKeywords[campaignId]) === 'undefined') {
campaignKeywords[campaignId] = [];
}
campaignKeywords[campaignId].push(parseKeyword(keywordId, adGroupId, keywordText, stats));
}
// Establish duplicate keyword groups
if (ACCOUNT_WIDE === true) {
var keywordGroups = {};
}
for (var campaignId in campaignKeywords) {
if (ACCOUNT_WIDE === false) {
var keywordGroups = {};
}
var campaignKeywordsList = campaignKeywords[campaignId];
var keywordArray = [];
for (var keyword in campaignKeywordsList) {
keywordArray.push(campaignKeywordsList[keyword].Text);
}
for (var keyword in campaignKeywordsList) {
var keywordText = campaignKeywordsList[keyword].Text;
var firstIndex = keywordArray.indexOf(keywordText);
var lastIndex = keywordArray.lastIndexOf(keywordText);
// push the dupes into dupe groups
if (firstIndex !== lastIndex) {
if (typeof (keywordGroups[keywordText]) === 'undefined') {
keywordGroups[keywordText] = [];
}
keywordGroups[keywordText].push(campaignKeywordsList[keyword]);
}
}
if (ACCOUNT_WIDE === true) {
continue;
}
labelKeywords(keywordGroups, KEEP_LABEL, PAUSE_LABEL);
}
if (ACCOUNT_WIDE === true) {
labelKeywords(keywordGroups, KEEP_LABEL, PAUSE_LABEL);
}
}
function parseKeyword(keywordId, adGroupId, keywordText, stats) {
var keyword = {};
keyword.KeywordId = keywordId;
keyword.AdGroupId = adGroupId;
keyword.Id = [adGroupId, keywordId];
keyword.Text = orderKeyword(keywordText);
keyword.Stats = stats;
return keyword;
}
function orderKeyword(keywordText) {
// Splitting the words
var keywordTextArray = keywordText.trim().split(' ');
// Sort keyword components
var sortedKeywordComponents = keywordTextArray.sort();
// Turn sorted strings into one word
var sortedKeyword = sortedKeywordComponents.join(' ');
return sortedKeyword;
}
function labelKeywords(keywordGroups, KEEP_LABEL, PAUSE_LABEL) {
for (var keywordText in keywordGroups) {
// cycle through each group to pick best of the bunch
var maxMetric = -1;
var bestKeyword = [];
for (var keyword in keywordGroups[keywordText]) {
if (parseFloat(keywordGroups[keywordText][keyword].Stats.metric) > maxMetric) {
maxMetric = keywordGroups[keywordText][keyword].Stats.metric;
bestKeyword[0] = keywordGroups[keywordText][keyword];
}
}
var indexOfBest = keywordGroups[keywordText].indexOf(bestKeyword[0]);
keywordGroups[keywordText].splice(indexOfBest, 1);
// label all groups with pause/unpause labels
var keywordIterator = AdWordsApp.keywords().withIds([bestKeyword[0].Id]).get();
keywordIterator.next().applyLabel(KEEP_LABEL);
var keywordIdArray = [];
for (keyword in keywordGroups[keywordText]) {
keywordIdArray.push(keywordGroups[keywordText][keyword].Id);
}
var keywordIterator = AdWordsApp.keywords().withIds(keywordIdArray).get();
while (keywordIterator.hasNext()) {
var keyword = keywordIterator.next();
keyword.applyLabel(PAUSE_LABEL);
}
}
}