スクリプトの使い方

使い方はとても簡単で、Google AdWordsの管理画面で「一括処理>スクリプト」を選択し、新しいスクリプトを追加します。追加するスクリプトに下記のプログラムコードを貼付けます。タイトルに分かりやすい名前をつけて、「プレビュー」を押して問題なく動作するか確認しましょう。正しく動作していることが確認できたら、画面下の「スクリプトを今すぐ実行」をクリックすればOKです。

また、スクリプト中では、絞り込み部分一致に変更するキーワードはAdWordsのラベル機能を使って指定しています。指定のラベルを予め作成し、絞り込み部分一致に変換したいキーワードに、ラベルを付与してください。

スクリプトの設定項目

スクリプトの冒頭部分に下記のような、設定項目をまとめています。

var config = {
  '対象キーワードのラベル': '絞り込み部分一致に変更',
  '既存のキーワードを一時停止する': true,
  '1文字目にスペースを追加する': true
};

ここの部分で、スクリプトの動作を設定します。下記を参考に、自分のアカウント構成に合わせて設定を書き換えてください。各設定項目の意味を下記に記載します。

対象キーワードのラベル

絞り込み部分一致に変更したいキーワードに付与するラベルをここで設定することができます。デフォルトは「絞り込み部分一致に変更」というラベル名ですが、必要に応じて変更することが可能です。

既存のキーワードを一時停止する

絞り込み部分一致のキーワードを新規に作成したあと、元々のキーワードを一時停止する場合はtrueのままにしてください。もし、一時停止せずに、有効のままにするのであれば、「false」に変更してください。

1文字目にスペースを追加する

キーワード一覧をCSVなどでダウンロードしたあと、Excelで開いたときに、先頭が+だと、Excelが余計な解釈をしてしまいます。それを回避するために、1文字目にスペースを追加するハックを実行します。falseに設定すると、1文字目にスペースを追加する処理を行いません。

スクリプトファイル

var config = {
  '対象キーワードのラベル': '絞り込み部分一致に変更',
  '既存のキーワードを一時停止する': true,
  '1文字目にスペースを追加する': true
};

function main () {
  procAccount(function (account) {
    executeKeywordWithLabel(account, config['対象キーワードのラベル'], function (keyword) {
      // 作成するキーワードの基礎情報
      var broadMatchModifierText = getBroadMatchModifier(keyword.getText());
      var destinationUrl = keyword.getDestinationUrl();
      var maxCpc = keyword.getMaxCpc()
      // 新規のキーワードの登録
      keyword.getAdGroup().createKeyword(broadMatchModifierText, maxCpc, destinationUrl);

      // 既存のキーワードからラベルを除去する
      keyword.removeLabel(config['対象キーワードのラベル']);

      if (config['既存のキーワードを一時停止する']) {
        keyword.pause();
      }
      Logger.log("[" + account.getName() + "] キーワード" + keyword.getText() + "のマッチタイプを絞り込み部分一致に変更しました。");
    });
  });
  Logger.log("処理が全て完了しました。");
}

/**
 * 元のキーワードを絞り込み部分一致に変更するための関数.
 * 元のキーワード(の一部)に絞り込み部分一致の指定が行われている場合は
 * その語句には絞り込み部分一致の指定は追加的に指定しない.
 */
function getBroadMatchModifier(text) {
  var str = text.split(" ");
  for (var i = 0; i < str.length; i++) {
    if (str[i][0] != "+") {
      str[i] = "+" + str[i];
    }
  }
  if (config['1文字目にスペースを追加する']) {
    return ' ' + str.join(" ");
  } else {
    return str.join(" ");
  }
}

function executeKeywordWithLabel(account, labelName, callback) {
  var labels = AdWordsApp.labels().withCondition('Name = "' + labelName + '"').get();
  if (labels.hasNext()) {
    var keywords = labels.next().keywords().get();
    if (keywords.totalNumEntities() == 0) {
      Logger.log("[" + account.getName() + "] ラベル" + labelName + "が付与されたキーワードが存在しません。マッチタイプを絞り込み部分一致に変更するキーワードにラベル" + labelName + "を付与してください。");
    } else {
      Logger.log("[" + account.getName() + "] " + keywords.totalNumEntities() + "件のキーワードを処理します。");
      while (keywords.hasNext()) {
        var keyword = keywords.next();
        callback(keyword);
      }
    }
  } else {
    Logger.log("[" + account.getName() + "] ラベル" + labelName + 'が存在しません。ラベル' + labelName + 'を作成してください。');
  }
}

function procAccount(callback) {
  if (isMccAccount() == true) {
    var accountIterator = MccApp.accounts().get();
    var accounts = [];
    while (accountIterator.hasNext()) {
      var account = accountIterator.next();
      Logger.log("[" + account.getName() + "] 処理を開始します。");
      MccApp.select(account);
      callback(account);
      Logger.log("[" + account.getName() + "] 処理が完了しました。");
    }
  } else {
    callback(AdWordsApp.currentAccount());
  }
}

function isMccAccount() {
  try {
    var account = MccApp.accounts();
    return true;
  } catch (ex) {
    return false;
  }
}