事例集(レポート系)

Q.MCC配下のアカウント、キャンペーンごとのレポートを出力したいです。(フィードバックフォームからのご要望)
Q.検索広告の地域別レポートをスプレッドシートに出力したいのですが、フィールド名には何を指定したらいいでしょうか?(フィードバックフォームからのご要望)
Q.コンバージョン名を入れてレポート抽出するにはどうしたらいいでしょうか?
Q.ディスプレイ広告のデータをスクリプトを用いてスプレッドシートに自動で取得したいのですが、期間を全期間で取得するにはどうすればいいでしょうか?
Q.広告レポート出力において、キャンペーンIDを指定してレポートを出力をする事は可能でしょうか?(フィードバックフォームからのご要望)
Q.日付の期間を特定日から当日までで設定したいのですが設定することはできますか?(ウェビナーQ&Aでのご質問)
Q.広告費、インプレッション、クリック数のいずれかの数値が1以上になっているキャンペーンのみ書き出すスクリプトはどのように設定すればよいでしょうか?(ウェビナーQ&Aでのご質問)
Q.ディスプレイ広告のレポート出力においてオーディエンスカテゴリを含めたレポートを出力する事は可能でしょうか?(フィードバックフォームからのご要望)

Q.MCC配下のアカウント、キャンペーンごとのレポートを出力したいです。

A.以下のスクリプトで、MCC配下にあるアカウントのアカウント概要(当月のアカウント予算、インプレッション、コストなど)やキャンペーン概要を取得し、指定したスプレッドシートに出力できます。
スプレッドシートのテンプレートは、以下をご利用ください。
テンプレートをコピー

動作可能プロダクト:検索広告、ディスプレイ広告(スクリプトの設定はMCCアカウントにてお願いします)
動作確認バージョン:v202406
 コードサンプル ここをクリックすると折り畳みます。

