AdWords Scripts-Experiment: arbeiten außerhalb der AdWords-Oberfläche

Jeder erfahrene SEA-Manager kennt Sie: AdWords Scripts. Mit den kleinen JavaScript-Tools lassen sich geschickt kleinere Aufgaben in AdWords automatisieren. Das erleichtert nicht nur die tägliche Arbeit, sondern spart auch wertvolle Zeit. Als ich mich mit den Funktionen von AdWords Scripts näher befasste, stellte ich mir irgendwann die Frage: kann man mit AdWords Scripts auch außerhalb der Benutzeroberfläche arbeiten? Ist es gar möglich mittels Google API und AdWords Scripts Daten über Google Drive zu einem Account hinzuzufügen, ohne die AdWords-Oberfläche zu öffnen? Ich werde es herausfinden.

Für das Experiment möchte ich “ausschließende Keywords” automatisch zu einer Kampagne hinzuzufügen, indem ich die Keywords sammle, in ein kleines Tool kopiere, einen Knopf drücke und ein AdWords Script den Rest machen lasse – ganz ohne AdWords-Oberfläche.

Warum teste ich gerade mit ausschließenden Keywords? SEA-Manager prüfen regelmäßig Suchanfragenberichte, um nach Keywords Ausschau zu halten, die sie ausschließen sollten. Diese Keywordlisten pflegt man normalerweise in einer Excel-Datei und lädt sie regelmäßig bei AdWords hoch. Alternativ exportiert man sich die Listen aus dem AdWords-Editor in eine CSV-Datei. Einfacher wäre es doch aber, wenn man ein Google Doc mit seinen Kollegen teilt, ausschließende Keywords hinzufügt und sich diese Keywords automatisch mit dem AdWords-Konto synchronisieren. Mit dem folgenden AdWords-Skript ist genau das möglich.

Ideengeber für das Experiment sind zwei spezielle Funktionen der AdWords Scripts:

  1. Die planbare Ausführung eines Skripts (Scheduling).
  2. Der Zugriff auf Google Drive.

Folgendes soll im Hintergrund passieren:

  • Das Tool wird die ausschließenden Keywords als Datei zu Google Drive hinzufügen.
  • Das AdWords Script wird die Datei regelmäßig auslesen.
  • Das AdWords Script wird die Keywords zu einer oder mehreren Kampagne/n hinzufügen.

Ein entsprechendes Tool könnte wie folgt aussehen:

add_negative_keywords

Zuallererst kümmern wir uns um den Code für den Upload der Keywords als Datei in Google Drive. Hierfür nutzen wir das Google Api Client gem. Wir gehen zudem davon aus, dass der Drive-API-Zugang in der Google Developers Console eingerichtet ist.

#models/concerns/google_api.rb
require 'google/api_client'

module GoogleApi

  def initialize_client
    client = Google::APIClient.new
    client.authorization.client_id = static_config[:client_id]
    client.authorization.client_secret = static_config[:client_secret]
    client.authorization.scope = static_config[:scope]
    client.authorization.redirect_uri = "http://localhost:3000/oauth_callback"
    client
  end

  def get_authorization_url
    client.authorization.authorization_uri
  end

  def authorize_client(auth_code)
    client.authorization.code = auth_code
    client.authorization.fetch_access_token!
  end

  def static_config
    Rails.application.config.google_api_config.deep_dup
  end

end

#models/google_drive.rb

class GoogleDrive

  include GoogleApi

  def initialize
    @client ||= initialize_client
  end

  def upload_file
    file = drive.files.insert
                      .request_schema
                      .new({
                       'title' => 'Negative_Keywords',
                       'description' => 'negative keywords for google adwords script',
                       'mimeType' => 'text/plain'
                       })
    media = Google::APIClient::UploadIO.new(TempStorage::PATH.to_s, 'text/plain')
    result = client.execute(
                            :api_method => drive.files.insert,
                            :body_object => file,
                            :media => media,
                            :parameters => {
                              'uploadType' => 'multipart',
                              'alt' => 'json'
                            })
    result.data
  end

  private

  attr_reader :client

  def drive
    client.discovered_api('drive', 'v2')
  end

end


#models/temp_storage.rb
#We use a temp file for now. In actual production code, the keywords
#can probably go in a database
class TempStorage

  PATH = Rails.root.join('tmp', "negative_keywords.txt")

  def self.store_keywords(content)
    File.open(PATH, "w") do |file|
      content.each{|line| file.puts(line + "n")}
    end
  end

end

