LINEヤフー広告スクリプト入門|仕様・書き方・Google広告との違い

この記事でわかること

  • LINEヤフー広告スクリプトは、キャンペーン設定やレポート出力を自動化できるJavaScript機能です。
  • 実行時間は10分が上限で、Google広告スクリプトより短く設計されています。
  • 大量データの処理は複数スクリプトに分割し、URLリクエストは10回以内で実装します。

生成AIによる要約

目次開く閉じる

LINEヤフー広告にもスクリプト機能がある

広告運用の自動化というとGoogle広告スクリプトが話題になりがちですが、LINEヤフー広告にも同等の機能が用意されています。2023年2月に提供が始まり、その後もランタイムの更新が続いている正式な機能です。

広告管理ツール上でJavaScriptを記述し、キャンペーンの設定変更やレポートの出力を自動化できます。検索広告とディスプレイ広告のどちらにも対応しています。

正式名称は「LINEヤフー広告 スクリプト」です。2026年6月の告知から、公式の表記が「Yahoo!広告 スクリプト」から変更されました。本記事では以降、読みやすさのため「LINEヤフー広告スクリプト」と表記します。

この記事では、実務で使いはじめるために必要な仕様と書き方を整理します。Google広告スクリプトを使った経験がある方は、構文の違いに注意しながら読み進めてください。

Google広告スクリプトとの主な違い

両者は目的こそ同じですが、設計思想が異なります。Google広告のコードをそのまま持ち込むことはできません。

観点LINEヤフー広告スクリプトGoogle広告スクリプト
実行時間の上限10分30分
構文の方式機能別のServiceを直接呼ぶAdsAppからメソッドをつなぐ
条件の指定オブジェクトで渡す文字列の条件式で渡す
独自機能天気データの取得に対応該当なし

実行時間の上限が10分と短い

影響がもっとも大きい違いが実行時間です。LINEヤフー広告スクリプトの上限は10分で、Google広告スクリプトの30分より短く設定されています。

上限を超えるとタイムアウトエラーとなり、処理はそこで中断します。大量のエンティティを一度に扱う処理は、最初から分割を前提に設計しましょう。

分割の方法はいくつかあります。処理対象を campaignIds で区切って複数のスクリプトに割り振る、レポートの取得とスプレッドシートへの書き出しを別のスクリプトに分ける、キャンペーン単位でスクリプトを分けて実行時刻をずらす、といった進め方が現実的です。

構文は機能別のServiceを呼ぶ方式

Google広告スクリプトは AdsApp.campaigns().withCondition("Status = ENABLED") のように、1つの起点からメソッドをつないでいきます。

LINEヤフー広告スクリプトは、Search.CampaignService や Display.AdGroupService のように、機能ごとに用意されたServiceを直接呼び出します。条件は文字列ではなくオブジェクトで渡します。

// Google広告スクリプトの書き方(比較用)
const campaigns = AdsApp.campaigns()
  .withCondition('Status = ENABLED')
  .get();

// LINEヤフー広告スクリプトの書き方
const campaigns = Search.CampaignService.get({
  accountId: accountId,
  numberResults: 10000,
}).rval;

APIをそのまま呼び出す感覚に近い設計です。LINEヤフー広告APIを触ったことがある方であれば、こちらのほうが馴染みやすいかもしれません。

天気データを扱える

WeatherApp は、LINEヤフー広告スクリプトにしかない機能です。地域名を指定して、その日または翌日の気温や天候を取得できます。

気温によって配信を切り替える運用や、天候に応じた予算配分の自動化に使えます。飲料、アパレル、レジャー、デリバリーなど、需要が天候に左右される業種で活用の余地があります。

使いはじめる前に押さえる仕様

公式ドキュメントの「仕様について」に、制限値が明記されています。設計の前に目を通しておきましょう。