/*このソースコードは MIT License のもとで提供されています。
https://ads-developers.yahoo.co.jp/ja/ads-script/post/30418913.html
■スクリプト内容
MCC以下にあるアカウントのアカウント概要(当月のアカウント予算、インプレッション、コストなど)やキャンペーン概要を取得し、指定したスプレッドシートに表示します。
■定数
・SPREAD_SHEET_ID   //スプレットシートIDを指定
・SHEET_NAME_DATE    //出力シート名(日付指定用)
・SHEET_NAME_ACC    //出力シート名(アカウント出力結果用)
・SHEET_NAME_CAM    //出力シート名(キャンペーン出力結果用)
・PRODUCT_TYPE:  //出力対象のプロダクト種別を指定してください。
                      'BOTH':両方、'SEARCH':検索広告アカウントのみ、'DISPLAY':ディスプレイ広告アカウントのみ。
・TARGET_STATUS     //抽出対象とする広告の配信状況。BOTH:両方、ACTIVE:配信オンのみ、PAUSED:配信オフのみ。
・FLAG_MAIL         //結果をメール送信するならtrue、しないならfalse
・MAIL_TO           //メール送信先のYahoo! BusinessID
・MAIL_TITLE        //メールタイトル
・HEADER_ACC        //スプレッドシートに出力するヘッダー(アカウント出力結果用)
・HEADER_CAM        //スプレッドシートに出力するヘッダー(キャンペーン出力結果用)
■制限事項
1度に取得可能なアカウントは各プロダクト毎に500件までです。※500件以下でもタイムアウトになる可能性があります
*/
// 設定必須
const SPREAD_SHEET_ID = 'SPREAD_SHEET_ID';
const SHEET_NAME_DATE = '日付指定';
const SHEET_NAME_ACC = 'アカウント出力結果';
const SHEET_NAME_CAM = 'キャンペーン出力結果';
// 設定任意
const PRODUCT_TYPE = 'BOTH';// BOTH or SEARCH or DISPLAY
const TARGET_STATUS = 'BOTH';// BOTH:両方、ACTIVE:配信オンのみ、PAUSED:配信オフのみ
const FLAG_MAIL = false;
const MAIL_TO = ['Yahoo! JAPAN Business ID'];
let MAIL_TITLE = 'MCC配下の情報取得スクリプト';
const FLAG_SLACK = false;
const URL_FETCH_APP = 'SLACK_WEBHOOK_URL';
const HEADER_ACC = ['アカウントID', 'アカウント名', '当月のアカウント予算', 'IMP', 'クリック', 'CTR', 'CPC', 'コスト'];
const HEADER_CAM = ['アカウントID', 'アカウント名', 'キャンペーンID', 'キャンペーン名', 'キャンペーン日予算', 'IMP', 'クリック', 'CTR', 'CPC', 'コスト'];
// 変更不可
let TEXT_MESSAGE_ARRAY = [];
const SPREAD_SHEET_URL = 'https://docs.google.com/spreadsheets/d/' + SPREAD_SHEET_ID;
let shDate;
let shAcc;
let shCam;
let startDate;
let endDate;
function main() {
  //スプレッドシート
  const ss = validateAndGetSpreadsheet();
  validateAndGetSheet(ss);
  //日付取得
  const dateRange = getDateRange();
  const mccAccountId = AdsUtilities.getCurrentAccountId();
  Logger.log(mccAccountId+'以下のアカウント情報とキャンペーン情報を出力します');
  try {
    let outputData = [];
    let outputDataCam = [];
    outputData.push(HEADER_ACC);
    outputDataCam.push(HEADER_CAM);
    if( PRODUCT_TYPE == 'BOTH' || PRODUCT_TYPE == 'SEARCH' ){
      outputData = outputData.concat(getAccountInfo(Search, mccAccountId, dateRange));
      outputDataCam = outputDataCam.concat(getCampaignInfo(Search, mccAccountId, dateRange));
    }
    if( PRODUCT_TYPE == 'BOTH' || PRODUCT_TYPE == 'DISPLAY' ) {
      outputData = outputData.concat(getAccountInfo(Display, mccAccountId, dateRange));
      outputDataCam = outputDataCam.concat(getCampaignInfo(Display, mccAccountId, dateRange));
    }
    shAcc.clear();
    shCam.clear();
    shAcc.getRange('A1').setValues(outputData);
    shCam.getRange('A1').setValues(outputDataCam);
    logAndMessage('MCC配下のアカウント情報とキャンペーン情報を出力しました。\n' + SPREAD_SHEET_URL);
  } catch (error) {
    MAIL_TITLE = '!!エラー発生!!' + MAIL_TITLE;
    logAndMessage('エラーが発生しました。詳細は管理画面のログをご確認ください。\n' + error);
    throw error;
  } finally {
    validateAndSendMail();
    validateAndSendSlack();
  }
}
function getDateRange(){
  //スプレットシート情報を取得する
  let dataArray = shDate.getDataRange().getValues();
  //もし2行以上の記載がなければ
  if (dataArray.length < 2) {
    Logger.log(SHEET_NAME_DATE + 'シートに、日付を記載してください');
    return;
  }
  //スプレッドシートのデータ取得
  return{
    startDate: dataArray[1][0].replace(/\//g,""),
    endDate: dataArray[1][1].replace(/\//g,"")
  };
}
function getAccountInfo(obj, mccAccountId, dateRange){
  let allAccounts = getAccounts(obj, mccAccountId);
  const accountIds = Object.keys(allAccounts);
  if(accountIds.length == 0){
    return;
  }
  getBudgetOrder(obj, accountIds, allAccounts);
  getReport(obj, accountIds, allAccounts, dateRange);
  let outputData = [];
  for(var accountId in allAccounts) {
    const accountData = allAccounts[accountId];
    let data = [
      accountId,
      accountData.accountName,
      accountData.amount,
      accountData.imps,
      accountData.clicks,
      accountData.click_rate,
      accountData.avg_cpc,
      accountData.cost,
    ];
    outputData.push(data);
  }
  return outputData;
}
function getCampaignInfo(obj, mccAccountId, dateRange){
  let allAccounts = getAccounts(obj, mccAccountId);
  const accountIds = Object.keys(allAccounts);
  let allCampaigns = getCampaigns(obj, accountIds);
  const campaignIds = Object.keys(allCampaigns);
  getCampaignReport(obj, accountIds, campaignIds, allCampaigns, dateRange);
  for (let i = 0; i < campaignIds.length; i++) {
    for (let j = 0; j < accountIds.length; j++) {
      if(allCampaigns[campaignIds[i]].accountId == accountIds[j]){
        allCampaigns[campaignIds[i]].account_name = allAccounts[accountIds[j]].accountName;
      }
    }
  }
  let outputData = [];
  for(var campaignId in allCampaigns) {
    const campaignData = allCampaigns[campaignId];
    let data = [
      campaignData.accountId,
      campaignData.account_name,
      campaignData.campaignId,
      campaignData.campaignName,
      campaignData.amount,
      campaignData.imps,
      campaignData.clicks,
      campaignData.click_rate,
      campaignData.avg_cpc,
      campaignData.cost,
    ];
    outputData.push(data);
  }
  return outputData;
}
function getAccounts(obj, mccAccountId){
  let allAccounts = {};
  let startIndex = 1;
  const numberResults = 500;
  while (true) {
    const accounts = obj.AccountLinkService.get({
      mccAccountId: mccAccountId,
      accountStatuses: ['SERVING'],
      numberResults: numberResults,
      startIndex: startIndex
    }).rval;
    if( accounts.totalNumEntries == 0 ){
      return allAccounts;
    }
    let accountIds = [];
    for (let i = 0; i < accounts.values.length; i++) {
      accountIds.push(accounts.values[i].accountLink.accountId);
    }
    Object.assign(allAccounts,getAccountDetails(obj, accountIds));
    if( accounts.values.length < numberResults ||
      (startIndex - 1 + accounts.values.length) == accounts.totalNumEntries ) break;
    startIndex += numberResults;
  }
  return allAccounts;
}
function getAccountDetails(obj, accountIds){
  let allAccounts = [];
  const accounts = obj.AccountService.get({
    accountIds: accountIds,
  }).rval;
  if( accounts.totalNumEntries > 0 ){
    for (let i = 0; i < accounts.values.length; i++) {
       const account = accounts.values[i].account;
       if( TARGET_STATUS === 'BOTH' || TARGET_STATUS === account.deliveryStatus){
         let accountDetails = {
            accountName: account.accountName,
            deliveryStatus: account.deliveryStatus
         };
         allAccounts[account.accountId] = accountDetails;
       }
    }
  }
  const mccAccounts = obj.AccountService.get({
    accountIds: accountIds,
    includeMccAccount: 'ONLY_MCC_ACCOUNT',
  }).rval;
  if( mccAccounts.totalNumEntries > 0 ){
    for (let i = 0; i < mccAccounts.values.length; i++) {
       const mccAccountId = mccAccounts.values[i].account.accountId;
       Object.assign(allAccounts, getAccounts(obj, mccAccountId));
    }
  }
  return allAccounts;
}
function getCampaigns(obj, accountIds){
  let allCampaigns = {};
  for (let a = 0; a < accountIds.length; a++) {
    const campaings = obj.CampaignService.get({
      accountId: accountIds[a],
    }).rval;
    if( campaings.totalNumEntries > 0 ){
      for (let i = 0; i < campaings.values.length; i++) {
        const campaign = campaings.values[i].campaign;
        let campaignDetails = {
          accountId: campaign.accountId,
          campaignId: campaign.campaignId,
          campaignName: campaign.campaignName,
          amount: campaign.budget.amount
        };
        allCampaigns[campaign.campaignId] = campaignDetails;
      }
    }
  }
  return allCampaigns;
}
function getBudgetOrder(obj, accountIds, allAccounts){
  const accountObjects = getBudgetOrderRequest(accountIds);
  for (const request of accountObjects) {
    if(obj == Search){
      const budgetOrders = obj.BudgetOrderService.get(request).rval;
      getBudgetOrderResponse(budgetOrders, allAccounts);
    } else {
      const budgetOrders = obj.BudgetOrderService.get(request).rval;
      getBudgetOrderResponse(budgetOrders, allAccounts);
    }
  }
}
function getBudgetOrderRequest(accountIds){
  const groupedAccountIds = [];
  groupedAccountIds.push({ accountIds: accountIds });
  return groupedAccountIds;
}
function getBudgetOrderResponse(budgetOrders, allAccounts){
  for (let i = 0; i < budgetOrders.values.length; i++) {
    const budgetOrder = budgetOrders.values[i].budgetOrder;
    allAccounts[budgetOrder.accountId].amount = budgetOrder.amount;
  }
}
function getReport(obj, accountIds, allAccounts, dateRange){
  for (let i = 0; i < accountIds.length; i++) {
    Logger.log('処理対象アカウント:' + accountIds[i]);
    const operand = {
      accountId: accountIds[i],
      fields: ['IMPS','CLICKS','CLICK_RATE','AVG_CPC','COST'],
      reportDateRangeType: 'CUSTOM_DATE',
      dateRange: {
        startDate: dateRange.startDate,
        endDate: dateRange.endDate,
      },
    };
    if(obj === Search){
      operand.reportType = 'ACCOUNT';
    }
    const reports = obj === Search
      ? AdsUtilities.getSearchReport(operand).reports[0].rows
      : AdsUtilities.getDisplayReport(operand).reports[0].rows;
    allAccounts[accountIds[i]].imps = reports.length === 0 ? 0 : reports[0][0];
    allAccounts[accountIds[i]].clicks = reports.length === 0 ? 0 : reports[0][1];
    allAccounts[accountIds[i]].click_rate = reports.length === 0 ? 0 : reports[0][2];
    allAccounts[accountIds[i]].avg_cpc = reports.length === 0 ? 0 : reports[0][3];
    allAccounts[accountIds[i]].cost = reports.length === 0 ? 0 : reports[0][4];
  }
}
function getCampaignReport(obj, accountIds, campaignIds, allCampaigns, dateRange){
  for (let i = 0; i < accountIds.length; i++) {
    const operand = {
      accountId: accountIds[i],
      fields: ['CAMPAIGN_ID','CAMPAIGN_NAME','IMPS','CLICKS','CLICK_RATE','AVG_CPC','COST','ACCOUNT_NAME'],
      reportDateRangeType: 'CUSTOM_DATE',
      dateRange: {
        startDate: dateRange.startDate,
        endDate: dateRange.endDate,
      },
    };
    if(obj === Search){
      operand.reportType = 'CAMPAIGN';
    }
    const reports = obj === Search
      ? AdsUtilities.getSearchReport(operand).reports[0].rows
      : AdsUtilities.getDisplayReport(operand).reports[0].rows;
    for (let j = 0; j < campaignIds.length; j++) {
      for (let k = 0; k < reports.length; k++) {
        if (campaignIds[j] == reports[k][0]) {
          allCampaigns[campaignIds[j]].imps = reports[k][2];
          allCampaigns[campaignIds[j]].clicks = reports[k][3];
          allCampaigns[campaignIds[j]].click_rate = reports[k][4];
          allCampaigns[campaignIds[j]].avg_cpc = reports[k][5];
          allCampaigns[campaignIds[j]].cost = reports[k][6];
        }
      }
    }
  }
}
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_ACC === '' || SHEET_NAME_DATE === '' || SHEET_NAME_CAM === '') {
    throw new Error('シート名を設定してください。');
  }
  shAcc = ss.getSheetByName(SHEET_NAME_ACC);
  shDate = ss.getSheetByName(SHEET_NAME_DATE);
  shCam = ss.getSheetByName(SHEET_NAME_CAM);
  if (shAcc === null || shDate === null || shCam === null) {
    throw new Error('シートが開けませんでした。シート名を確認してください。');
  }
}
function validateAndSendMail() {
  if (FLAG_MAIL) {
    if (MAIL_TO.length < 1 || !MAIL_TO.every(str => typeof str === 'string' && /^[a-zA-Z0-9]+$/.test(str))) {
      throw new Error('Yahoo! JAPANビジネスIDを設定してください。メール送信前までに実行された処理は完了しています。');
    }
    const mccAccountId = AdsUtilities.getCurrentAccountId();
    MailApp.sendEmail({
      to: MAIL_TO,
      subject: '【MCCアカウントID:' + mccAccountId + '】' + MAIL_TITLE,
      body: TEXT_MESSAGE_ARRAY.join('\n'),
    });
  }
}
function logAndMessage(text) {
  Logger.log(text);
  TEXT_MESSAGE_ARRAY.push(text);
}
function validateAndSendSlack() {
  if (FLAG_SLACK) {
    if (URL_FETCH_APP === 'SLACK_WEBHOOK_URL' || URL_FETCH_APP === '') {
      throw new Error('SlackのWebhook URLを設定してください。Slack送信前までに実行された処理は完了しています。');
    }
    UrlFetchApp.fetch(URL_FETCH_APP, {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify({
        text: TEXT_MESSAGE_ARRAY.join('\n'),
      }),
    });
  }
}

