Copy Extensions to Campaigns Script

This script is simply a much faster way of managing your account, that also makes sure you don’t accidentally use different URLs for the same ad copy. That happens more than people imagine, and boy can that mess with your performance. So, get your Google Ads extensions in good order with this script.

What’s included?

How does the script work?

The script provides coverage with all your extensions, and ensures you’re always using the same extensions – you won’t accidentally get one campaign using a sitelink with the same text but a different URL. You’ll know that updating an extension updates it in all campaigns because it’s definitely the same extension attached to all campaigns.

It won’t remove anything – so you can add extra specific extensions to some campaigns and they won’t be removed if you do another run later.

How do I use it?

If you want to give it a go, copy the code below into a new Google Ads Script in your account. Then change some of the options:

  1. Filter the campaigns things will be applied to with the two arrays, campaignNameContains and campaignNameDoesNotContain. For example, if campaignNameContains is [“Brand”, “Generic”] then only campaigns with names containing “brand” or “generic” are included. If campaignNameDoesNotContain is [“Display”, “Competitor”] then any campaigns with names containing “display” or “competitor” are ignored.
    • This is not case-sensitive.
    • Leave blank, [], to not exclude any campaigns.
    • If you need to put a double quote into campaignNameContains or campaignNameDoesNotContain, put a backslash before it.
  2. If ignorePausedCampaigns is true, then the script will only look at currently active campaigns. Set this to false if you want to apply extensions and lists to currently paused campaigns.
  3. campaignToCopy is the name of the template campaign, whose lists and extensions will be copied. This is case-sensitive.
    • The template campaign can be paused, but it can’t be removed.
  4. extensionsAndLists is an array of which types of extension and list the Script will copy. The possible values are “sitelinks”, “callouts”, “reviews”, “mobileApps” (app extensions), “phoneNumbers” (call extensions), “excludedPlacementLists” and “negativeKeywordLists”.
  5. labelName is the name of the label which will be applied to campaigns once they’ve had the extensions/lists added. This means you can see which campaigns have been covered. Campaigns that already have the label will be ignored: if the Script doesn’t cover them all in one run it can go again until it covers them all.

You may want to run the script more than once for different extensions and lists. For example, if your account is split by match type, you may want to run once for extensions (as you probably want the same extensions on Exact and Broad campaigns), but then a second run for negative keyword lists that ignores Exact campaigns (by adding to campaignNameDoesNotContain “-Exact” or “|EM” or whatever it is you use to denote a campaign is Exact).

Make sure you change the labelName, otherwise the second run won’t add lists to the campaigns you just added extensions to. And think about saving both versions of the settings in a text file so you can repeat this later after you’ve added more campaigns!


  • This only works on Search, Display and Search with Display Select campaigns.
  • The script can’t tell the difference between Search, Display and Search with Display Select campaigns. You have to use the campaign names to make sure negative lists intended for Search don’t end up in Display campaigns.
  • The Script doesn’t do anything with ad group extensions or account extensions – only campaign level ones.
  • Scripts can only run for 30 minutes, which may not be enough if you’ve got lots of campaigns or lots of extensions. But if the script times out, you can just run it again – it will say in the logs when everything has been covered.

The Copy Extensions to Campaigns Script code