項目上限
最大処理時間10分
URLリクエスト回数10回
URLリクエスト・レスポンスサイズ各5MB
出力可能なログ量100KB
スクリプトの容量5MB
取り扱えるファイルサイズ20MB
メール送信回数5回
メール本文・件名のサイズ本文1MB/件名10KB
メールの宛先数TO・CCそれぞれ10件
天気取得関数の実行回数100回
実行履歴の保持期間6か月
保存できるスクリプト数1アカウントあたり100件

URLリクエストが10回までという制限は、外部サービスとの連携を設計するうえで効いてきます。エンティティごとに通知を飛ばす作りにすると、すぐ上限に達します。

通知はまとめて1回で送る、あるいは要約だけを送る設計にしましょう。

運用メモ ログの上限100KBは、Google広告スクリプトと同じです。デバッグ目的で全件をログに出すと、肝心のエラーメッセージが切り捨てられます。件数の多い処理では、集計結果だけを出力する習慣をつけておくと安全です。

導入手順

スクリプトの作成画面を開く

広告管理ツールの「ツール」から「LINEヤフー広告 スクリプト」を選び、「新規作成」に進みます。メニュー名は名称変更に伴って更新されているため、「Yahoo!広告 スクリプト」で探すと見つからない場合があります。

権限を確認する

スクリプトの保存や実行には、管理権限または更新権限が必要です。参照権限だけのユーザーは、保存も実行もできません。

操作管理・更新権限参照権限
スクリプトの保存可不可
実行頻度の設定可不可
実行・停止可不可
有効化・無効化の切り替え可不可

認証はビジネスID単位で管理されます。担当者の権限が変更されたり、認証が手動で解除されたりすると認証エラーが発生し、再承認が必要になります。

担当者の異動時は、稼働中のスクリプトの認証状態をあわせて確認しましょう。

実行頻度を設定する

スクリプト一覧の「実行頻度」から、任意の頻度を選んで保存します。設定した時刻ちょうどに実行されるとは限らず、混雑状況によって遅れることがあります。

日次のレポート出力であれば、後続の業務に余裕を持たせた時刻に設定しておくと安心です。

初回の動作を確認する

スケジュールに載せる前に、手動で1回実行して動きを確かめます。想定どおりに動いたかどうかは、ログと実行履歴で確認できます。

実行履歴は6か月間、1アカウントにつき200件まで保持されます。件数の多いスクリプトを複数動かしていると、古い履歴から参照できなくなる点に注意してください。

基本の書き方

公式のサンプルコードは const と let を使い、セミコロンを付ける記法で統一されています。ここでもその記法にそろえます。

運用メモ 1つのスクリプトに複数の関数を定義した場合、どれが実行対象になるかについては公式ドキュメントに記載がありません。Google広告スクリプトの main() にあたる決まりがあるかどうかは、スクリプトの編集画面で確認してください。最初は関数を1つだけ定義した状態で動作を確かめると確実です。

キャンペーンを取得する

まずは基本形です。AdsUtilities.getCurrentAccountId() で対象アカウントのIDを取得し、Serviceに渡します。

/**
 * 配信中のキャンペーンを取得し、名前と予算をログに出力する。
 */
function listCampaigns() {
  const accountId = AdsUtilities.getCurrentAccountId();

  const campaigns = Search.CampaignService.get({
    accountId: accountId,
    numberResults: 10000,
  }).rval;

  for (const campaign of campaigns) {
    Logger.log(campaign.campaignName + ' / ' + campaign.campaignId);
  }

  Logger.log('取得したキャンペーン数: ' + campaigns.length);
}

取得件数は numberResults で指定します。IDを指定して絞り込む場合は campaignIds を、配信状態で絞り込む場合は userStatuses を渡します。

条件を文字列で組み立てる必要がないため、動的な絞り込みを実装しやすい設計です。

運用メモ 各Serviceが受け取れるプロパティは、Developer Centerのリファレンスに一覧があります。accountId のほかに campaignIds adGroupIds userStatuses labelIds createdDateRange などが用意されており、扱うエンティティによって異なります。

