Save time by creating Ads, Keywords or entire Ad Groups straight from a Google Spreadsheet.

The flexibility of spreadsheets coupled with the power and speed of the AdWords Editor. Sounds good? Let’s go.


We’ve found it most useful when splitting out campaigns into separate AdGroups (SKAGs, anyone?), but it’s just as handy for creating campaigns from scratch.


Quick links:

This script works with a single Campaign at a time, for mass-campaign creation we recommend setting up a template campaign. Once setup simply copy it each time a new Campaign needs creating, it will take seconds and you can be sure all of the settings will be correct.

how to copy an adwords campaign

Make a copy of this Spreadsheet (File > Make a copy…) and enter your details:

  • The campaign name (cell B2)
  • Any settings, including what you would like to be created (Cells B3-B6 and C5)
  • The bids to set for the keywords (Cells D2 – D4). To skip creating keywords for a particular match type, simply set to zero or leave blank

Here are the settings and information we’ll be using in this example. The spreadsheet template contains comments on all key cells.

If you haven’t already, copy the script from GitHub

Create a new AdWords Script (Bulk Operations > AdWords Scripts) and paste in the Script. There are only two things you’ll need to change:

  • Spreadsheet URL – your copied spreadsheet
  • Sheet Name – whatever you called your new sheet, e.g. “Sheet1”

Once the script has been authorized, preview it and on the “Changes” tab you’ll be able to see which changes will be made when the script runs.
adwords scripts preview

Once you’re happy, hit “run” and you’ll quickly be able to see all of your AdGroups, along with ads and keywords, within AdWords.

The AdGroups after running the script


A few notes on workflow.

As with Bulk Uploads and the AdWords Editor, this tool is best used when creating in bulk. Although it’s worth noting, by using sheet-based methods like this (including bulk uploads) it can minimise the chance of error thanks to the birds-eye view of everything which will be added.


When creating campaigns, we recommend setting up an empty Template campaign with your perfect settings then copying and pasting it to create a new campaign whenever required. If you’ll be creating multiple campaigns (say, more than five) try the AdWords Editor as it’s likely a better option.


You’ll notice it’s only possible to create a single Ad per row, to create multiple Ads just create a new row with the same Ad Group name.

Don’t worry if the keywords are the same, it won’t them add twice.

Using the sheet to create multiple ads during Ad Group creation

Another option is to first create the Ad Groups, then change the ad text accordingly and run the Script again.

Spreadsheets allow rapid Ad writing thanks to a familiar interface, functions and quick duplication. Be warned, when writing ads in a spreadsheet it’s easy to swap time for creativity and thorough testing.

Negative Keywords

We’ve updated the script and template to include a negative keyword column, this was designed specifically for sculpting Ad Groups during creation – it’s much easier and quicker this way Vs using AdWords itself.

An example of sculpting via the google sheet

Found this Script useful?

Let us know!

Equally, any ideas on how we can improve scripts are always welcome – just leave a comment below.

Custom Scripts – Hire Us

We’ve had dozens of agencies hire us on the back of this script alone, agencies that saw the potential to further automate their way with bespoke solutions.

If you’d like to do the same, you can contact us here.

Update – Version 1.5.0

I’ve added lots of lovely error handling and generally tidied things up.

Now instead of just failing it should tell you why in the logs.

If you’re having issues please try this version – comment below if you have any trouble.

Note this update requires the newest version of the spreadsheet too. The link is the same.



Marc · May 21, 2017 at 1:10 pm

Amazing work and thanks a lot for open sourcing the script! Is there a way to automatically add the exact match keyword as negative keyword to phrase and broad as well as phrase match version as negative to broad? You know “forcing google to show exact match whenever possible”

automatingadwords · May 21, 2017 at 10:18 pm

Hi Marc,
If I’m understanding you, the script would need to create a new AdGroup per match type. This has more been setup to create AdGroups containing multiple match types.

Now, it is possible to create something that creates an AdGroup per match type automatically if you think that would be helpful?

