アドカスタマイザーの日付関数の代替

更新履歴

2024/07/24 目次を追加
2024/07/22 スプレッドシートのテンプレートを追加しました
2024/07/05 スクリプトをV202406版に対応、機能強化
       コピーボタン追加などのレイアウト変更


スクリプトの概要

レスポンシブ検索広告のアドカスタマイザーでは日付関数が利用できないため、Googleスプレッドシートに記載されたアドカスタマイザー日付関数をYahoo!広告スクリプトで取り込むことで自動的に日付を変更することが可能です。
本ページでは、Googleスプレッドシート上で=today()関数を使い、アドカスタマイザーの値を本日の日付(実行日が3月27日であれば「3月27日」)に更新するスクリプトを紹介します。
LINEヤフー for businessの記事「【Yahoo!広告 スクリプト】アドカスタマイザーの日付自動挿入とは」には、効果や応用編のご説明もありますので、そちらもぜひご覧ください。

ご注意

アドカスタマイザーは編集ができないため、毎回削除→登録処理を実施しています。

毎回差し替えのタイミングで値の審査が入ることをご了承ください。審査中は、デフォルトの値が表示されます。

ご利用の流れ

1.Yahoo!広告スクリプトとGoogleアカウントを連携します
 詳しくはGoogleアカウントとの連携を確認してください。
 ※すでに連携済みの方は次のステップからご設定ください。

2.スプレッドシートのテンプレートをご自身のGoogleアカウントにコピーします
 以下のテンプレートを開き、[ファイル] → [コピーを作成] を実行し、ご自身用のスプレッドシートを作成してください。
 アドカスタマイザーの日付関数の代替テンプレート

3.スプレッドシートのA1セルに日付関数を以下のように設定します

・表示形式を設定されている場合は、表示形式の内容が優先されてスクリプトで取得されます。
・テキスト関数などで、文字列と連結し「3月27日新着」のような形にすることも可能です。

4.スプレッドシートIDを取得します
 詳しくはGoogleスプレッドシートIDの取得方法をご覧ください。

5.実行頻度を「毎日0時」に設定します
 詳しくはYahoo!広告 スクリプトの実行頻度の設定をご覧ください。
 ※当スクリプトでは、毎日日付の値を変えるため、「毎日0時」の設定を推奨しています。
  差し替えたい任意のタイミングに変更いただくことも可能ですが、1時間ごとの実行はおすすめしません。
  審査が完了しないうちに次の時間のスクリプト実行が始まってしまい、デフォルトテキストが常に表示されることが予想されるためです。

サンプルコード内各定数のご説明

後述のサンプルコードにおける各定数の設定方法についてご説明いたします。内容にあわせて変更を行ってください。

■スプレッドシートID、シート名

「必要な設定」で準備した、A1に日付関数等が設定されているスプレッドシートIDとシート名を指定します。

例)スプレッドシートID:'12345abcde'、シート名:'Sheet1'の場合
const SPREAD_SHEET_ID = '12345abcde'; //★書き出すスプレッドシートID。例:'SPREAD_SHEET_ID'
const SHEET_NAME = 'Sheet1';//★スプレッドシートのシート名。例:'シート1'

■エンティティタイプ、キャンペーンID

ENTITY_TYPE に、値のひも付け先をアカウントにするかキャンペーンにするか設定します。
ACCOUNT を指定した場合は、CAMPAIGN_IDSは空欄のままにしてください。
CAMPAIGN を指定した場合は、CAMPAIGN_IDSにキャンペーンIDを記載してください。

例)キャンペーンID:12345を指定する場合
・const ENTITY_TYPE = 'CAMPAIGN'; // ACCOUNT or CAMPAIGN
・const CAMPAIGN_IDS = [12345]; // [12345,23456,34567]

※複数キャンペーンの場合、[12345,23456,34567]のように[]内にキャンペーンIDをカンマ区切りで記載してください。

■アドカスタマイザー属性の名称

使用するアドカスタマイザー属性の名称を指定してください。未登録の名称を指定した場合、自動で新規登録されます。

例)アドカスタマイザー属性の名称として「日付」を指定する場合
・const CUSTOMIZER_NAME ='日付';

サンプルコード

下記のスクリプトを、「コピー」ボタンを押してコピーし、スクリプトの入力画面に貼り付けてください。(このとき、灰色のコメント部分は消さずに残しておいてください)
「サンプルコード内各定数のご説明」またはスクリプト内に記載の利用方法に沿って、設定が必要な定数を設定してください。

