Google has released an update that removes the broad match modifier.
Now its functionality will replace the phrase match — https://support.google.com/google-ads/answer/10286719
It is clear that Google has made some kind of “reverse support” for this situation, but it’s better to get away from the old format sooner rather than later. Start accumulating statistics in phrase matching, avoid duplication, etc. and so on.
I wrote a simple script for this:
function main() {
// select non-deleted campaigns
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();
// select non-remote groups in them
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());
// select non-deleted phrases in them, in broad match, with a modifier
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, '');
// create a new key in phrase match
var newKeyResult = adGroup.newKeywordBuilder()
.withText('"' + key_text + '"')
.build();
// and delete the old key
if (newKeyResult.isSuccessful()) {
keyword.remove();
}
}
}
}
}