レポートを取得する

レポートは AdsUtilities.getSearchReport() で取得します。取得したい項目を fields に配列で指定する形式です。

/**
 * 今月のキャンペーン別実績を取得してログに出力する。
 */
function getCampaignReport() {
  const accountId = AdsUtilities.getCurrentAccountId();

  const rows = AdsUtilities.getSearchReport({
    accountId: accountId,
    fields: ['CAMPAIGN_NAME', 'IMPS', 'CLICKS', 'COST', 'CONVERSIONS'],
    reportDateRangeType: 'THIS_MONTH',
    reportType: 'CAMPAIGN',
    reportSkipColumnHeader: 'FALSE',
  }).reports[0].rows;

  Logger.log('ヘッダーを含む行数: ' + rows.length);
  return rows;
}

reportDateRangeType には THIS_MONTH のような定義済みの期間を指定できます。任意の期間を扱う場合は CUSTOM_DATE を指定し、dateRange に startDate と endDate をyyyyMMdd形式で渡します。

const rows = AdsUtilities.getSearchReport({
  accountId: accountId,
  dateRange: { startDate: '20260801', endDate: '20260827' },
  fields: ['ACCOUNT_ID', 'IMPS', 'CLICKS', 'COST'],
  reportDateRangeType: 'CUSTOM_DATE',
  reportType: 'ACCOUNT',
}).reports[0].rows;

reportSkipColumnHeader を FALSE にすると、1行目に項目名が入ります。そのままスプレッドシートに書き出す場合は、この指定が便利です。

スプレッドシートに書き出す

レポートを自動で共有するなら、Googleスプレッドシートへの出力が実用的です。SpreadsheetApp の使い方は、Google Apps Scriptとほぼ同じです。

/**
 * 今月のキャンペーン別実績をスプレッドシートに書き出す。
 */
function reportToSpreadsheet() {
  const SPREADSHEET_ID = 'スプレッドシートのID';
  const SHEET_NAME = 'シート1';

  const accountId = AdsUtilities.getCurrentAccountId();

  const rows = AdsUtilities.getSearchReport({
    accountId: accountId,
    fields: ['ACCOUNT_NAME', 'CAMPAIGN_NAME', 'IMPS', 'CLICKS', 'COST', 'CONVERSIONS'],
    reportDateRangeType: 'THIS_MONTH',
    reportType: 'CAMPAIGN',
    reportSkipColumnHeader: 'FALSE',
  }).reports[0].rows;

  if (rows.length === 0) {
    Logger.log('レポートの行がないため書き出しを中止します。');
    return;
  }

  const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
  const sheet = spreadsheet.getSheetByName(SHEET_NAME);

  sheet.clear();
  sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);

  Logger.log('書き出した行数: ' + rows.length);
}

setValues() は、指定した範囲の行数と列数がデータと一致していないとエラーになります。getRange('A1') のように1セルだけを指定すると、複数行のデータを渡した時点で処理が止まります。行数と列数を明示して範囲を取るのが安全です。

clear() で既存の内容を消してから書き込むことで、実行のたびに最新の状態へ置き換わります。履歴を残したい場合は、日付ごとにシートを分ける実装に変更します。

スプレッドシートのIDは、URLの /d/ と /edit に挟まれた文字列です。

通知を実装する

メールで送る

MailApp.sendEmail() でメールを送信できます。送信先は自社のビジネスIDに紐づく宛先に限られる点に注意してください。

/**
 * 指定した宛先に実行結果を通知する。
 * @param {string} body メール本文
 */
function sendReportMail(body) {
  MailApp.sendEmail({
    to: ['宛先のビジネスID'],
    subject: 'LINEヤフー広告 日次レポート',
    body: body,
  });
}

送信回数は1回の実行につき5回までです。エンティティごとにメールを送る設計にはできないため、内容をまとめて1通で送ります。

Slackなどに通知する