Wenn wir uns bei der Google API anmelden, wird uns eine Client ID und ein Client Secret zugewiesen. Der oben dargestellte Code geht davon aus, dass diese beiden Informationen in der Rails.config gesetzt sind.

Der Upload zu Google Drive erfordert zudem OAuth tokens. Wir müssen den Nutzer also autorisieren, bevor der Upload ausgeführt werden kann. Die ausschließenden Keywords des Nutzers werden dann in einer Zwischendatei abgelegt und danach zu Google Drive hochgeladen. Auf der Controller-Ebene kann das so aussehen:

class NegativeKeywordsController < ApplicationController

  def new
  end

  def create
    negative_keywords = params['negative_keywords'].split("n")
    TempStorage.store_keywords negative_keywords
    uri = GoogleDrive.new.get_authorization_url

    redirect_to uri.to_s
  end

  #for now this can be our OAuth callback action
  def upload
    google_drive = GoogleDrive.new
    google_drive.authorize_client params['code']
    google_drive.upload_file
    redirect_to action: 'new'
  end

end

Bevor es weiter geht, ist es wichtig, dass der Nutzer auch Zugriff auf das AdWords-Konto hat und AdWords-Skripte ausführen kann. Sind diese Voraussetzungen erfüllt, können wir ein kleines Skript schreiben, das die Datei in Google Drive ausliest und ausschließende Keywords zu einer oder mehreren Kampagne/n hinzufügt.

function addNegativeKeywordsToAllCampaigns(keywords_csv) {
  //Get all accounts for our MCC
  var accounts = MccApp.accounts().get();

  //Iterate over the accounts
  while (accounts.hasNext()) {
    // Select the client account.
    var account = accounts.next();
    MccApp.select(account);
    
    // Select all campaigns under the client account
    var campaignIterator = AdWordsApp.campaigns().get();
    if (campaignIterator.hasNext()) {
      var campaign = campaignIterator.next();
      addNegativeKeywordsToCampaign(campaign, keywords_csv);
    }
  }
}

function addNegativeKeywordsToCampaign(campaign, keywords_csv) {
  var kws = Utilities.parseCsv(keywords_csv);
  for (var i = 0; i < kws.length; i++) {
    var row = kws[i];
    Logger.log('Adding Keyword: ' + row[0] + ' to Campaign Name: ' + campaign.getName());
    campaign.createNegativeKeyword(row[0]);
  }
}

function getFileContentsFromDrive() {
  var filesIterator = DriveApp.getFilesByName('Negative_Keywords');
  var file = filesIterator.next();
  var data = file.getBlob().getDataAsString()
  Logger.log(data);
  return data;
}

function main() {
  var kws = getFileContentsFromDrive();
  addNegativeKeywordsToAllCampaigns(kws);
}

Wie bei allen AdWords Scripts ist der Einstiegspunkt die function main(). Das Skript holt sich zuerst die Inhalte der Datei auf Google Drive und übergibt die Keywords dann an AdWords, wo sie zu den Kampagnen hinzugefügt werden. Wenn der Account ein MCC ist, muss man eine Iteration einbauen, die alle Konten bedient.

Zuletzt fügen wir das Script über die AdWords-Oberfläche hinzu und planen die Ausführung:

adding_adwords_scripts

Das war’s! Das Skript läuft nun stündlich durch und prüft die Datei in Google Drive. Wenn dort neue ausschließende Keywords über das Tool hinzugefügt wurden, werden diese zu der oder den Kampagne/n hinzugefügt, ohne dass wir die AdWords-Oberfläche öffnen müssen:

adwords_negative_keywords

Die Idee war zu testen, ob man mit AdWords Scripts außerhalb der AdWords-Oberfläche arbeiten kann. Die Antwort lautet: ja. Das Experiment* führt vor Augen, welche weitreichenden Möglichkeiten sich durch die Skripte, auch im Zusammenhang mit der Google API, hinsichtlich Automatisierung und Zeitersparnis bieten. Weitere Artikel zur Google und AdWords API sowie zu AdWords Scripts werden in den nächsten Monaten folgen.

Ganz nebenbei, professionelle Kampagnen-Management-Technologien, wie etwa unserer semantischen SEA-Software camato, arbeiten gezielt mit der AdWords API, um Daten direkt in die AdWords-Konten zu überführen. Wer ein sehr umfangreiches Konto mit mehreren hunderttausend Keywords hat und dieses regelmäßig ausbauen möchte, sollte sich daher professioneller Software bedienen.

*Achtung: der hier verwendete Code ist nur experimentell und nicht für die Nachahmung ausgelegt. 

ABOUT THE AUTHOR