如果质量得分低的关键字正在浪费您的资金,此脚本将帮助您找出它们的位置,以便正面解决问题。
质量得分是决定广告评级的关键,它决定了您的广告在搜索引擎结果页面中的显示位置,也是 Google 如何确定您的每次点击费用的一个因素。它通过很少展示广告来惩罚那些以低质量得分出价的广告客户。
如果您使用的是 Google Grants 帐户,低质量得分可能会使您的整个帐户面临被暂停的风险,因此您需要尽快解决这个问题。
脚本是如何工作的?
此脚本可以为修复低质量得分关键字节省大量时间。您需要做的就是设置一个质量得分阈值,脚本将通过电子邮件发送给您,得分等于或低于该值的关键字所在的位置,因此您可以立即将它们分类。
它还可以为您标记关键字,使它们更容易找到。如果您有零容忍政策,它可以为您暂停关键字(确保在这种情况下您的阈值不会太高)。
在进行测试运行以检查是否一切正常后,我们建议您根据您希望脚本为您检查质量得分的频率设置定期计划。
我如何使用它?
在 Google Ads 中,转到批量操作,然后选择脚本以转到脚本页面。单击大“+”按钮创建一个新按钮,然后粘贴下面的脚本。
然后,编辑以下选项:
- EMAIL_ADDRESSES是将收到低质量得分关键字警报的电子邮件地址列表。这些应该是方括号内的逗号分隔列表。例如,[“[email protected]”和“[email protected]”]。
- QS_THRESHOLD是您定义的脚本将视为“低”的质量得分值。
- 如果您希望自动标记低质量得分关键字,则将LABEL_KEYWORDS设置为 true 并将标签名称放在LOW_QS_LABEL_NAME 中
- 如果您希望自动暂停低质量得分关键字,请将PAUSE_KEYWORDS设置为 true。
低质量得分警报脚本代码
// ID: 61daad0e8fb8188eb2257bc8ee01bc5b
/**
*
* Low Quality Score Alert
*
* This script finds the low QS keywords (determined by a user defined threshold)
* and sends an email listing them. Optionally it also labels and/or pauses the
* keywords.
*
* Version: 1.0
* Google AdWords Script maintained on brainlabsdigital.com
*
**/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//Options
var EMAIL_ADDRESSES = ["[email protected]", "[email protected]"];
// The address or addresses that will be emailed a list of low QS keywords
// eg ["[email protected]", "[email protected]"] or ["[email protected]"]
var QS_THRESHOLD = 3;
// Keywords with quality score less than or equal to this number are
// considered 'low QS'
var LABEL_KEYWORDS = true;
// If this is true, low QS keywords will be automatically labelled
var LOW_QS_LABEL_NAME = "Low QS Keyword";
// The name of the label applied to low QS keywords
var PAUSE_KEYWORDS = false;
// If this is true, low QS keywords will be automatically paused
// Set to false if you want them to stay active.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Functions
function main() {
Logger.log("Pause Keywords: " + PAUSE_KEYWORDS);
Logger.log("Label Keywords: " + LABEL_KEYWORDS);
var keywords = findKeywordsWithQSBelow(QS_THRESHOLD);
Logger.log("Found " + keywords.length + " keywords with low quality score");
if (!labelExists(LOW_QS_LABEL_NAME)) {
Logger.log(Utilities.formatString('Creating label: "%s"', LOW_QS_LABEL_NAME));
AdWordsApp.createLabel(LOW_QS_LABEL_NAME, 'Automatically created by QS Alert', 'red');
}
var mutations = [
{
enabled: PAUSE_KEYWORDS,
callback: function (keyword) {
keyword.pause();
}
},
{
enabled: LABEL_KEYWORDS,
callback: function (keyword, currentLabels) {
if (currentLabels.indexOf(LOW_QS_LABEL_NAME) === -1) {
keyword.applyLabel(LOW_QS_LABEL_NAME);
}
}
}
];
var chunkSize = 10000;
var chunkedKeywords = chunkList(keywords, chunkSize);
Logger.log("Making changes to keywords..");
chunkedKeywords.forEach(function (keywordChunk) {
mutateKeywords(keywordChunk, mutations);
});
if (keywords.length > 0) {
sendEmail(keywords);
Logger.log("Email sent.");
} else {
Logger.log("No email to send.");
}
}
function findKeywordsWithQSBelow(threshold) {
var query = 'SELECT Id, AdGroupId, CampaignName, AdGroupName, Criteria, QualityScore, Labels'
+ ' FROM KEYWORDS_PERFORMANCE_REPORT WHERE Status = "ENABLED" AND CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED"'
+ ' AND HasQualityScore = "TRUE" AND QualityScore <= ' + threshold;
var report = AdWordsApp.report(query);
var rows = report.rows();
var lowQSKeywords = [];
while (rows.hasNext()) {
var row = rows.next();
var lowQSKeyword = {
campaignName: row['CampaignName'],
adGroupName: row['AdGroupName'],
keywordText: row['Criteria'],
labels: (row['Labels'].trim() === '--') ? [] : JSON.parse(row['Labels']),
uniqueId: [row['AdGroupId'], row['Id']],
qualityScore: row['QualityScore']
};
lowQSKeywords.push(lowQSKeyword);
}
return lowQSKeywords;
}
function labelExists(labelName) {
var condition = Utilities.formatString('LabelName = "%s"', labelName);
return AdWordsApp.labels().withCondition(condition).get().hasNext();
}
function chunkList(list, chunkSize) {
var chunks = [];
for (var i = 0; i < list.length; i += chunkSize) {
chunks.push(list.slice(i, i + chunkSize));
}
return chunks;
}
function mutateKeywords(keywords, mutations) {
var keywordIds = keywords.map(function (keyword) {
return keyword['uniqueId'];
});
var mutationsToApply = getMutationsToApply(mutations);
var adwordsKeywords = AdWordsApp.keywords().withIds(keywordIds).get();
var i = 0;
while (adwordsKeywords.hasNext()) {
var currentKeywordLabels = keywords[i]['labels'];
var adwordsKeyword = adwordsKeywords.next();
mutationsToApply.forEach(function (mutate) {
mutate(adwordsKeyword, currentKeywordLabels);
});
i++;
}
}
function getMutationsToApply(mutations) {
var enabledMutations = mutations.filter(function (mutation) {
return mutation['enabled'];
});
return enabledMutations.map(function (condition) {
return condition['callback'];
});
}
function sendEmail(keywords) {
var subject = "Low Quality Keywords Paused";
var htmlBody =
"<p>Keywords with a quality score of less than " + QS_THRESHOLD + "found.<p>"
+ "<p>Actions Taken:<p>"
+ "<ul>"
+ "<li><b>Paused</b>: " + PAUSE_KEYWORDS + "</li>"
+ "<li><b>Labelled</b> with <code>" + LOW_QS_LABEL_NAME + "</code>: " + LABEL_KEYWORDS + "</li>"
+ "</ul>"
+ renderTable(keywords);
MailApp.sendEmail({
to: EMAIL_ADDRESSES.join(","),
subject: subject,
htmlBody: htmlBody
});
}
function renderTable(keywords) {
var header = '<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">'
+ '<thead><tr>'
+ '<th>Campaign Name</th>'
+ '<th>Ad Group Name</th>'
+ '<th>Keyword Text</th>'
+ '<th>Quality Score</th>'
+ '</tr></thead><tbody>';
var rows = keywords.reduce(function (accumulator, keyword) {
return accumulator
+ '<tr><td>' + [
keyword['campaignName'],
keyword['adGroupName'],
keyword['keywordText'],
keyword['qualityScore']
].join('</td><td>')
+ '</td></tr>';
}, "");
var footer = '</tbody></table>';
var table = header + rows + footer;
return table;
}