Q.検索広告の地域別レポートをスプレッドシートに出力したいのですが、フィールド名には何を指定したらいいでしょうか?

A.検索広告の地域別レポートは、reportTypeに「GEO」を指定することで作成できます。
具体的に指定できるフィールド名は下記の地域別レポートをご参照ください。
https://ads-developers.yahoo.co.jp/ja/ads-script/product-guide/reference/interfaces/search.ReportDefinitionService.html

動作可能プロダクト:検索広告
動作確認バージョン:v202406
 コードサンプル ここをクリックすると折り畳みます。

//検索広告用
function main() {
  const reportData = createGeoReport();
  setSpredsheet(reportData);
}
//レポート作成
function createGeoReport() {
  const reportData = AdsUtilities.getSearchReport({
    accountId: AdsUtilities.getCurrentAccountId(),// 実行中のアカウントを取得します
    reportType: 'GEO', 
    fields: [
      'ACCOUNT_NAME', 'CAMPAIGN_NAME', 'CAMPAIGN_ID', 'COUNTRY_TERRITORY', 'PREFECTURE', 'IMPS', 'CLICKS', 'CLICK_RATE', 'COST', 'AVG_CPC', 'CONVERSIONS', 'CONV_RATE', 'COST_PER_CONV'
    ],
    reportDateRangeType: 'THIS_MONTH',//期間「今月」
  }).reports[0].rows;
  return reportData;
}
//スプレッドシートへの書き込み
function setSpredsheet(reportData) {
  if (reportData.length == 0) {
    Logger.log('対象データがありませんでした。');
    return;
  }
  const ss = SpreadsheetApp.openById('スプレッドシートID');
  let sh = ss.getSheetByName('シート1');
  sh.clear();
  sh.getRange('A1').setValues(reportData);
}