外部サービスへの通知は UrlFetchApp で実装します。公式のサンプルにもSlackへの送信例が掲載されています。

/**
 * 予算の進捗を確認し、閾値を超えていればSlackに通知する。
 */
function checkBudgetPaceAndNotify() {
  const MONTHLY_BUDGET = 1000000;
  const THRESHOLD = 0.9;

  const accountId = AdsUtilities.getCurrentAccountId();

  const rows = AdsUtilities.getSearchReport({
    accountId: accountId,
    fields: ['ACCOUNT_NAME', 'COST'],
    reportDateRangeType: 'THIS_MONTH',
    reportType: 'ACCOUNT',
    reportSkipColumnHeader: 'TRUE',
  }).reports[0].rows;

  if (rows.length === 0) {
    Logger.log('レポートを取得できませんでした。');
    return;
  }

  const accountName = rows[0][0];
  const cost = Number(rows[0][1]);
  const ratio = cost / MONTHLY_BUDGET;

  Logger.log('予算進捗率: ' + Math.round(ratio * 100) + '%');

  if (ratio >= THRESHOLD) {
    notifySlack(
      accountName + ' の広告費が月間上限の' +
      Math.round(ratio * 100) + '%に達しました。'
    );
  }
}

/**
 * Slackの Incoming Webhook にメッセージを送信する。
 * @param {string} text 送信するテキスト
 */
function notifySlack(text) {
  const WEBHOOK_URL = 'https://hooks.slack.com/services/xxxxx/xxxxx/xxxxx';

  const response = UrlFetchApp.fetch(WEBHOOK_URL, {
    method: 'POST',
    contentType: 'application/json',
    payload: JSON.stringify({ text: text }),
    muteHttpExceptions: true,
  });

  if (response.getResponseCode() !== 200) {
    Logger.log('通知に失敗しました: ' + response.getContentText());
  }
}

payload にはオブジェクトではなく、JSON.stringify() で文字列に変換したものを渡します。オブジェクトのまま渡すとフォーム形式で送信され、JSONを受け取る前提のWebhookでは失敗します。

URLリクエストは10回までです。ループの中で通知を呼び出す実装は避け、条件に合致したものをまとめてから1回で送りましょう。

URLリクエスト10回の制限に収める設計上限に達しやすい書き方対象ごとにループの中で通知するキャンペーン20件 = リクエスト20回11件目でエラーになる推奨する書き方対象を配列にためて最後に1回送るキャンペーン20件 = リクエスト1回件数が増えても上限に届かないメール送信5回、天気取得100回にも同じ考え方が当てはまる外部との通信回数は、処理件数ではなく実行回数に比例させる設計にする

天気連動という独自の使いどころ

WeatherApp は地域名を指定して天気情報を取得します。取得できるのは当日、翌日、またはその両方です。

/**
 * 指定地域の日中の気温を取得する。
 * @param {string} areaName 地域名(例: 東京都 港区)
 * @return {number} 12時台の気温
 */
function getNoonTemperature(areaName) {
  const weather = WeatherApp.getWeatherByName(areaName, 'TODAY');
  const hourly = weather[0].hour[12];

  Logger.log(areaName + ' の気温: ' + hourly.temp + '度');
  return hourly.temp;
}

データは時間別、3時間別、日別の階層で持っています。用途に応じて参照する粒度を選べます。

気温が一定を超えた日だけ特定のキャンペーンを配信する、といった運用に応用できます。天気取得関数の実行は100回までのため、地域を絞って呼び出す設計にしましょう。

運用メモ 天候連動は魅力的な使い方ですが、効果を測るには比較の設計が欠かせません。連動させた期間と通常配信の期間で成果を比べられるよう、記録を残しながら進めることをおすすめします。

ランタイムの更新に追随する

LINEヤフー広告スクリプトには、ランタイムというバージョンの概念があります。新しいランタイムがリリースされると、一定期間の後に旧バージョンが終了します。

