20250130Webinarデモ-レポート出力

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

1. レポート出力(期間の選択肢から選ぶ方式)
2. レポート出力(開始日・終了日を指定する方式)
3. 自分でカスタマイズしたい人向けのご案内

1. レポート出力(期間の選択肢から選ぶ方式)

スクリプト内容:指定した期間のキャンペーンレポートを作成し、メールまたはSlackで通知します。
※検索広告のアカウント、ディスプレイ広告のアカウント両方でお使いいただけます(内部で自動判定しています)

/*このソースコードは MIT License のもとで提供されています。
https://ads-developers.yahoo.co.jp/ja/ads-script/post/30418913.html
■スクリプト内容
スクリプトを設定したアカウントの指定した期間のキャンペーンレポートを出力し、メール/Slack通知します。
■利用方法
1.当スクリプトを、検索広告またはディスプレイ広告のアカウントに設定してください。
2.定数を以下のように設定してください。
3.実行頻度を1日1回(時間は任意)に設定してください。
■定数
・SPREAD_SHEET_ID   //スプレットシートIDを指定
・SHEET_NAME        //出力シート名
・DATE_RANGE_TYPE   //レポートの抽出期間。初期値は「今月(THIS_MONTH)」。
                      「今月」以外で設定できる値は、以下のリファレンスをご参照ください。
                      検索広告:https://ads-developers.yahoo.co.jp/ja/ads-script/product-guide/reference/enums/search.ReportDefinitionServiceReportDateRangeType.html
                      ディスプレイ広告:https://ads-developers.yahoo.co.jp/ja/ads-script/product-guide/reference/enums/display.ReportDefinitionServiceReportDateRangeType.html
・REPORT_TYPE       //レポート種別。初期値は「キャンペーンレポート(CAMPAIGN)」。
                      変更したい場合は、DeveloperCenterの「基本のレポート(https://ads-developers.yahoo.co.jp/ja/ads-script/post/30418910.html)」
                      ページをご覧ください。
・REPORT_FIELDS     //レポート出力項目。
                      変更したい場合は、DeveloperCenterの「基本のレポート(https://ads-developers.yahoo.co.jp/ja/ads-script/post/30418910.html)」
                      ページをご覧ください。
・FLAG_MAIL         //結果をメール送信するならtrue、しないならfalse
・MAIL_TO           //メール送信先のYahoo! BusinessID
・MAIL_TITLE        //メールタイトル
・FLAG_SLACK        //結果をSlack送信するならtrue、しないならfalse
・URL_FETCH_APP     //SlackのWebhook URL
 */
//設定が必要な定数(設定しないとエラーになります)
const SPREAD_SHEET_ID = 'SPREAD_SHEET_ID';
const SHEET_NAME = 'SHEET_NAME'
//レポート定義用定数(必要に応じて変更してください)
const DATE_RANGE_TYPE = 'THIS_MONTH';
const REPORT_TYPE = 'CAMPAIGN';
const REPORT_FIELDS = ['ACCOUNT_NAME', 'CAMPAIGN_NAME', 'IMPS', 'CLICKS', 'COST', 'CONVERSIONS'];
//設定が任意の定数(必要に応じて設定してください)
const FLAG_MAIL = false;
const MAIL_TO = ['Yahoo! JAPAN Business ID'];
let MAIL_TITLE = 'レポート出力';
const FLAG_SLACK = false;
const URL_FETCH_APP = 'SLACK_WEBHOOK_URL';
//設定が不要な定数(変更するとエラーになります)
const accountId = AdsUtilities.getCurrentAccountId();
const productType = AdsUtilities.getProductType();
const SPREAD_SHEET_URL = 'https://docs.google.com/spreadsheets/d/' + SPREAD_SHEET_ID;
let TEXT_MESSAGE_ARRAY = [];
function main() {
  try {
    const ss = validateAndGetSpreadsheet();
    const sh = validateAndGetSheet(ss);
    sh.clear();
    const reportData = getReport();
    sh.getRange('A1').setValues(reportData);
    const dataCnt = reportData.length - 1;//ヘッダ分を抜く
    logAndMessage('レポートデータを' + dataCnt + '件出力しました。\nスプレッドシート:' + SPREAD_SHEET_URL);
  } catch (error) {
    MAIL_TITLE = '!!エラー発生!!' + MAIL_TITLE;
    logAndMessage('!!エラーが発生しました!!詳細は管理画面のログをご確認ください。' + error);
  } finally {
    sendMailAndSlack();
  }
}
function getReport() {
  let reportData = [];
  const operand = {
    accountId: accountId,
    fields: REPORT_FIELDS,
    reportDateRangeType: DATE_RANGE_TYPE,
    reportSkipColumnHeader: 'FALSE',
    reportName:'20250130ウェビナースクリプト1'
  };
  if (productType == 'SEARCH') {
    operand.reportType = REPORT_TYPE ;
    reportData = AdsUtilities.getSearchReport(operand).reports[0].rows;
  } else if (productType == 'DISPLAY') {
    reportData = AdsUtilities.getDisplayReport(operand).reports[0].rows;
  } else {
    throw new Error('このスクリプトはMCCアカウントでは実行できません');
  }
  return reportData;
}
function sendMailAndSlack() {
  validateAndSendMail();
  validateAndSendSlack();
}
function logAndMessage(text) {
  Logger.log(text);
  TEXT_MESSAGE_ARRAY.push(text);
}
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;
}
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'),
      }),
    });
  }
}
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を設定してください。メール送信前までに実行された処理は完了しています。');
    }
    MailApp.sendEmail({
      to: MAIL_TO,
      subject: '【アカウントID:' + accountId + '】' + MAIL_TITLE,
      body: TEXT_MESSAGE_ARRAY.join('\n'),
    });
  }
}