Q.コンバージョン名を入れてレポート抽出するにはどうしたらいいでしょうか?


A.以下のように記載することでコンバージョンレポートが抽出できます。

動作可能プロダクト:検索広告/ディスプレイ広告
動作確認バージョン:v202406

 検索広告コードサンプル ここをクリックすると折り畳みます。

//検索広告用
function main() {
  const reportData = createConversionReport();
  setSpredsheet(reportData);
}
//レポート作成
function createConversionReport() {
  const reportData = AdsUtilities.getSearchReport({
    accountId: AdsUtilities.getCurrentAccountId(),// 実行中のアカウントを取得します
    reportType: 'CAMPAIGN', 
    fields: [
      'ACCOUNT_NAME', 'CAMPAIGN_NAME', 'CONVERSION_NAME', 'CONVERSIONS', 'CONV_VALUE'//コンバージョン名を入れてコンバージョンレポートに
    ],
    reportDateRangeType: 'THIS_MONTH',//期間「今月」
  }).reports[0].rows;
  return reportData;
}
//スプレッドシートへの書き込み
function setSpredsheet(reportData) {
  if (reportData.length == 0) {
    Logger.log('対象データがありませんでした。');
    return;
  }
  const ss = SpreadsheetApp.openById('スプレッドシートID');
  let sh = ss.getSheetByName('シート1');
  sh.clear();
  sh.getRange('A1').setValues(reportData);
}

 ディスプレイ広告コードサンプル ここをクリックすると折り畳みます。

