Гугл выпустил обновления, из-за которого модификатор широкого соответствия больше не нужен. Теперь его функционал заменит фразовое соответствие — https://support.google.com/google-ads/answer/10286719?hl=ru
Понятное дело что гугл сделал какую-то «обратную поддержку» этой ситуации, но лучше все-таки уйти от старого формата раньше, чем позже. Начать копить статистику во фразовом соответствии, избежать дублирования и т.д. и т.п.
Я для этого написал простенький скрипт:
function main() {
// выбираем не-удаленные кампании
var campaignSelector = AdsApp
.campaigns()
.withCondition('Status != REMOVED')
.orderBy('Impressions DESC')
.forDateRange('LAST_30_DAYS');
var campaignIterator = campaignSelector.get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
// в них выбираем не-удаленные группы
var adGroupSelector = campaign
.adGroups()
.withCondition('Status != REMOVED')
.orderBy('Impressions DESC')
.forDateRange('LAST_30_DAYS');
var adGroupIterator = adGroupSelector.get();
while (adGroupIterator.hasNext()) {
var adGroup = adGroupIterator.next();
Logger.log(campaign.getName() + ' - ' + adGroup.getName());
// в них выбираем не-удаленные фразы, в широком соответствии, с модификатором
var keywordSelector = adGroup
.keywords()
.withCondition('KeywordMatchType = BROAD')
.withCondition('Text CONTAINS_IGNORE_CASE "+"')
.withCondition('Status != REMOVED')
.orderBy('Impressions DESC')
.forDateRange('LAST_30_DAYS');
var keywordIterator = keywordSelector.get();
while (keywordIterator.hasNext()) {
var keyword = keywordIterator.next();
var key_text = keyword.getText().replace(/\+/gmi, '');
// создаем новый ключ во фразовом соответствии
var newKeyResult = adGroup.newKeywordBuilder()
.withText('"' + key_text + '"')
.build();
// а старый ключ - удаляем
if (newKeyResult.isSuccessful()) {
keyword.remove();
}
}
}
}
}