/*
■スクリプト内容
指定のスプレッドシート内のA1の内容を、指定のアドカスタマイザーの値と差し替える
値の紐付けは、アカウントかキャンペーンを指定できる
■利用方法
1.当スクリプトを、検索広告のスクリプトとしてください。
2.定数を以下のように設定してください。
■定数
・SPREAD_SHEET_ID //スプレットシートIDを指定
・SHEET_NAME //スプレッドシートのシート名
・ENTITY_TYPE //アドカスタマイザーの紐付け先 アカウントに紐付ける場合はACCOUNT、キャンペーンに紐付けるならCAMPAIGN
・CAMPAIGN_IDS // 紐付け先のキャンペーンID。カンマ区切りで入力 
・CUSTOMIZER_NAME // アドカスタマイザーの属性名称 登録済みの場合は既存の属性を使い、未登録の場合は新規登録を行います
*/
const SPREAD_SHEET_ID = 'SPREAD_SHEET_ID';
const SHEET_NAME = 'SHEET_NAME';
const ENTITY_TYPE = 'ACCOUNT'; // ACCOUNT or CAMPAIGN
const CAMPAIGN_IDS = []; // [12345,23456,34567]
const CUSTOMIZER_NAME ='カスタマイザー名';
const accountId = AdsUtilities.getCurrentAccountId();
function main() {
  try{
    switchCustomizer();
  } catch(e){
    throw new Error(e); 
  } 
}
function switchCustomizer(){
  const ss = validateAndGetSpreadsheet();
  let sh = validateAndGetSheet(ss);
  sh.appendRow(['']);
  const dateData = sh.getDataRange().getValues();
  const customizerValue = dateData[0][0];
  const customizerAttributeId = getCustomizerId();
  Logger.log('対象の値' + customizerValue);
  if( 'ACCOUNT' === ENTITY_TYPE ){
    Logger.log('アカウントへの関連付けを行います');
    switchAccountCustomizer(customizerAttributeId, customizerValue);
  } else if( 'CAMPAIGN' === ENTITY_TYPE ){
    Logger.log('キャンペーンへの関連付けをおこないます');
    switchCampaignCustomizer(customizerAttributeId, customizerValue);
  } else {
    throw new Error('ENTITY_TYPEの設定に誤りがあります'); 
  }
}
function getCustomizerId(){
  let customizerData = Search.CustomizerAttributeService.get({
    accountId: accountId,
  }).rval;
  if( customizerData.totalNumEntries > 0 ){
    for (let i = 0; i < customizerData.values.length; i++){
      const customizerAttribute =  customizerData.values[i].customizerAttribute;
      if( customizerAttribute.name === CUSTOMIZER_NAME ){
        Logger.log('対象のアドカスタマイザーを取得しました。アドカスタマイザーID:' + customizerAttribute.customizerAttributeId);
        return customizerAttribute.customizerAttributeId;
      }
    }
  }
  customizerData = Search.CustomizerAttributeService.add({
    accountId: accountId,
    operand: [{
      name: CUSTOMIZER_NAME,
      type: "TEXT"
    }]
  }).rval;
  if( customizerData.values[0].operationSucceeded ){
    Logger.log('対象のアドカスタマイザーを作成しました。アドカスタマイザーID:' + customizerData.values[0].customizerAttribute.customizerAttributeId);
    return customizerData.values[0].customizerAttribute.customizerAttributeId;
  } else {
    throw new Error('アドカスタマイザーの作成に失敗しました。'); 
  }
}
function switchAccountCustomizer(customizerAttributeId, customizerValue){
  const customizerOperand = [{
    customizerAttributeId: customizerAttributeId,
    value: customizerValue
  }];
  const removeData = Search.AccountCustomizerService.remove({
    accountId: accountId,
    operand: customizerOperand
  }).rval;
  if( !removeData.values[0].operationSucceeded ){
    Logger.log('アドカスタマイザーのアカウント関連付け削除に失敗しました。※初回は必ず失敗します'); 
  }
  const addData = Search.AccountCustomizerService.add({
    accountId: accountId,
    operand: customizerOperand
  }).rval;
  if( addData.values[0].operationSucceeded ){
    Logger.log('アカウントへの関連付けに成功しました。値を「' + customizerValue + '」に変更しました。');
  } else {
    throw new Error('アドカスタマイザーのアカウント関連付けに失敗しました。'); 
  }
}
function switchCampaignCustomizer(customizerAttributeId, customizerValue){
  const customizerOperand = [];
  for(let i = 0; i < CAMPAIGN_IDS.length; i++ ){
    customizerOperand.push({
      campaignId: CAMPAIGN_IDS[i],
      customizerAttributeId: customizerAttributeId,
      value: customizerValue,
    });
  }
  const removeData = Search.CampaignCustomizerService.remove({
    accountId: accountId,
    operand: customizerOperand
  }).rval;
  let errFlg = false;
  for(let i = 0; i < removeData.values.length; i++ ){
    if( !removeData.values[i].operationSucceeded ){
      Logger.log('アドカスタマイザーのキャンペーン関連付け削除に失敗しました。※初回は必ず失敗します');
    }
  }
  const addData = Search.CampaignCustomizerService.add({
    accountId: accountId,
    operand: customizerOperand
  }).rval;
  for(let i = 0; i < addData.values.length; i++ ){
    if( addData.values[i].operationSucceeded ){
      Logger.log('キャンペーンID' + addData.values[i].campaignCustomizer.campaignId 
        +'への関連付けに成功しました。値を「' + customizerValue + '」に変更しました。');
    } else {
      errFlg = true;
      Logger.log('アドカスタマイザーのキャンペーン関連付けに失敗しました。キャンペーンID:' + addData.values[i].campaignCustomizer.campaignId);
    }
  }
  if( errFlg ){
    throw new Error('アドカスタマイザーのキャンペーン関連付けに失敗しました。'); 
  }
}
function validateAndGetSpreadsheet() {
  if (SPREAD_SHEET_ID === 'SPREAD_SHEET_ID' || SPREAD_SHEET_ID === '') {
    throw new Error('スプレッドシートIDを設定してください。');
  }
  try{
    return SpreadsheetApp.openById(SPREAD_SHEET_ID);
  } catch(e){
    throw new Error('スプレッドシートを開くことが出来ませんでした。スプレッドシートIDまたはスプレッドシートの権限が正しいか確認してください。' + e);
  }    
}  
function validateAndGetSheet(ss) {
  if (SHEET_NAME === '') {
    throw new Error('シート名を設定してください。');
  }
  const sh = ss.getSheetByName(SHEET_NAME);
  if(sh === null){
    throw new Error('シートが開けませんでした。シート名を確認してください。');
  }
  return sh;
}