//ディスプレイ広告用
function main() {
  const reportData = createConversionReport();
  setSpredsheet(reportData);
}
//レポート作成
function createConversionReport() {
  const reportData = AdsUtilities.getDisplayReport({
    accountId: AdsUtilities.getCurrentAccountId(),// 実行中のアカウントを取得します
    fields: [
      'ACCOUNT_NAME', 'CAMPAIGN_NAME', 'CONVERSION_NAME', 'CONVERSIONS', 'CONV_VALUE'//コンバージョン名を入れてコンバージョンレポートに
    ],//...(3)
    reportDateRangeType: 'THIS_MONTH',//期間「今月」
  }).reports[0].rows;
  return reportData;
}
//スプレッドシートへの書き込み
function setSpredsheet(reportData) {
  if (reportData.length == 0) {
    Logger.log('対象データがありませんでした。');
    return;
  }
  const ss = SpreadsheetApp.openById('スプレッドシートID');
  let sh = ss.getSheetByName('シート1');
  sh.clear();
  sh.getRange('A1').setValues(reportData);
}

Q.ディスプレイ広告のデータをスクリプトを用いてスプレッドシートに自動で取得したいのですが、期間を全期間で取得するにはどうすればいいでしょうか?


A.ディスプレイ広告(運用型)においては全期間の提供がないため、日付を直接指定するCUSTOM_DATEの機能を使用します。サンプルコードでは、endDateには今日の日付を自動的に設定し、startDateには任意の日付(例えば、アカウント開設日など)を設定します。