It would:
– Still take one keyword, but create adGroups per keyword
– Name the AdGroups as AdGroup Name + (phrase), (exact) or (bbm)
– Add, as you’ve suggested, the exact match keyword as a negative to the phrase and bbm ad groups

Missed anything?


    Derek · March 6, 2018 at 5:52 pm

    Hey there! I was wondering if the script /spread sheet mentioned above was ever created with the additional steps? I would also have the need to create separate ad groups per match type and use exact match keywords as a negative to the phrase?

      Automating AdWords · March 6, 2018 at 7:19 pm

      I’m afraid not. It’s something will endeavour to add but I must admit it won’t be any time soon.
      If you’re interested in paying for the change you can get in touch with us here:
      Alternatively, I’d suggest setting up the script 3 times, 1 for each match type. You could keep the settings on the same spreadsheet, using 3 separate tabs (right click > duplicate to keep the validation). It will work as long as the URL (line 10) and Sheet Name (line 12) are correct.
      Then it’s just a case of setting match types you don’t want to blank, so phrase and bmm will be blank on the exact tab.
      I hope that helps?

        Derek · March 7, 2018 at 12:53 am

        That’s incredibly helpful! Thank you!

Marc · May 26, 2017 at 4:29 pm

Hey, yeah that is exactly it

Robert · October 13, 2017 at 7:13 am

I tried to run the script with certain keywords. The ad groups and ads are created, but unfortunately not the keywords. The details of the executed script contain an error for the keywords. It says “The keyword text is invalid”. And the log displays the following:
Creating keywords…

It would be great if you could come up with a solution to the problem. Many thanks in advance!

Prateek Modi · November 5, 2017 at 7:24 am

Hello Charles,

Thanks for sharing this script! Its extremely helpful in creating bulk SKAGs and exactly what I was looking for! One question – if I create one google sheet, and keep updating it by adding new adgroups and keywords, without deleting old ones, would it create multiple ads/adgroups/keywords, each time I ran the script?

    Automating AdWords · November 6, 2017 at 8:56 pm

    I’m glad you’ve found it helpful!
    The “old” AdGroups wouldn’t be re-created, neither would the keywords or ads.
    Just the “new” AdGroups would be created.

    That’s the TLDR, a bit more info if you’re interested:
    The script will attempt to create the AdGroups again but default AW functionality doesn’t allow it. You’ll see an error in the changes after it’s ran. Below is an example showing the error you’ll see. It’s an “error” but it’s not a harmful one.
    Ads and Keywords, on the other hand, are actually checked by the script – if they exist within the AdGroup, the script won’t attempt to create them again.
    Hope that helps,

      Prateek Modi · November 8, 2017 at 9:14 am

      Thanks a lot Charles. That helps clarify a lot.

Prateek Modi · November 16, 2017 at 11:12 am

Hi charles,

Sorry to disturb you again – but since morning I’ve been getting a script runtime error. It was working fine till yesterday. Could you guide me as to how I could fix this issue?

    Automating AdWords · November 16, 2017 at 12:13 pm

    Hi Prateek,
    Not a problem, do you mind sending the error to charlesbannister(at) and I’ll take a look? It would also be helpful if you could share a copy of your Settings sheet (or provide access to your live sheet, whichever you prefer).
    I’m sure we can sort it.

Jeremie · November 20, 2017 at 2:24 pm


Why did you create pauseExistingKeywords()? What is the purpose of that function?

    Automating AdWords · November 20, 2017 at 3:56 pm

    Very often this script will be used to move keywords into more targetted (often SKAG) Ad Groups – the pause option speeds that up by pausing other instances whilst the keyword is being added.

    Of course, it can be turned off on the settings sheet – see cell B6

    Hope that helps,


David · November 21, 2017 at 1:12 am

Hello Team,

Is it possible to adapt the script to run several campaigns?


    Jeremie · November 21, 2017 at 1:12 am


    Automating AdWords · November 21, 2017 at 7:08 am

    Hi David,

    You could certainly hire us to make such a change!

    I’ll send you an email.


Thao · February 4, 2018 at 1:39 pm