2026年8月時点の最新は V202607 です。2026年7月22日にリリースされ、旧バージョンは同年8月26日に終了しています。

バージョンリリース日直前バージョンの提供終了日
V2025102025年10月16日2025年11月5日
V2026022026年2月26日2026年3月10日
V2026072026年7月22日2026年8月26日

V202607では、検索広告で3点の対応が加わりました。AIキーワード拡張機能への対応、レスポンシブ検索広告の審査状況の表示改善、そして広告表示アセットの自動化への対応です。

ディスプレイ広告では、サーチキーワードターゲティングのレポート項目が削除され、アプリコンバージョン関連の項目が追加されています。

レポートの項目が削除されると、それを参照していたスクリプトはエラーになります。ランタイムの告知は定期的に確認しましょう。

Googleドライブ連携の権限変更

Googleドライブ上のファイルを読み取るスクリプトについては、2025年9月にアクセス権限の変更が告知されました。告知では、新しい権限への切り替えを2026年1月8日に実施すると案内されています。

修正の対象となったのは、DriveApp の読み取り系の関数を使うスクリプトです。対応しなかったスクリプトは、切り替え後にエラーとなります。

これから新しく連携を設定する場合は、初回のセットアップで新しいアクセス権限への同意を求められます。同意はビジネスID単位で管理され、一度承認すればそのIDが持つスクリプト全体に反映されます。

どこまでスクリプトで自動化するか

実行時間10分、URLリクエスト10回という制限は、Google広告スクリプトより厳しめです。大規模な処理や他システムとの深い連携には向きにくい構造といえます。

判断の目安を整理します。

やりたいこと適した手段
定型レポートの自動出力スクリプト
閾値を超えたときの通知スクリプト
天候や外部データに応じた配信制御スクリプト
複数媒体を横断した集計Google Apps Scriptと各媒体のAPI
大量の入稿や日次のデータ基盤連携LINEヤフー広告API

複数の媒体をまたいだ集計や、BigQueryへのデータ蓄積を行う場合は、スクリプト単体ではなくAPIとの組み合わせを検討します。実装の進め方はMeta広告・Yahoo!広告のデータをBigQueryに取り込む|API×GASで自動連携を実装するで解説しています。

まとめ

LINEヤフー広告スクリプトは、広告管理ツール上でJavaScriptを実行し、レポート出力や設定変更を自動化できる機能です。検索広告とディスプレイ広告の両方に対応しています。

Google広告スクリプトとの最大の違いは、実行時間の上限が10分と短いこと、そして機能別のServiceを直接呼び出す構文であることです。Google広告向けのコードは、そのままでは動きません。

URLリクエスト10回、メール送信5回といった制限は、通知の設計に直接影響します。処理件数が増えても通信回数が増えない構造にしておくと、運用が安定します。

まずはレポートのスプレッドシート出力から始めるのが取り組みやすい進め方です。動作を確認できたら、閾値を超えたときの通知を足していきましょう。

なお、天気データを扱える点はGoogle広告スクリプトにはない特徴です。需要が天候に左右される商材であれば、試してみる価値があります。

関連記事

この記事をシェア

参照元

この記事をAIと深掘りする

要約・疑問の解消に。記事のタイトル・URL・参照元を入れた質問文が自動で入力されます。

ryottaman

ryottaman

広告代理店で17年、現在は事業会社でインハウスマーケティングを担当しています。

SIGNALZの記事はAIを活用して作成し、10年以上の運用型広告の実務経験をもとに内容を確認・監修しています。制作方針の詳細はサイトについてをご覧ください。

この記事について感想やご質問を送れます

誤りの指摘、補足情報、ご質問など、お気軽にどうぞ。

Google検索の優先ソースにSIGNALZを追加

追加すると、Google検索のトップニュースでSIGNALZの記事が見つけやすくなります。AIモードとAIによる概要でも「優先」バッジが付きます。設定はいつでも解除できます。

追加する