動作可能プロダクト:ディスプレイ広告
動作確認バージョン:v202406
 コードサンプル ここをクリックすると折り畳みます。

function main(){
  const reportData = createAccountReport();
  setSpredsheet(reportData);
}
function createAccountReport(){
  const accountId = AdsUtilities.getCurrentAccountId();
  const startDate = '20240401'; // 取得開始したい日付を設定する
  const toDay = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMdd"); // 本日の日付取得
  const reportData = AdsUtilities.getDisplayReport({
    accountId: accountId,
    fields: [
      'ACCOUNT_ID', 'ACCOUNT_NAME', 'IMPS', 'CLICKS', 'COST'
    ],
    dateRange: {
      startDate: startDate,
      endDate: toDay,
    },
    reportDateRangeType: 'CUSTOM_DATE',
  }).reports[0].rows;
  return reportData;
}
function setSpredsheet(reportData){
  if(reportData.length == 0){
    Logger.log('対象データがありませんでした。');
    return;
  }
  const ss = SpreadsheetApp.openById('スプレッドシートID');
  let sh = ss.getSheetByName('シート1');
  sh.clear();
  sh.getRange('A1').setValues(reportData);
}

Q広告レポート出力において、キャンペーンIDを指定してレポートを出力をする事は可能でしょうか?


A.はい、以下のスクリプトで実現できます。
期間や項目を変えたい場合は、ソリューションの基本のレポートをご覧ください。
キャンペーンIDの指定を変更したい場合は定数部分を編集してください。

動作可能プロダクト:ディスプレイ広告/検索広告
動作確認バージョン:v202406
 ディスプレイ広告コードサンプル ここをクリックすると折り畳みます。

