スクリプトの使い方

今回のスクリプトは、削除対象を広告とキーワードの2つに絞っています。また、間違って実行してしまうと、意図しないキーワードや広告を削除してしまうことになってしまうため、実行には細心の注意を払う必要が有ります。そのため、下記のスクリプトはそのまま実行しても、削除されないようにしています。この状態で実行すると、削除予定のキーワードと広告のタイトルが、「ログ」の箇所に書き出されます。ここに書き出されたキーワードや広告に問題がなければ、

var execute = false;

のところを

var execute = true;

に書き換えていただき実行してください。すると、全期間に渡ってインプレッションが発生していないキーワードと広告の削除が完了します。あとはAdWords側の完全削除の対応を待つだけとなりますが、削除後100日が経過しないと削除しない、とのことなので100日間の間、待っていればアカウントの簡素化が行えるようになります。

また、今回のスクリプトは、通常アカウント用の他に、MCCアカウントで使えるスクリプトも準備しています。MCCアカウント版のスクリプトを使えば、アカウントを横断して一括削除することができるので、作業が捗ります(ただし、途中でタイムアウトする可能性があるので、その場合は再度実行してください)。

スクリプト本体(通常版)

function main() {
  var execute = false;
  var deleted;
  deleted = deleteZeroImpressionAds(execute);
  Logger.log('インプレッションが全期間に渡って発生していない' + deleted.length + '件の広告を削除しました');
  deleted = deleteZeroImpressionKeyword(execute);
  Logger.log('インプレッションが全期間に渡って発生していない' + deleted.length + '件のキーワードを削除しました');
}

function deleteZeroImpressionKeyword (execute) {
  var keywords = AdWordsApp.keywords().forDateRange('ALL_TIME').withCondition('Impressions = 0').get();
  var deleted = [];
  while (keywords.hasNext()) {
    var keyword = keywords.next();
    deleted.push(keyword.getText());
    if (execute) {
      keyword.remove();
    } else {
      Logger.log('キーワード: ' + keyword.getText() + 'を削除します');
    }
  }
  return deleted;
}

function deleteZeroImpressionAds (execute) {
  var ads = AdWordsApp.ads().forDateRange('ALL_TIME').withCondition('Impressions = 0').get();
  var deleted = [];
  while (ads.hasNext()) {
    var ad = ads.next();
    deleted.push(ad.getHeadline());
    if (execute) {
      ad.remove();
    } else {
      Logger.log('広告文: ' + ad.getHeadline() + 'を削除します');
    }
  }
  return deleted;
}

スクリプト本体(MCCアカウント版)

function main() {
  var execute = false;
  var deleted;
  procAllAccounts(function(account) {
    Logger.log('■ ' + account.getName());
    deleted = deleteZeroImpressionAds(execute);
    Logger.log('インプレッションが全期間に渡って発生していない' + deleted.length + '件の広告を削除しました');
    deleted = deleteZeroImpressionKeyword(execute);
    Logger.log('インプレッションが全期間に渡って発生していない' + deleted.length + '件のキーワードを削除しました');
  });
}

function deleteZeroImpressionKeyword (execute) {
  var keywords = AdWordsApp.keywords().forDateRange('ALL_TIME').withCondition('Impressions = 0').get();
  var deleted = [];
  while (keywords.hasNext()) {
    var keyword = keywords.next();
    deleted.push(keyword.getText());
    if (execute) {
      keyword.remove();
    } else {
      Logger.log('キーワード: ' + keyword.getText() + 'を削除します');
    }
  }
  return deleted;
}

function deleteZeroImpressionAds (execute) {
  var ads = AdWordsApp.ads().forDateRange('ALL_TIME').withCondition('Impressions = 0').get();
  var deleted = [];
  while (ads.hasNext()) {
    var ad = ads.next();
    deleted.push(ad.getHeadline());
    if (execute) {
      ad.remove();
    } else {
      Logger.log('広告文: ' + ad.getHeadline() + 'を削除します');
    }
  }
  return deleted;
}

function procAllAccounts(callback) {
  var accountIterator = MccApp.accounts().get();
  var accounts = [];
  while (accountIterator.hasNext()) {
    var account = accountIterator.next();
    MccApp.select(account);
    callback(account);
  }
}

まとめ

今から削除しても、完全削除のタイミングは春には間に合いませんが、最近AdWordsの動きが遅い、と感じている方や、今後AdWordsのAndroidアプリを利用しようと考えている方、インプレッションが発生していない無駄なキーワードが管理画面上で邪魔だと感じている方などいらっしゃいましたら、この機会に是非、アカウントの大掃除を実施してみてはいかがでしょうか?
(ただし、本当に一気に削除してしまうので、ご利用は各自の責任で)