Праздники, кроме выходных,Нужно скрыть рекламу。
Частые ошибки:
- В каждой стране свои праздники,Например, праздники в США,Есть специальный алгоритм;
- После того, как ты вручную приостановишь,Оно включится у тебя автоматически,Это неправильно;
- После перерыва на праздники,Автоматическое возобновление работы в непраздничные дни;
Код для США::
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}');
если (labelName) {
campaignQuery = campaignQuery.withCondition(LabelNames CONTAINS '${labelName}');
}
return campaignQuery.get();
}; // 3. Проверь, есть ли рекламные кампании с префиксом «US»:Если нет, то просто заканчивай
const initialCampaigns = getUSCampaigns();
если (!initialCampaigns.hasNext()) {
Вернуться;
} // ====================== Основные изменения:Функция ручной приостановки проверки (правильное получение итератора тегов) ======================
const hasManualPausedCampaigns = () => {
const usCampaigns = getUSCampaigns(); // Получить все объявления из США (без фильтрации по тегам)
в то время как (usCampaigns.hasNext()) {
const campaign = usCampaigns.next();
// Условия ручной приостановки:«В режиме паузы» и «Без специальных тегов для скриптов»
const isPaused = campaign.isPaused();
если (isPaused) {
// Исправления:Вызов .get() Получить итератор тегов
let hasAutoLabel = false;
const campaignLabels = campaign.labels().получить();
в то время как (campaignLabels.hasNext()) {
const label = campaignLabels.next();
если (label.getName() === US_CONFIG.autoPauseLabel) {
hasAutoLabel = true;
перерыв;
}
}
если (!hasAutoLabel) {
return true;
}
}
}
return false;
}; // Обнаружена ручная пауза рекламы:Сценарий прямого прекращения,Не выполняй никаких дальнейших проверок на наличие праздников и не предпринимай никаких действий в связи с ними
если (hasManualPausedCampaigns()) {
console.log(【终止】检测到存在手动暂停的US广告系列,脚本跳过所有节假日判断和操作,保持手动暂停状态);
Вернуться;
}
// ============================================================================= // 4. Рассчитай праздничные дни в США в текущем году
const currentYear = new Date().getFullYear();
const usHolidays = US_CONFIG.holidays.map(праздник => {
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(праздник => {
console.log(\n【校验】${holiday.name}:香港暂停时间=${formatDate(holiday.pauseTime)},启用时间=${formatDate(holiday.enableTime)}); // В праздничные дни:Приостановить рекламу (приостановить после добавления специального тега)
если (currentHkTime >= holiday.pauseTime && currentHkTime < holiday.enableTime) {
let pauseCount = 0;
const usCampaigns = getUSCampaigns();
в то время как (usCampaigns.hasNext()) {
const campaign = usCampaigns.next();
если (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();
если (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().получить();
в то время как (labels.hasNext()) {
const label = labels.next();
если (label.getName() === labelName) {
labelExists = true;
перерыв;
}
}
если (!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(год, месяц, n-й, будний день) {
let date = new Date(год, месяц, 1);
в то время как (date.getDay() !== день недели) date.setDate(date.getDate() + 1);
date.setDate(date.getDate() + (n-й – 1) * 7);
дата возврата;
}function getLastWeekdayInMonth(год, месяц, будний день) {
let date = new Date(год, месяц + 1, 0);
в то время как (date.getDay() !== день недели) date.setDate(date.getDate() – 1);
дата возврата;
}function adjustWeekendHoliday(даты) {
const day = date.getDay();
если (день === 0) date.setDate(date.getDate() + 1);
если (день === 6) date.setDate(date.getDate() – 1);
дата возврата;
}
Ориентируйся на практику рекламных кампаний в США,Изменить код JavaScript для рекламной кампании в Новой Зеландии。
function main() {
/***
- Скрипт для автоматической приостановки/возобновления рекламы в праздничные дни в Новой Зеландии (автономная версия · работает тихо, без предупреждений)
- Функции:Укажи только название”NZ_”Рекламная кампания с префиксом,Если подходящих объявлений нет, просто заверши работу
- Описание:Включая общенациональные праздничные дни Новой Зеландии,Настройка на новозеландское стандартное время (NZST),UTC+12)
- Оптимизация 1:Используй специальный тег NZ, чтобы отличать автоматическую паузу скрипта от ручной паузы пользователя,Не вмешиваться в рекламу, приостановленную вручную
- Оптимизация 2:Если обнаружено ручное приостановление рекламы, сразу же прекрати все последующие процессы,Никаких проверок и действий, связанных с праздниками
- Оптимизация 3:API для получения тегов исправлений,Соответствует официальным требованиям к скриптам Google Ads,Сохраняй стиль, как в других региональных версиях
***/ // 1. Основные настройки для Новой Зеландии (добавлено):Эксклюзивный тег приостановки для Новой Зеландии,(Избегай конфликтов с метками других региональных версий)
const NZ_CONFIG = {
campaignPrefix: “NZ_”, // Префикс рекламного плана, который нужно контролировать
localTimezoneOffset: 12, // Новозеландское стандартное время (NZST),UTC+12,(Автоматическая адаптация к летнему времени)
autoPauseLabel: “AutoPaused_NZHoliday”, // Эксклюзивный тег паузы для сценария NZ (отдельное изолированное поле),(Избегай конфликтов)
праздники: [
{ имя: “Новый год”, правило: Новый год },
{ имя: “День Вайтанги”, правило: getWaitangiDayNZ },
{ имя: “Страстная пятница”, правило: getGoodFridayNZ },
{ имя: “Пасхальный понедельник”, правило: getEasterMondayNZ },
{ имя: “День Австралийского и Новозеландского корпуса”, правило: getAnzacDayNZ },
{ имя: “День рождения королевы”, правило: getQueensBirthdayNZ },
{ имя: “День труда”, правило: getLabourDayNZ },
{ имя: “Рождество”, правило: getChristmasDayNZ },
{ имя: “Рождество”, правило: getBoxingDayNZ }
]
}; // 【Добавлено】Убедись, что есть специальный тег для Новой Зеландии,Если не существует, создай автоматически (не нужно настраивать вручную в админке)
ensureLabelExists(NZ_CONFIG.autoPauseLabel); // 2. Оболочка для функции получения рекламного плана NZ (оптимизация):Поддержка фильтрации по тегам,(Реклама с точным таргетингом)
const getNZCampaigns = (labelName = null) => {
let campaignQuery = AdsApp.campaigns().withCondition(Name CONTAINS '${NZ_CONFIG.campaignPrefix}');
// При вводе названия тега,Показывать только объявления с этим тегом (специально после праздников),Избегай ручной приостановки рекламы)
если (labelName) {
campaignQuery = campaignQuery.withCondition(LabelNames CONTAINS '${labelName}');
}
return campaignQuery.get();
}; // 3. Проверь, есть ли рекламные кампании с префиксом NZ:Если нет, то просто заканчивай,Нет никаких подсказок
const initialCampaigns = getNZCampaigns();
если (!initialCampaigns.hasNext()) {
Вернуться; // Только досрочное завершение,Без вывода логов
} // ====================== Добавлено ядро:Функция ручной паузы (подходит для тегов NZ),(Соответствует официальному API) ======================
const hasManualPausedCampaigns = () => {
const nzCampaigns = getNZCampaigns(); // Получить все объявления из Новой Зеландии (без фильтрации по тегам)
в то время как (nzCampaigns.hasNext()) {
const campaign = nzCampaigns.next();
// Условия ручной приостановки:«В состоянии паузы» и «без тега скрипта, специфичного для NZ»
const isPaused = campaign.isPaused();
если (isPaused) {
// Правильное получение итератора меток (campaign.labels)().получить(),(Соответствует спецификациям API Google Ads)
let hasAutoLabel = false;
const campaignLabels = campaign.labels().получить();
в то время как (campaignLabels.hasNext()) {
const label = campaignLabels.next();
если (label.getName() === NZ_CONFIG.autoPauseLabel) {
hasAutoLabel = true;
перерыв; // Найти целевые теги,Прекращение внутреннего обхода для повышения эффективности выполнения
}
}
// Есть реклама с «паузой» и без специального тега NZ,То есть вручную приостановить,Непосредственно возвращает true
если (!hasAutoLabel) {
return true;
}
}
}
return false;
}; // Обнаружена ручная пауза рекламы:Сценарий прямого прекращения,Не выполняй никаких дальнейших проверок на наличие праздников и не предпринимай никаких действий в связи с ними
если (hasManualPausedCampaigns()) {
console.log(【终止】检测到存在手动暂停的NZ广告系列,脚本跳过所有节假日判断和操作,保持手动暂停状态);
Вернуться;
}
// ============================================================================= // 4. Рассчитай праздничные дни в Новой Зеландии на текущий год (полностью сохрани исходную логику для Новой Зеландии),(без изменений)
const currentYear = new Date().getFullYear();
const nzHolidays = NZ_CONFIG.holidays.map(праздник => {
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(праздник => {
console.log(\n【校验】${holiday.name}:香港暂停时间=${formatDate(holiday.pauseTime)},启用时间=${formatDate(holiday.enableTime)}); // В праздничные дни:Приостановить рекламу (оптимизация):Добавь тег «NZ», а потом поставь на паузу,(Пометить как сценарий)
если (currentHkTime >= holiday.pauseTime && currentHkTime < holiday.enableTime) {
let pauseCount = 0;
const nzCampaigns = getNZCampaigns();
в то время как (nzCampaigns.hasNext()) {
const campaign = nzCampaigns.next();
если (campaign.isEnabled()) {
// Добавлено:Добавь тег скрипта, специфичный для Новой Зеландии,Различай паузу в сценарии и ручную паузу
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();
если (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')};
}// 【Добавлено】Убедись, что есть специальный тег для Новой Зеландии,Если страницы нет, создай её (отдели от тегов других региональных версий),(Избегай конфликтов)
function ensureLabelExists(labelName) {
let labelExists = false;
const labels = AdsApp.labels().получить();
в то время как (labels.hasNext()) {
const label = labels.next();
если (label.getName() === labelName) {
labelExists = true;
перерыв;
}
}
если (!labelExists) {
AdsApp.createLabel(labelName);
console.log(【初始化】创建NZ专属标签:${labelName});
}
}/***
- Функция проверки новозеландских праздников (полностью сохраняет логику оригинальной версии для Новой Зеландии),(Без изменений)
***/
function getNewYearsDayNZ(год) {
const date = new Date(год, 0, 1);
const day = date.getDay();
если (день === 0) date.setDate(date.getDate() + 1); // Воскресенье → 2 января
если (день === 6) date.setDate(date.getDate() + 2); // Суббота → 2 января
дата возврата;
}function getWaitangiDayNZ(год) {
const date = new Date(год, 1, 6);
const day = date.getDay();
если (день === 0) date.setDate(date.getDate() + 1); // Воскресенье → 7 февраля
если (день === 6) date.setDate(date.getDate() + 2); // Суббота → 8 февраля
дата возврата;
}function getGoodFridayNZ(год) {
const easterSunday = calculateEasterSundayNZ(год);
const goodFriday = new Date(Пасхальное воскресенье);
goodFriday.setDate(easterSunday.getDate() – 2);
Вернуться в 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();
если (день === 0) date.setDate(date.getDate() + 1); // Воскресенье → 26 апреля
если (день === 6) date.setDate(date.getDate() + 2); // Суббота → 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();
если (день === 0) date.setDate(date.getDate() + 1); // Воскресенье → 26 декабря
если (день === 6) date.setDate(date.getDate() + 2); // Суббота → 27 декабря
дата возврата;
}function getBoxingDayNZ(год) {
const date = new Date(год, 11, 26);
const day = date.getDay();
если (день === 0) date.setDate(date.getDate() + 1); // Воскресенье → 27 декабря
если (день === 6) date.setDate(date.getDate() + 2); // Суббота → 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(год, месяц, n-й, будний день) {
let date = new Date(год, месяц, 1);
в то время как (date.getDay() !== день недели) date.setDate(date.getDate() + 1);
date.setDate(date.getDate() + (n-й – 1) * 7);
дата возврата;
}function getLastWeekdayInMonth(год, месяц, будний день) {
let date = new Date(год, месяц + 1, 0);
в то время как (date.getDay() !== день недели) date.setDate(date.getDate() – 1);
дата возврата;
}