function main() {
  const SPREAD_SHEET_ID = 'SPREAD_SHEET_ID';
  const SHEET_NAME = 'SHEET_NAME';
  const CAMPAIGN_IDS = ['1111111', '2222222'];//絞り込むキャンペーンIDを半角カンマ区切りで指定します
  const accountId = AdsUtilities.getCurrentAccountId();
  const ss = validateAndGetSpreadsheet(SPREAD_SHEET_ID);
  const sh = validateAndGetSheet(ss,SHEET_NAME);
  const reports = AdsUtilities.getDisplayReport({
    accountId: accountId,
    fields: [
      'CAMPAIGN_ID', 'CAMPAIGN_NAME', 'ADGROUP_ID', 'ADGROUP_NAME', 'AD_ID', 'AD_NAME', 'IMPS', 'CLICKS', 'COST'
      ],
    filters: [
        {
          field: 'CAMPAIGN_ID',
          filterOperator: 'IN',
          values: CAMPAIGN_IDS
        }
      ],
    reportDateRangeType: 'THIS_MONTH',
  });
  sh.clear();
  if(reports.reports[0].rows.length > 0){
    const report = reports.reports[0].rows;
    sh.getRange('A1').setValues(report);
  }
}
function validateAndGetSpreadsheet(SPREAD_SHEET_ID) {
  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, SHEET_NAME) {
  if (SHEET_NAME === '') {
    throw new Error('シート名を設定してください。');
  }
  const sh = ss.getSheetByName(SHEET_NAME);
  if(sh === null){
    throw new Error('シートが開けませんでした。シート名を確認してください。');
  }
  return sh;
}

 検索広告コードサンプル ここをクリックすると折り畳みます。

function main() {
  const SPREAD_SHEET_ID = 'スプレッドシートID';
  const SHEET_NAME = 'シート1';
  const CAMPAIGN_IDS = ['1111111', '2222222'];//絞り込むキャンペーンIDを半角カンマ区切りで指定します
  const accountId = AdsUtilities.getCurrentAccountId();// 実行中のアカウントを取得します
  const ss = validateAndGetSpreadsheet(SPREAD_SHEET_ID);
  const sh = validateAndGetSheet(ss, SHEET_NAME);
  sh.clear();
  const reportData = AdsUtilities.getSearchReport({
    accountId: accountId,
    reportType: 'AD',
    fields: [
      'CAMPAIGN_ID', 'CAMPAIGN_NAME', 'ADGROUP_ID', 'ADGROUP_NAME', 'AD_ID', 'AD_NAME', 'IMPS', 'CLICKS', 'COST'
    ],
    reportDateRangeType: 'THIS_MONTH',
    reportSkipColumnHeader: 'FALSE',
    filters: [
      {
        field: 'CAMPAIGN_ID',
        filterOperator: 'IN',
        values: CAMPAIGN_IDS
      }
    ]
  }).reports[0].rows; //戻り値の1つ目のレポート行を取得
  sh.getRange('A1').setValues(reportData);//スプレッドシートへの書き込み処理
}
function validateAndGetSpreadsheet(SPREAD_SHEET_ID) {
  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, SHEET_NAME) {
  if (SHEET_NAME === '') {
    throw new Error('シート名を設定してください。');
  }
  const sh = ss.getSheetByName(SHEET_NAME);
  if (sh === null) {
    throw new Error('シートが開けませんでした。シート名を確認してください。');
  }
  return sh;
}


Q.日付の期間を特定日から当日までで設定したいのですが設定することはできますか?


A.はい、できます。以下のスクリプトの★部分を参考にしてください。
動作可能プロダクト:検索広告
動作確認バージョン:v202306
 コードサンプル ここをクリックすると折り畳みます。

function main() {
  const spreadsheetId = 'SPREAD_SHEET_ID';
  const sheetName = 'シート1';
  const ss = SpreadsheetApp.openById(spreadsheetId);
  let sh = ss.getSheetByName(sheetName);
  sh.clear();
  // ★Javascript から今日の日付を取得する
  const today = Utilities.formatDate(new Date(), 'GMT', 'yyyyMMdd');
  const reportData = AdsUtilities.getSearchReport({
    accountId: AdsUtilities.getCurrentAccountId(),// 実行中のアカウントを取得します
    reportType: 'CAMPAIGN',
    fields: [
      'DAY','CAMPAIGN_NAME','IMPS','CLICKS','COST','CONVERSIONS'
    ],
    reportDateRangeType:'CUSTOM_DATE',
    dateRange: {
        startDate: '20230101',//特定日を設定
        endDate: today // ★当日を設定
    },
  }).reports[0].rows;
  // 結果データがあれば出力
  if( reportData.length > 0 ) {
    sh.getRange('A1').setValues(reportData);//スプレッドシートへの書き込み処理
    Logger.log('出力に成功しました');
  } else {
    Logger.log('対象のレポートデータがありませんでした');
  }
}