Does this script create a new campaign, or only add new adgroup into an existing campaign? I’ve been searching high & low for a script that can create new campaign and so far haven’t been lucky. Your script is exactly what I need if it can create new campaign from scratch :/ can you please help? Thank you!

    Automating AdWords · February 4, 2018 at 6:09 pm

    Hi Thao,
    Unfortunately not, no. The campaign needs to exist.
    However, if you’d like a custom version creating you can always hire us! Adding in campaign creation is certainly something we could do. You can get in touch here.

Frank · March 14, 2018 at 7:01 am

I keep getting an error that says the autolabel cannot be found.

Kyle · April 4, 2018 at 2:42 pm

Hi, I’m getting an error that says TypeError: Cannot call method “getRange” of null. (line 30) –>line 30: var campaignName = sheet.getRange(2, 2).getValue();

Lorrie · July 28, 2018 at 2:59 pm

When I run the script, I can see the labels shown in the answer to Kyle’s question on April 8, 2018, but it does not upload the data from each column. Is that a separate step? Thank you for sharing this.

    Automating AdWords · August 13, 2018 at 7:31 am

    Hi Lorrie,
    Sorry for the delay, are you still having this issue?
    There isn’t a separate step, no. The AdGroups and/or Keywords and Ads should be created.
    Other than ensuring the settings are right on the sheet, I can’t think what the issue could be. Are there any errors within the logs?
    It might be best you share your settings sheet with us then we can check.
    I’ll send you an email now.

Alisha Chaurasia · August 28, 2018 at 7:56 am

TypeError: Cannot call method “getRange” of null. (line 30)

Error is coming.. unable to run the script

Toni · September 19, 2018 at 1:13 pm

Hi guys,

Good job with the script – thanks.

I’m working to have a feed pulled into a G sheet via dataimport -> having the script update an existing campaign structure based on the imported feed. A couple of questions:

– How large campaign structures have you tested the script with without it timing out?
– There’s no way to have the new ad groups created with more than just 1 ad?
– Tested adding description3 and the script runs without errors but the ad comes out with only d1 and d2… so d3 doesn’t seem to be supported yet, or? 😕

    Automating AdWords · September 19, 2018 at 6:49 pm

    Hi Toni,
    That sounds interesting! I should warn you the G Sheet’s import is temperamental, a script which adds the info on a schedule would be more reliable.
    To answer your questions:
    1) As the script only works with one campaign at a time, it would have to add over 100 Ad groups before timing out. That’s an estimate, it isn’t something we’ve tested. It also depends on what’s being added, of course.
    2) Yes, you can create multiple ads per Ad group by copying the row and changing the ad. The Ad group and keyword will only be added/created once, but multiple ads will be created.
    3) Ah yes, the script will need updating too. We generally only upgrade the free scripts if someone hires us to do so. If you’re interested please get in touch here:

      Toni · September 20, 2018 at 7:02 am

      Hi Charles, thanks for the quick reply.

      Temperamental in what way? At least it seems that adding a scheduled trigger via Script editor works just fine.

      Regarding #2, I actually tried doing that but the ad group ended up with only the ad on the top row. Just now tested it again with the same result. Hmm.

        Automating AdWords · September 20, 2018 at 6:26 pm

        I’ve just tried this with the latest version and it seems to work.
        I’ll send you an email – I may be able to help if I can see your sheet.

          Automating AdWords · September 26, 2018 at 9:05 pm


          I’ve sent you an email, but just wanted to catch everyone else up.

          If anyone is having issues please see the Update notes above. In a nutshell please try the latest version and spreadsheet.

Harshad · January 7, 2020 at 6:46 am

Hi Charles,

First of all, thanks for sharing the most useful script. It will save lots of time for large campaigns and accounts.

Anyways, as you know google ads were updated Expanded Text Ad and currently, they are support 3 Headlines, 2 Paths, and 2 Description Lines.

So, it would be great if you update this script as per latest Expanded Text Ad update for all of this script lover.

Harshad Patel

Eric · July 18, 2020 at 9:48 pm

This is amazing! Is there any option to add Headline3 and Description2?

Leave a Reply

Your email address will not be published. Required fields are marked *