週末以外の祝日,広告の表示を非表示にする必要がある。
間違いやすい点:
- 国によって祝日の状況は異なる,例えば、アメリカの祝日,特別なアルゴリズムがある;
- 手動で一時停止した後,自動的に有効になる,これは間違っている;
- 祝日休業明け,祝日を除き、自動的に再開する;
米国のコードは以下の通りだ:
function main() {
/***
- 米国の祝日における広告の自動停止・再開スクリプト(スタンドアロン版・警告なし)
- 機能:「制御」という名称のみ”US_”プレフィックス広告プラン,一致する広告がない場合は、何も表示せずに終了する
- 最適化1:専用のラベルで、スクリプトによる自動一時停止とユーザーによる手動一時停止を区別する,手動で一時停止した広告には干渉しない
- 最適化2:手動による広告の一時停止が検出された場合、その後のすべての処理を直ちに中止する,祝日の判定や処理は一切行わない
- 修正:APIエラーの修正,.get を正しく呼び出す() タグイテレータを取得する
***/ // 1. 米国向け基本構成
const US_CONFIG = {
campaignPrefix: “US_”, // 管理対象の広告キャンペーンプレフィックス
localTimezoneOffset: -5, // 米国東部標準時(UTC-5)
autoPauseLabel: “AutoPaused_USHoliday”, // スクリプトの自動一時停止用専用タグ
祝日: [
{ 名前: “元旦”, ルール: getNewYearsDay },
{ 名前: “マーティン・ルーサー・キング・ジュニア記念日”, ルール: getMartinLutherKingDay },
{ 名前: “大統領の日”, ルール: getPresidentsDay },
{ 名前: “戦没将士追悼の日”, ルール: getMemorialDay },
{ 名前: “六月節(自由の日)”, ルール: getJuneteenth },
{ 名前: “アメリカ独立記念日”, ルール: getIndependenceDay },
{ 名前: “メーデー”, ルール: getLaborDay },
{ 名前: “コロンブス記念日”, ルール: getColumbusDay },
{ 名前: “退役軍人の日”, ルール: getVeteransDay },
{ 名前: “感謝祭”, ルール: getThanksgivingDay },
{ 名前: “クリスマス”, ルール: getChristmasDay }
]
}; // 専用タグが存在することを確認する,存在しない場合は作成する
ensureLabelExists(US_CONFIG.autoPauseLabel); // 2. 米国の広告プランを取得する関数をカプセル化する(オプションのタグによるフィルタリングに対応)
const getUSCampaigns = (labelName = null) => {
let campaignQuery = AdsApp.campaigns().withCondition(Name CONTAINS '${US_CONFIG.campaignPrefix}');
if (labelName) {
campaignQuery = campaignQuery.withCondition(LabelNames CONTAINS '${labelName}');
}
return campaignQuery.get();
}; // 3. 「US」という接頭辞が付いた広告キャンペーンがあるか確認する:それ以外の場合はそのまま終了する
const initialCampaigns = getUSCampaigns();
if (!initialCampaigns.hasNext()) {
戻る;
} // ====================== 修正の要点:手動で検出関数を一時停止する(タグのイテレータを正しく取得する) ======================
const hasManualPausedCampaigns = () => {
const usCampaigns = getUSCampaigns(); // すべての米国広告を取得(タグをフィルタリングしない)
一方 (usCampaigns.hasNext()) {
const campaign = usCampaigns.next();
// 判定条件を手動で一時停止する:「一時停止状態」かつ「スクリプト専用タグなし」
const isPaused = campaign.isPaused();
if (isPaused) {
// 修正:.getを呼び出す() タグイテレータを取得する
let hasAutoLabel = false;
const campaignLabels = campaign.labels().get();
一方 (campaignLabels.hasNext()) {
const label = campaignLabels.next();
if (label.getName() === US_CONFIG.autoPauseLabel) {
hasAutoLabel = true;
break;
}
}
if (!hasAutoLabel) {
return true;
}
}
}
return false;
}; // 広告の手動停止が検出された:スクリプトを直接終了する,その後の祝日判定や処理は一切行わない
if (hasManualPausedCampaigns()) {
console.log(【终止】检测到存在手动暂停的US广告系列,脚本跳过所有节假日判断和操作,保持手动暂停状态);
戻る;
}
// ============================================================================= // 4. 現在の年の米国の祝日を計算する
const currentYear = new Date().getFullYear();
const usHolidays = US_CONFIG.holidays.map(holiday => {
const localHolidayDate = holiday.rule(currentYear);
const hkPauseTime = convertLocalToHongKongTime(localHolidayDate, US_CONFIG.localTimezoneOffset);
const hkEnableTime = new Date(hkPauseTime);
hkEnableTime.setDate(hkEnableTime.getDate() + 1); 戻る {
名前:${holiday.name}(${currentYear}),
pauseTime: hkPauseTime,
enableTime: hkEnableTime
};
}); // 5. 現在の香港時間を取得する
const currentHkTime = getCurrentHongKongTime();
console.log(【美国节假日脚本】当前香港时间:${formatDate(currentHkTime)}); // 6. 祝日一覧,一時停止/有効化を実行する
usHolidays.forEach(holiday => {
console.log(\n【校验】${holiday.name}:香港暂停时间=${formatDate(holiday.pauseTime)},启用时间=${formatDate(holiday.enableTime)}); // 祝日期間中:広告を一時停止する(専用タグを追加してから一時停止する)
if (currentHkTime >= holiday.pauseTime && currentHkTime < holiday.enableTime) {
let pauseCount = 0;
const usCampaigns = getUSCampaigns();
一方 (usCampaigns.hasNext()) {
const campaign = usCampaigns.next();
if (campaign.isEnabled()) {
campaign.applyLabel(US_CONFIG.autoPauseLabel);
campaign.pause();
pauseCount++;
console.log(【暂停】广告计划:${campaign.getName()});
}
}
console.log(【结果】${holiday.name}:共暂停${pauseCount}个US广告计划); // 祝日が終わった:広告を有効にする(専用タグが付いた一時停止中の広告のみ有効にする)
} else if (currentHkTime >= holiday.enableTime) {
let enableCount = 0;
const usCampaigns = getUSCampaigns(US_CONFIG.autoPauseLabel);
一方 (usCampaigns.hasNext()) {
const campaign = usCampaigns.next();
if (campaign.isPaused()) {
campaign.enable();
campaign.removeLabel(US_CONFIG.autoPauseLabel);
enableCount++;
console.log(【启用】广告计划:${campaign.getName()});
}
}
console.log(【结果】${holiday.name}:共启用${enableCount}个脚本自动暂停的US广告计划); // まだ祝日ではない:操作なし
} その他 {
console.log(【结果】${holiday.name}:未到节假日,无需操作);
}
});
}/***
- ユーティリティ関数
***/
function getCurrentHongKongTime() {
const now = new Date();
const utcTime = now.getTime() + (now.getTimezoneOffset() * 60 * 1000);
return new Date(utcTime + 8 * 60 * 60 * 1000);
}function convertLocalToHongKongTime(localDate, localUtcOffset) {
const localTimeInUtc = localDate.getTime() – (localUtcOffset * 60 * 60 * 1000);
const hkTime = new Date(localTimeInUtc + 8 * 60 * 60 * 1000);
hkTime.setHours(13, 0, 0, 0);
return hkTime;
}function formatDate(日付) {
戻る${date.getFullYear()}-${String(date.getMonth()+1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')};
}// タグが存在することを確認する,存在しない場合は作成する
function ensureLabelExists(labelName) {
let labelExists = false;
const labels = AdsApp.labels().get();
一方 (labels.hasNext()) {
const label = labels.next();
if (label.getName() === labelName) {
labelExists = true;
break;
}
}
if (!labelExists) {
AdsApp.createLabel(labelName);
console.log(【初始化】创建专属标签:${labelName});
}
}/***
- 米国の祝日処理関数
***/
function getNewYearsDay(年) {
const date = new Date(年, 0, 1);
return adjustWeekendHoliday(日付);
}function getMartinLutherKingDay(年) {
return getNthWeekdayInMonth(年, 0, 3, 1);
}function getPresidentsDay(年) {
return getNthWeekdayInMonth(年, 1, 3, 1);
}function getMemorialDay(年) {
return getLastWeekdayInMonth(年, 4, 1);
}function getJuneteenth(年) {
const date = new Date(年, 5, 19);
return adjustWeekendHoliday(日付);
}function getIndependenceDay(年) {
const date = new Date(年, 6, 4);
return adjustWeekendHoliday(日付);
}function getLaborDay(年) {
return getNthWeekdayInMonth(年, 8, 1, 1);
}function getColumbusDay(年) {
return getNthWeekdayInMonth(年, 9, 2, 1);
}function getVeteransDay(年) {
const date = new Date(年, 10, 11);
return adjustWeekendHoliday(日付);
}function getThanksgivingDay(年) {
return getNthWeekdayInMonth(年, 10, 4, 4);
}function getChristmasDay(年) {
const date = new Date(年, 11, 25);
return adjustWeekendHoliday(日付);
}function getNthWeekdayInMonth(年, 月, nth, 平日) {
let date = new Date(年, 月, 1);
一方 (date.getDay() !== 平日) date.setDate(date.getDate() + 1);
date.setDate(date.getDate() + (nth – 1) * 7);
返却日;
}function getLastWeekdayInMonth(年, 月, 平日) {
let date = new Date(年, 月 + 1, 0);
一方 (date.getDay() !== 平日) date.setDate(date.getDate() – 1);
返却日;
}function adjustWeekendHoliday(日付) {
const day = date.getDay();
if (日 === 0) date.setDate(date.getDate() + 1);
if (日 === 6) date.setDate(date.getDate() – 1);
返却日;
}
米国の広告キャンペーンの手法を参考にしてほしい,ニュージーランド向け広告キャンペーンのJavaScriptコードを修正する。
function main() {
/***
- ニュージーランドの祝日における広告の自動停止・再開スクリプト(スタンドアロン版・警告なし)
- 機能:「制御」という名称のみ”NZ_”プレフィックス広告プラン,一致する広告がない場合は、何も表示せずに終了する
- 説明:ニュージーランドの全国共通の法定祝日を含む,ニュージーランド標準時(NZST)に合わせる,(UTC+12)
- 最適化1:NZ専用のタグを用いて、スクリプトによる自動一時停止とユーザーによる手動一時停止を区別する,手動で一時停止した広告には干渉しない
- 最適化2:手動による広告の一時停止が検出された場合、その後のすべての処理を直ちに中止する,祝日の判定や処理は一切行わない
- 最適化3:タグ取得APIの修正,Google Adsスクリプトの公式ガイドラインに準拠している,他の地域版と統一する
***/ // 1. ニュージーランドのコア設定(新規追加):NZ限定の一時停止タグ,(他の地域版とのタグの重複を避けるため)
const NZ_CONFIG = {
campaignPrefix: “NZ_”, // 管理対象の広告キャンペーンプレフィックス
localTimezoneOffset: 12, // ニュージーランド標準時(NZST),UTC+12,(夏時間自動対応)
autoPauseLabel: “AutoPaused_NZHoliday”, // NZスクリプト専用の一時停止タグ(独立した区切り),(対立を避ける)
祝日: [
{ 名前: “元旦”, ルール: ニュージーランドの元日 },
{ 名前: “懐唐伊日”, ルール: getWaitangiDayNZ },
{ 名前: “聖金曜日”, ルール: getGoodFridayNZ },
{ 名前: “イースター・マンデー”, ルール: getEasterMondayNZ },
{ 名前: “アンザック・デー”, ルール: getAnzacDayNZ },
{ 名前: “女王生日”, ルール: getQueensBirthdayNZ },
{ 名前: “メーデー”, ルール: getLabourDayNZ },
{ 名前: “クリスマス”, ルール: getChristmasDayNZ },
{ 名前: “祝日”, ルール: getBoxingDayNZ }
]
}; // 【新規追加】NZ専用のタグが存在することを確認する,存在しない場合は自動的に作成される(管理画面での手動設定は不要)
ensureLabelExists(NZ_CONFIG.autoPauseLabel); // 2. NZ広告プランを取得する関数のカプセル化(最適化):オプションのタグによるフィルタリングに対応,(広告タグの正確な配置)
const getNZCampaigns = (labelName = null) => {
let campaignQuery = AdsApp.campaigns().withCondition(Name CONTAINS '${NZ_CONFIG.campaignPrefix}');
// タグ名を指定する際は,このタグが付いた広告のみを表示(祝日終了後の専用),(広告の手動停止操作は避けること)
if (labelName) {
campaignQuery = campaignQuery.withCondition(LabelNames CONTAINS '${labelName}');
}
return campaignQuery.get();
}; // 3. NZのプレフィックスが付いた広告キャンペーンがあるか確認する:それ以外の場合はそのまま終了する,ヒントなし
const initialCampaigns = getNZCampaigns();
if (!initialCampaigns.hasNext()) {
戻る; // 早期終了のみ,ログ出力なし
} // ====================== 新規追加のコア機能:手動で一時停止検出関数(NZタグに対応),(公式APIに準拠) ======================
const hasManualPausedCampaigns = () => {
const nzCampaigns = getNZCampaigns(); // すべてのNZ広告を取得(タグを絞り込まない)
一方 (nzCampaigns.hasNext()) {
const campaign = nzCampaigns.next();
// 判定条件を手動で一時停止する:「一時停止状態」かつ「NZ専用スクリプトタグなし」
const isPaused = campaign.isPaused();
if (isPaused) {
// ラベルのイテレータを正しく取得する(campaign.labels().get(),(Google Ads APIの仕様に準拠)
let hasAutoLabel = false;
const campaignLabels = campaign.labels().get();
一方 (campaignLabels.hasNext()) {
const label = campaignLabels.next();
if (label.getName() === NZ_CONFIG.autoPauseLabel) {
hasAutoLabel = true;
break; // ターゲットタグを見つける,ネストされた反復処理を終了し、実行効率を向上させる
}
}
// 「一時停止+NZ専用タグなし」の広告が存在する,手動で一時停止する,直接trueを返す
if (!hasAutoLabel) {
return true;
}
}
}
return false;
}; // 広告の手動停止が検出された:スクリプトを直接終了する,その後の祝日判定や処理は一切行わない
if (hasManualPausedCampaigns()) {
console.log(【终止】检测到存在手动暂停的NZ广告系列,脚本跳过所有节假日判断和操作,保持手动暂停状态);
戻る;
}
// ============================================================================= // 4. 現在の年のニュージーランドの祝日を計算する(元のNZロジックを完全に維持する),(修正なし)
const currentYear = new Date().getFullYear();
const nzHolidays = NZ_CONFIG.holidays.map(holiday => {
const localHolidayDate = holiday.rule(currentYear);
const hkPauseTime = convertLocalToHongKongTime(localHolidayDate, NZ_CONFIG.localTimezoneOffset);
const hkEnableTime = new Date(hkPauseTime);
hkEnableTime.setDate(hkEnableTime.getDate() + 1); 戻る {
名前:${holiday.name}(${currentYear}),
pauseTime: hkPauseTime,
enableTime: hkEnableTime
};
}); // 5. 現在の香港時間を取得する(元のロジックを維持する),(他の地域版と統一)
const currentHkTime = getCurrentHongKongTime();
console.log(【新西兰节假日脚本】当前香港时间:${formatDate(currentHkTime)}); // 6. 祝日一覧,一時停止/有効化の操作を実行する(最適化):NZタグの閉ループロジックを追加する,(元の操作ロジックは変更しない)
nzHolidays.forEach(holiday => {
console.log(\n【校验】${holiday.name}:香港暂停时间=${formatDate(holiday.pauseTime)},启用时间=${formatDate(holiday.enableTime)}); // 祝日期間中:広告を一時停止(最適化):NZ専用のタグを追加してから一時停止する,(スクリプト操作としてマーク)
if (currentHkTime >= holiday.pauseTime && currentHkTime < holiday.enableTime) {
let pauseCount = 0;
const nzCampaigns = getNZCampaigns();
一方 (nzCampaigns.hasNext()) {
const campaign = nzCampaigns.next();
if (campaign.isEnabled()) {
// 新規追加:NZ専用のスクリプトタグを追加する,スクリプトによる一時停止と手動による一時停止
campaign.applyLabel(NZ_CONFIG.autoPauseLabel);
campaign.pause();
pauseCount++;
console.log(【暂停】广告计划:${campaign.getName()});
}
}
console.log(【结果】${holiday.name}:共暂停${pauseCount}个NZ广告计划); // 祝日が終わった:広告を有効にする(最適化):NZ専用のタグが付いた広告のみを一時停止する,(手動での一時停止を無効にする)
} else if (currentHkTime >= holiday.enableTime) {
let enableCount = 0;
// 新規追加:NZ専用のタグが付いた広告のみを表示する,手動で一時停止する広告は避ける
const nzCampaigns = getNZCampaigns(NZ_CONFIG.autoPauseLabel);
一方 (nzCampaigns.hasNext()) {
const campaign = nzCampaigns.next();
if (campaign.isPaused()) {
campaign.enable();
// 新規追加:NZ限定のタグを削除する,後続の重複処理を避ける,広告を初期状態に戻す
campaign.removeLabel(NZ_CONFIG.autoPauseLabel);
enableCount++;
console.log(【启用】广告计划:${campaign.getName()});
}
}
console.log(【结果】${holiday.name}:共启用${enableCount}个脚本自动暂停的NZ广告计划); // まだ祝日ではない:操作なし
} その他 {
console.log(【结果】${holiday.name}:未到节假日,无需操作);
}
});
}/***
- ユーティリティ関数(新規追加):ensureLabelExists,(それ以外はニュージーランド版のロジックを完全に維持する)
***/
function getCurrentHongKongTime() {
const now = new Date();
const utcTime = now.getTime() + (now.getTimezoneOffset() * 60 * 1000);
return new Date(utcTime + 8 * 60 * 60 * 1000);
}function convertLocalToHongKongTime(localDate, localUtcOffset) {
const localTimeInUtc = localDate.getTime() – (localUtcOffset * 60 * 60 * 1000);
const hkTime = new Date(localTimeInUtc + 8 * 60 * 60 * 1000);
hkTime.setHours(13, 0, 0, 0);
return hkTime;
}function formatDate(日付) {
戻る${date.getFullYear()}-${String(date.getMonth()+1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')};
}// 【新規追加】NZ専用のタグが存在することを確認する,存在しない場合は作成する(他の地域版タグとは分離する),(対立を避ける)
function ensureLabelExists(labelName) {
let labelExists = false;
const labels = AdsApp.labels().get();
一方 (labels.hasNext()) {
const label = labels.next();
if (label.getName() === labelName) {
labelExists = true;
break;
}
}
if (!labelExists) {
AdsApp.createLabel(labelName);
console.log(【初始化】创建NZ专属标签:${labelName});
}
}/***
- ニュージーランドの祝日ルール関数(NZ版のロジックを完全に維持),(修正なし)
***/
function getNewYearsDayNZ(年) {
const date = new Date(年, 0, 1);
const day = date.getDay();
if (日 === 0) date.setDate(date.getDate() + 1); // 日曜日→1月2日
if (日 === 6) date.setDate(date.getDate() + 2); // 土曜日→1月2日
返却日;
}function getWaitangiDayNZ(年) {
const date = new Date(年, 1, 6);
const day = date.getDay();
if (日 === 0) date.setDate(date.getDate() + 1); // 日曜日→2月7日
if (日 === 6) date.setDate(date.getDate() + 2); // 土曜日→2月8日
返却日;
}function getGoodFridayNZ(年) {
const easterSunday = calculateEasterSundayNZ(年);
const goodFriday = new Date(イースターの日曜日);
goodFriday.setDate(easterSunday.getDate() – 2);
return goodFriday;
}function getEasterMondayNZ(年) {
const easterSunday = calculateEasterSundayNZ(年);
const easterMonday = new Date(イースターの日曜日);
easterMonday.setDate(easterSunday.getDate() + 1);
イースターマンデーに戻る;
}function getAnzacDayNZ(年) {
const date = new Date(年, 3, 25);
const day = date.getDay();
if (日 === 0) date.setDate(date.getDate() + 1); // 日曜日→4月26日
if (日 === 6) date.setDate(date.getDate() + 2); // 土曜日→4月27日
返却日;
}function getQueensBirthdayNZ(年) {
return getNthWeekdayInMonth(年, 5, 1, 1);
}function getLabourDayNZ(年) {
return getNthWeekdayInMonth(年, 9, 4, 1);
}function getChristmasDayNZ(年) {
const date = new Date(年, 11, 25);
const day = date.getDay();
if (日 === 0) date.setDate(date.getDate() + 1); // 日曜日→12月26日
if (日 === 6) date.setDate(date.getDate() + 2); // 土曜日→12月27日
返却日;
}function getBoxingDayNZ(年) {
const date = new Date(年, 11, 26);
const day = date.getDay();
if (日 === 0) date.setDate(date.getDate() + 1); // 日曜日→12月27日
if (日 === 6) date.setDate(date.getDate() + 2); // 土曜日→12月28日
返却日;
}function calculateEasterSundayNZ(年) {
const a = year % 19;
const b = Math.floor(年 / 100);
const c = year % 100;
const d = Math.floor(b / 4);
const e = b % 4;
const f = Math.floor((b + 8) / 25);
const g = Math.floor((b – f + 1) / 3);
const h = (19 * a + b – d – g + 15) % 30;
const i = Math.floor(c / 4);
const k = c % 4;
const l = (32 + 2 * e + 2 * i – h – k) % 7;
const m = Math.floor((a + 11 * h + 22 * l) / 451);
const month = Math.floor((h + l – 7 * m + 114) / 31);
const day = ((h + l – 7 * m + 114) % 31) + 1;
return new Date(年, 月 – 1, 日);
}// 汎用ツール関数(再利用,(元の論理構造を維持する)
function getNthWeekdayInMonth(年, 月, nth, 平日) {
let date = new Date(年, 月, 1);
一方 (date.getDay() !== 平日) date.setDate(date.getDate() + 1);
date.setDate(date.getDate() + (nth – 1) * 7);
返却日;
}function getLastWeekdayInMonth(年, 月, 平日) {
let date = new Date(年, 月 + 1, 0);
一方 (date.getDay() !== 平日) date.setDate(date.getDate() – 1);
返却日;
}