Q.広告費、インプレッション、クリック数のいずれかの数値が1以上になっているキャンペーンのみ書き出すスクリプトはどのように設定すればよいでしょうか?


A.OR条件はレポート取得時に指定できない(フィルタはAND条件)ため、以下のスクリプトのようにレポート取得後に判定する形となります。
動作可能プロダクト:ディスプレイ広告
動作確認バージョン:v202306
 コードサンプル ここをクリックすると折り畳みます。

function main() {
  const spreadsheetId = 'SPREAD_SHEET_ID';//...(1)
  const sheetName = 'シート1';//...(2)
  const ss = SpreadsheetApp.openById(spreadsheetId);
  let sh = ss.getSheetByName(sheetName);
  sh.clear();
  const reportData = AdsUtilities.getSearchReport({
    accountId: AdsUtilities.getCurrentAccountId(),// 実行中のアカウントを取得します
    reportType: 'CAMPAIGN', //...(3)
    fields: [
      'ACCOUNT_NAME','CAMPAIGN_NAME','IMPS','CLICKS','COST','CONVERSIONS'//...(4)
    ],
    reportDateRangeType: 'THIS_MONTH',//...(5)
  }).reports[0].rows;
  //★ディスプレイ広告の場合は、基本のレポートのサンプルの最終行を消して以下を埋め込み
  let executeData = [];
  for(let i = 0; i < reportData.length; i++ ){
    // fieldsに設定されている場所を先頭から順番に数値として設定します。Javascriptでは配列は0からカウントしますので、
    // ACCOUNT_NAMEは0、CAMPAIGN_NAMEは1、IMPSは2と数えていきます。
    const imps = reportData[i][2]; // IMPS
    const clicks = reportData[i][3]; // CLICKS
    const cost = reportData[i][4]; // COST
    // インプレッション、クリック数、コストを1以上 JavascriptではORは||でつなぎます。(ANDの場合&&)
    // 条件にあったレポートのレコードを出力用の配列に追加
    if( imps >= 1 || clicks >= 1 || cost >= 1 ) {
      executeData.push(reportData[i]);
    }
  }
  // 絞り込んだ結果データがあれば出力
  if( executeData.length > 0 ) {
    sh.getRange('A1').setValues(executeData);//スプレッドシートへの書き込み処理
    Logger.log('出力に成功しました');
  } else {
    Logger.log('対象のレポートデータがありませんでした');
  }
}


Q.ディスプレイ広告のレポート出力においてオーディエンスカテゴリを含めたレポートを出力する事は可能でしょうか?


A.以下のお知らせのとおり、オーディエンスカテゴリレポートは2024年4月に終了となっております。
【ディスプレイ広告】オーディエンスカテゴリーレポートの提供を終了
こちらには「オーディエンスリストターゲティング」のレポート出力例を掲載いたします。
出力項目を追加したい場合は、以下のページをご参照のうえ、追加してください。
レポート定義

動作可能プロダクト:ディスプレイ広告
動作確認バージョン:v202402
 コードサンプル ここをクリックすると折り畳みます。

function main() {
  const spreadsheetId = 'スプレッドシートID';
  const sheetName = 'シート1';
  const ss = SpreadsheetApp.openById(spreadsheetId);
  let sh = ss.getSheetByName(sheetName);
  sh.clear();
  const reportData = AdsUtilities.getDisplayReport({
    accountId: AdsUtilities.getCurrentAccountId(),
    fields: [
      'AUDIENCE_LIST_NAME', 'AUDIENCE_LIST_TYPE', 'ACCOUNT_NAME', 'CAMPAIGN_NAME',
      'IMPS', 'CLICKS', 'COST', 'CONVERSIONS'
    ],
    reportDateRangeType: 'THIS_MONTH',
    reportSkipColumnHeader: 'FALSE'
  }).reports[0].rows;
  sh.getRange('A1').setValues(reportData);
}