Попробовать
Показывает пример отчёта, а не запуск в вашем аккаунте.
Скрипт Google Ads
/**
* Goodlabs Google Ads script: n-gram search term analysis
* Schedule: Weekly on Mondays
*/
var CONFIG = {
MIN_IMPRESSIONS: 50,
MIN_COST: 20,
SPREADSHEET_URL: "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit",
DATE_RANGE: "LAST_30_DAYS"
};
function main() {
Logger.log("Extracting search terms for N-Gram analysis...");
var report = AdsApp.report(
"SELECT search_term_view.search_term, metrics.impressions, metrics.clicks, " +
"metrics.cost_micros, metrics.conversions, metrics.conversions_value " +
"FROM search_term_view " +
"WHERE metrics.impressions > " + CONFIG.MIN_IMPRESSIONS + " " +
"AND segments.date DURING " + CONFIG.DATE_RANGE
);
var ngrams = {}; // token -> { imps, clicks, cost, convs, value }
var rows = report.rows();
while (rows.hasNext()) {
var row = rows.next();
var query = String(row["search_term_view.search_term"]).toLowerCase().trim();
var imps = Number(row["metrics.impressions"] || 0);
var clicks = Number(row["metrics.clicks"] || 0);
var cost = Number(row["metrics.cost_micros"] || 0) / 1e6;
var convs = Number(row["metrics.conversions"] || 0);
var val = Number(row["metrics.conversions_value"] || 0);
var words = query.split(/\s+/);
for (var n = 1; n <= 3; n++) {
for (var i = 0; i <= words.length - n; i++) {
var gram = words.slice(i, i + n).join(" ");
if (!ngrams[gram]) {
ngrams[gram] = { gram: gram, words: n, imps: 0, clicks: 0, cost: 0, convs: 0, val: 0 };
}
ngrams[gram].imps += imps;
ngrams[gram].clicks += clicks;
ngrams[gram].cost += cost;
ngrams[gram].convs += convs;
ngrams[gram].val += val;
}
}
}
exportToSheet(ngrams);
}
function exportToSheet(ngrams) {
var ss = SpreadsheetApp.openByUrl(CONFIG.SPREADSHEET_URL);
var sheet = ss.getSheetByName("NGram_Analysis") || ss.insertSheet("NGram_Analysis");
sheet.clear();
sheet.appendRow(["N-Gram Token", "Words", "Impressions", "Clicks", "Cost", "Conversions", "CPA", "Conv. Rate", "ROAS", "Status"]);
var output = [];
for (var k in ngrams) {
var item = ngrams[k];
if (item.cost < CONFIG.MIN_COST) continue;
var cpa = item.convs > 0 ? (item.cost / item.convs).toFixed(2) : "N/A";
var cr = item.clicks > 0 ? ((item.convs / item.clicks) * 100).toFixed(2) + "%" : "0%";
var roas = item.cost > 0 ? (item.val / item.cost).toFixed(2) : "0.00";
var status = (item.convs === 0 && item.cost >= CONFIG.MIN_COST) ? "🚨 NEGATIVE CANDIDATE" : "OK";
output.push([
item.gram, item.words, item.imps, item.clicks,
item.cost.toFixed(2), item.convs, cpa, cr, roas, status
]);
}
output.sort(function(a, b) { return parseFloat(b[4]) - parseFloat(a[4]); });
if (output.length > 0) {
sheet.getRange(2, 1, output.length, 10).setValues(output);
}
sheet.getRange(1, 1, 1, 10).setFontWeight("bold").setBackground("#f3f4f6");
Logger.log("Exported " + output.length + " n-gram patterns to Google Sheets.");
}Как это работает
- Берёт показы, клики, расход, конверсии и ценность за последние 30 дней из
search_term_view, где одна строка соответствует паре «запрос и группа объявлений», и оставляет строки, у которых большеMIN_IMPRESSIONSпоказов (по умолчанию 50). - Разбивает каждый запрос на отдельные слова, пары и тройки слов.
- Суммирует расход и конверсии каждой N-граммы по всем запросам, где она встречается.
- Помечает N-граммы без конверсий и с расходом выше порога как кандидатов в минус-слова.
- Пишет таблицу с CPA, конверсией и ROAS на вкладку NGram_Analysis вашей Google Таблицы.
Установка
- В Google Ads откройте Инструменты > Массовые действия > Скрипты.
- Вставьте код в новый скрипт.
- Укажите URL Google Таблицы в SPREADSHEET_URL.
- Авторизуйте скрипт и запустите предварительный просмотр.
- Поставьте еженедельный запуск в понедельник утром.
Вопросы
Чем это лучше обычного отчёта по поисковым запросам?
Отчёт оценивает запросы целиком. Слово «бесплатно» может тратить деньги в десятках запросов, каждый из которых слишком мал, чтобы что-то с ним делать. Если сложить их в одну N-грамму, расход становится виден. Если длинный хвост у вас ниже 50 показов, уменьшите MIN_IMPRESSIONS.