2. レポート出力(開始日・終了日を指定する方式)

スクリプト内容:指定した開始日~終了日のキャンペーンレポートを作成し、メールまたはSlackで通知します。
※検索広告のアカウント、ディスプレイ広告のアカウント両方でお使いいただけます(内部で自動判定しています)

/*このソースコードは MIT License のもとで提供されています。
https://ads-developers.yahoo.co.jp/ja/ads-script/post/30418913.html
■スクリプト内容
スクリプトを設定したアカウントの指定した期間のキャンペーンレポートを出力し、メール/Slack通知します。
■利用方法
1.当スクリプトを、検索広告またはディスプレイ広告のアカウントに設定してください。
2.定数を以下のように設定してください。
3.実行頻度を1日1回(時間は任意)に設定してください。
■定数
・SPREAD_SHEET_ID   //スプレットシートIDを指定
・SHEET_NAME        //出力シート名
・START_DATE        //レポートの抽出期間開始日 ※YYYMMDD形式。両側のシングルクオーテーション(')は消さないでください。
・END_DATE          //レポートの抽出期間終了日 ※YYYMMDD形式。両側のシングルクオーテーション(')は消さないでください。
・REPORT_TYPE       //レポート種別。初期値は「キャンペーンレポート(CAMPAIGN)」。
                      変更したい場合は、DeveloperCenterの「基本のレポート(https://ads-developers.yahoo.co.jp/ja/ads-script/post/30418910.html)」
                      ページをご覧ください。
・REPORT_FIELDS     //レポート出力項目。
                      変更したい場合は、DeveloperCenterの「基本のレポート(https://ads-developers.yahoo.co.jp/ja/ads-script/post/30418910.html)」
                      ページをご覧ください。
・FLAG_MAIL         //結果をメール送信するならtrue、しないならfalse
・MAIL_TO           //メール送信先のYahoo! BusinessID
・MAIL_TITLE        //メールタイトル
・FLAG_SLACK        //結果をSlack送信するならtrue、しないならfalse
・URL_FETCH_APP     //SlackのWebhook URL
 */
//設定が必要な定数(設定しないとエラーになります)
const SPREAD_SHEET_ID = 'SPREAD_SHEET_ID';
const SHEET_NAME = 'SHEET_NAME'
//レポート定義用定数(必要に応じて変更してください)
const START_DATE = '20241201';//※YYYMMDD形式
const END_DATE = '20241231';//※YYYMMDD形式
const REPORT_TYPE = 'CAMPAIGN';
const REPORT_FIELDS = ['ACCOUNT_NAME', 'CAMPAIGN_NAME', 'IMPS', 'CLICKS', 'COST', 'CONVERSIONS'];
//設定が任意の定数(必要に応じて設定してください)
const FLAG_MAIL = false;
const MAIL_TO = ['Yahoo! JAPAN Business ID'];
let MAIL_TITLE = 'レポート出力';
const FLAG_SLACK = false;
const URL_FETCH_APP = 'SLACK_WEBHOOK_URL';
//設定が不要な定数(変更するとエラーになります)
const accountId = AdsUtilities.getCurrentAccountId();
const productType = AdsUtilities.getProductType();
const SPREAD_SHEET_URL = 'https://docs.google.com/spreadsheets/d/' + SPREAD_SHEET_ID;
let TEXT_MESSAGE_ARRAY = [];
function main() {
  try {
    const ss = validateAndGetSpreadsheet();
    const sh = validateAndGetSheet(ss);
    sh.clear();
    const reportData = getReport();
    sh.getRange('A1').setValues(reportData);
    const dataCnt = reportData.length - 1;//ヘッダ分を抜く
    logAndMessage('レポートデータを' + dataCnt + '件出力しました。\nスプレッドシート:' + SPREAD_SHEET_URL);
  } catch (error) {
    MAIL_TITLE = '!!エラー発生!!' + MAIL_TITLE;
    logAndMessage('!!エラーが発生しました!!詳細は管理画面のログをご確認ください。' + error);
  } finally {
    sendMailAndSlack();
  }
}
function getReport() {
  let reportData = [];
  const operand = {
    accountId: accountId,
    fields: REPORT_FIELDS,
    reportDateRangeType: 'CUSTOM_DATE',
    dateRange: {
      startDate: START_DATE,
      endDate: END_DATE
    },
    reportSkipColumnHeader: 'FALSE',
    reportName:'20250130ウェビナースクリプト2'
  };
  if (productType == 'SEARCH') {
    operand.reportType = REPORT_TYPE ;
    reportData = AdsUtilities.getSearchReport(operand).reports[0].rows;
  } else if (productType == 'DISPLAY') {
    reportData = AdsUtilities.getDisplayReport(operand).reports[0].rows;
  } else {
    throw new Error('このスクリプトはMCCアカウントでは実行できません');
  }
  return reportData;
}
function sendMailAndSlack() {
  validateAndSendMail();
  validateAndSendSlack();
}
function logAndMessage(text) {
  Logger.log(text);
  TEXT_MESSAGE_ARRAY.push(text);
}
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;
}
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'),
      }),
    });
  }
}
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を設定してください。メール送信前までに実行された処理は完了しています。');
    }
    MailApp.sendEmail({
      to: MAIL_TO,
      subject: '【アカウントID:' + accountId + '】' + MAIL_TITLE,
      body: TEXT_MESSAGE_ARRAY.join('\n'),
    });
  }
}

3. 自分でカスタマイズしたい人向けのご案内

基本のレポート
 レポート種別や、項目の変更方法について記載されています。
レポートのフィルター・並べ替え
 フィルターや並べ替えの設定方法について記載されています。