今回はYahoo!広告スクリプトを用いて除外キーワードリストの入稿を自動化する方法を紹介します。
作成した背景
広告出稿をしていると除外キーワードの入稿が定期的に発生します。
例えば、社内・競合他社・クラアイントから特定の語句を除外するよう頼まれることがあるのではないでしょうか。
その際、Google広告・Yahoo!広告(場合によってはMicrosoft広告)の管理画面に都度ログインして入稿しなければなりません。
各管理画面にログインするのは短い時間かもしれませんが、塵も積もれば山となります。
そこで、スプレッドシートに除外したいキーワードを記載して、それをもとに各媒体で除外を行う仕組みを構築することで効率化を図れるのではないかと考えました。
今回はYahoo!広告をベースに自動化する方法を解説していきます。
今回は除外キーワードリストへの入稿を想定しています。(キャンペーン単位での入稿は想定していません。)
事前準備
- スプレッドシート内に4つのシートを作成
-
- 除外キーワードリスト
- NegativeKeywordList:アカウントに登録されている除外キーワードリスト
- NegativeKeyword:アカウントに登録されている除外キーワード
- add:これから入稿する除外キーワード
- 除外キーワードリストに項目名を記載
-
除外キーワード・マッチタイプ・キーワードリスト名・キーワードリストID・有無判定
マッチタイプ(B列)・キーワードリスト名(C列)は入力規則を設定しておくと便利です。
キーワードリストID(D列)にはキーワードリスト名を引っ張る関数を設定しています。
=iferror(xlookup(C2,NegativeKeywordList!A:A,NegativeKeywordList!B:B),"")
有無判定(E列)には入稿有無を判定する関数を設定しています。
=if(D2="","", COUNTIFS(NegativeKeyword!A:A,D2,NegativeKeyword!B:B,A2,NegativeKeyword!D:D,B2))
- addシートに関数を設定
-
A1セルには以下の関数を入れています。
query関数を用いることで現在入稿されていない除外キーワードを抽出することが可能です。=query('除外キーワードリスト'!A:E,"select A, B, D where E = 0")
サンプルコード
function main() {
// スプレッドシートを指定
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/スプレッドシートID/edit#gid=0');
// シート名を指定
var ss_nkwl = spreadsheet.getSheetByName('NegativeKeywordList');
// シートの内容削除
ss_nkwl.clear();
// キーワード一覧指定
var ss_nkw = spreadsheet.getSheetByName('NegativeKeyword');
// シートの内容削除
ss_nkw.clear();
// キーワード一覧指定
var ss_add = spreadsheet.getSheetByName('add');
// アカウントIDを指定
const accountId = AdsUtilities.getCurrentAccountId();
// 除外キーワードリストを最新に更新
getnkwls(accountId, ss_nkwl);
// 除外キーワードリストのキーワードを最新に更新
getnkws(accountId, ss_nkw);
// 除外キーワードリストにキーワードを追加
addnkws(accountId, ss_add);
// 除外キーワードリストを最新に更新
getnkwls(accountId, ss_nkwl);
// 除外キーワードリストのキーワードを最新に更新
getnkws(accountId, ss_nkw);
}
function getnkwls(accountId, ss_nkwl) {
// 空配列を作成
var array_nkwl = [];
// 項目名追加
array_nkwl.push(['リスト名', 'リストID']);
// 除外キーワードリストを取得
const nkwls = Search.AccountSharedService.get({
accountId: accountId,
}).rval;
// 除外キーワードリストが存在しない場合
if (nkwls.totalNumEntries == 0) {
Logger.log('Negative KW List does not exist.');
return;
}
// 取得した除外キーワードリストを配列に格納
for (let i = 0; i < nkwls.values.length; i++){
let nkwl = nkwls.values[i].accountShared;
var listName = nkwl.name;
var listId = nkwl.sharedListId;
Logger.log('name-> ' + listName + ', sharedListId->' + listId);
array_nkwl.push([listName, listId]);
}
Logger.log(array_nkwl);
ss_nkwl.getRange('A1').setValues(array_nkwl);
}
function getnkws(accountId, ss_nkw) {
// 空配列を作成
var array_nkw = [];
// 項目名追加
array_nkw.push(['リストID', '除外キーワード', '除外キーワードID', 'マッチタイプ']);
// 除外キーワードを取得
const nkws = Search.SharedCriterionService.get({
accountId: accountId,
}).rval;
if (nkws.totalNumEntries == 0) {
Logger.log('Negative KW does not exist.');
return;
}
for (let i = 0; i < nkws.values.length; i++){
let nkwlkw = nkws.values[i].sharedCriterion;
var listId = nkwlkw.sharedListId;
var nkw = nkwlkw.text;
var nkwId = nkwlkw.criterionId;
var nkwMatchType = nkwlkw.keywordMatchType;
array_nkw.push([listId, nkw, nkwId, nkwMatchType]);
}
Logger.log(array_nkw);
ss_nkw.getRange('A1').setValues(array_nkw);
}
function addnkws(accountId, ss_add){
// 最終行を取得
var lastRow = ss_add.getLastRow();
if (lastRow == 1) {
Logger.log('KW does not exist.');
return;
}
// 範囲を取得
var range = ss_add.getRange(2, 1, lastRow-1, 3).getValues();
Logger.log(range);
for (let i = 0; i < lastRow-1; i++) {
var text = range[i][0];
var listId = range[i][2];
var matchType = range[i][1];
const add = Search.SharedCriterionService.add({
accountId: accountId,
operand: [
{
keywordMatchType: matchType,
sharedListId: listId,
text: text,
use: 'NEGATIVE'
}
]
}).rval;
}
}
サンプルコードの説明
サンプルコードでは、以下6つの処理を行っています。
STEP2とSTEP5、STEP3とSTEP6は同じ処理を行っています。
スプレッドシートやアカウントID等の基本情報の定義
// スプレッドシートを指定
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/スプレッドシートID/edit#gid=0');
// シート名を指定
var ss_nkwl = spreadsheet.getSheetByName('NegativeKeywordList');
// シートの内容削除
ss_nkwl.clear();
// キーワード一覧指定
var ss_nkw = spreadsheet.getSheetByName('NegativeKeyword');
// シートの内容削除
ss_nkw.clear();
// キーワード一覧指定
var ss_add = spreadsheet.getSheetByName('add');
// アカウントIDを指定
const accountId = AdsUtilities.getCurrentAccountId();
データの出力に利用しているNegativeKeywordListシート・NegativeKeywordシートは毎回clear()を行っています。
除外キーワードリストを最新に更新
function getnkwls(accountId, ss_nkwl) {
// 空配列を作成
var array_nkwl = [];
// 項目名追加
array_nkwl.push(['リスト名', 'リストID']);
// 除外キーワードリストを取得
const nkwls = Search.AccountSharedService.get({
accountId: accountId,
}).rval;
// 除外キーワードリストが存在しない場合
if (nkwls.totalNumEntries == 0) {
Logger.log('Negative KW List does not exist.');
return;
}
// 取得した除外キーワードリストを配列に格納
for (let i = 0; i < nkwls.values.length; i++){
let nkwl = nkwls.values[i].accountShared;
var listName = nkwl.name;
var listId = nkwl.sharedListId;
Logger.log('name-> ' + listName + ', sharedListId->' + listId);
array_nkwl.push([listName, listId]);
}
Logger.log(array_nkwl);
ss_nkwl.getRange('A1').setValues(array_nkwl);
}
空の配列を作っておき、取得したデータを格納することでスプレッドシートへの出力(アクセス)を1回で済ませることができます。
除外キーワードリストを取得する際に参考にしたリファレンスはAccountSharedServiceです。
後ほど説明するSharedCriterionServiceで除外キーワードリスト名を取得できないため、まず最初にAccountSharedServiceで取得を行っています。
除外キーワードリストに登録されているキーワードを最新に更新
function getnkws(accountId, ss_nkw) {
// 空配列を作成
var array_nkw = [];
// 項目名追加
array_nkw.push(['リストID', '除外キーワード', '除外キーワードID', 'マッチタイプ']);
// 除外キーワードを取得
const nkws = Search.SharedCriterionService.get({
accountId: accountId,
}).rval;
if (nkws.totalNumEntries == 0) {
Logger.log('Negative KW does not exist.');
return;
}
for (let i = 0; i < nkws.values.length; i++){
let nkwlkw = nkws.values[i].sharedCriterion;
var listId = nkwlkw.sharedListId;
var nkw = nkwlkw.text;
var nkwId = nkwlkw.criterionId;
var nkwMatchType = nkwlkw.keywordMatchType;
array_nkw.push([listId, nkw, nkwId, nkwMatchType]);
}
Logger.log(array_nkw);
ss_nkw.getRange('A1').setValues(array_nkw);
}
除外キーワードを取得するために参照するリファレンスが異なりますが、それ以外は除外キーワードリストを取得する際のやり方と大きくは変わりません。
除外キーワードを除外キーワードリストに入稿
function addnkws(accountId, ss_add){
// 最終行を取得
var lastRow = ss_add.getLastRow();
if (lastRow == 1) {
Logger.log('KW does not exist.');
return;
}
// 範囲を取得
var range = ss_add.getRange(2, 1, lastRow-1, 3).getValues();
Logger.log(range);
for (let i = 0; i < lastRow-1; i++) {
var text = range[i][0];
var listId = range[i][2];
var matchType = range[i][1];
const add = Search.SharedCriterionService.add({
accountId: accountId,
operand: [
{
keywordMatchType: matchType,
sharedListId: listId,
text: text,
use: 'NEGATIVE'
}
]
}).rval;
}
}
スプレッドシートのaddシートで抽出された除外キーワードを入稿します。
入稿する除外キーワードが存在しない場合にエラーが発生しないよう、最終行が1行目の場合は処理を記述しています。
除外キーワードの入稿が発生した度にスクリプトを実行するのであれば必要ない処理ですが、定期実行を行う場合は不可欠です。
さいごに
今回はYahoo!広告スクリプトを用いた除外キーワードリストへの入稿方法を解説しました。
本スクリプトを活用することで除外キーワードの設定作業の効率化にお役立ていただければ嬉しく思います。
しかしながら、Yahoo!広告のみでの自動化では効果は限定的です。
理想は、
スプレッドシートへ除外キーワードを記載→Google広告・Yahoo!広告へ反映
です。
Google広告での自動化についても開発出来次第開設を予定しています。