Что такое условные операторы и зачем они нужны
Условные операторы – это фундаментальная часть любого языка программирования, включая Google Apps Script. Они позволяют программе принимать решения, то есть выполнять определенные блоки кода в зависимости от того, истинно или ложно определенное условие. Без условных операторов программа будет выполнять инструкции последовательно, без возможности выбора. Условные операторы используются для реализации сложной логики, обработки различных сценариев и создания интерактивных приложений.
Базовый синтаксис оператора `if`
Простейшая форма оператора if в Google Apps Script выглядит следующим образом:
if (условие) {
// Код, который выполняется, если условие истинно
}
условие – это выражение, которое вычисляется в true (истина) или false (ложь). Если условие истинно, выполняется код, заключенный в фигурные скобки {}. Если условие ложно, код внутри блока if пропускается.
Блок-схема работы оператора `if`
(Описания блок-схемы): Представьте ромб, представляющий условие. Если условие true, поток идет по одной ветке (обычно вправо), выполняя блок кода. Если условие false, поток идет по другой ветке (обычно вниз), пропуская этот блок кода. Далее, обе ветви сходятся в одной точке, продолжая выполнение остальной части программы.
Простой оператор `if`: выполнение кода при истинном условии
Примеры использования оператора `if` с числами и строками
Пример с числами:
/**
* Проверяет, является ли количество показов рекламной кампании достаточным.
* @param {number} impressions Количество показов.
* @return {void}
*/
function checkImpressions(impressions) {
if (impressions > 1000) {
Logger.log('Кампания получила достаточно показов.');
}
}
checkImpressions(1500); // Выведет сообщение в лог
checkImpressions(500); // Ничего не выведет
Пример со строками:
/**
* Проверяет, содержит ли строка ключевое слово.
* @param {string} text Текст для проверки.
* @return {void}
*/
function checkKeyword(text) {
if (text.indexOf('скидка') !== -1) {
Logger.log('Текст содержит ключевое слово "скидка".');
}
}
checkKeyword('Получите скидку 20%!'); // Выведет сообщение в лог
checkKeyword('Акция!'); // Ничего не выведет
Работа с логическими операторами (И, ИЛИ, НЕ) в условии `if`
Логические операторы позволяют комбинировать несколько условий в одном выражении:
&& (И): condition1 && condition2 – возвращает true, если оба условия истинны.
|| (ИЛИ): condition1 || condition2 – возвращает true, если хотя бы одно из условий истинно.
! (НЕ): !condition – возвращает true, если условие ложно, и наоборот.
Пример:
/**
* Проверяет, соответствует ли кампания заданным критериям (бюджет и CTR).
* @param {number} budget Бюджет кампании.
* @param {number} ctr CTR кампании.
* @return {void}
*/
function checkCampaignCriteria(budget, ctr) {
if (budget > 1000 && ctr > 0.01) {
Logger.log('Кампания соответствует критериям.');
}
}
checkCampaignCriteria(1500, 0.02); // Выведет сообщение в лог
checkCampaignCriteria(500, 0.02); // Ничего не выведет
checkCampaignCriteria(1500, 0.005); // Ничего не выведет
Практический пример: проверка допустимого значения перед выполнением действия
/**
* Вычисляет стоимость клика (CPC), если количество кликов больше 0.
* @param {number} cost Общая стоимость.
* @param {number} clicks Количество кликов.
* @return {number|null} CPC или null, если кликов нет.
*/
function calculateCpc(cost, clicks) {
if (clicks > 0) {
return cost / clicks;
} else {
return null; // Или можно вернуть 0, NaN, или вывести сообщение об ошибке
}
}
Logger.log(calculateCpc(10, 5)); // Выведет 2
Logger.log(calculateCpc(10, 0)); // Выведет null
Оператор `if…else`: выполнение альтернативного кода при ложном условии
Синтаксис оператора `if…else`
Оператор if...else позволяет выполнить один блок кода, если условие истинно, и другой блок кода, если условие ложно:
if (условие) {
// Код, который выполняется, если условие истинно
} else {
// Код, который выполняется, если условие ложно
}
Примеры использования `if…else` для разных типов данных
Пример с числом и проверкой на четность:
/**
* Проверяет число на четность.
* @param {number} number Число для проверки.
* @return {void}
*/
function checkEven(number) {
if (number % 2 === 0) {
Logger.log('Число четное.');
} else {
Logger.log('Число нечетное.');
}
}
checkEven(4); // Выведет 'Число четное.'
checkEven(7); // Выведет 'Число нечетное.'
Пример со строкой и проверкой на пустоту:
/**
* Проверяет строку на пустоту.
* @param {string} text Строка для проверки.
* @return {void}
*/
function checkEmptyString(text) {
if (text === '') {
Logger.log('Строка пустая.');
} else {
Logger.log('Строка не пустая.');
}
}
checkEmptyString(''); // Выведет 'Строка пустая.'
checkEmptyString('Hello'); // Выведет 'Строка не пустая.'
Практический пример: обработка ошибок с помощью `if…else`
/**
* Получает данные из Google Sheets и обрабатывает возможную ошибку.
* @param {string} spreadsheetId ID таблицы.
* @param {string} sheetName Название листа.
* @return {Array<Array>|null} Данные из таблицы или null в случае ошибки.
*/
function getDataFromSheet(spreadsheetId, sheetName) {
try {
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheet = spreadsheet.getSheetByName(sheetName);
if (sheet) {
return sheet.getDataRange().getValues();
} else {
Logger.log(`Лист с именем ${sheetName} не найден.`);
return null;
}
} catch (e) {
Logger.log(`Произошла ошибка: ${e}`);
return null;
}
}
const data = getDataFromSheet('your_spreadsheet_id', 'Sheet1');
if (data) {
Logger.log(data);
} else {
Logger.log('Не удалось получить данные из таблицы.');
}Оператор `if…else if…else`: множественные условия
Синтаксис и логика работы `if…else if…else`
Оператор if...else if...else позволяет проверить несколько условий последовательно. Код выполняется для первого истинного условия. Если ни одно из условий не истинно, выполняется блок else (если он есть):
if (условие1) {
// Код, который выполняется, если условие1 истинно
} else if (условие2) {
// Код, который выполняется, если условие2 истинно
} else {
// Код, который выполняется, если ни одно из условий не истинно
}
Примеры с несколькими условиями и различными типами данных
Пример с числовыми диапазонами:
/**
* Определяет категорию товара на основе его цены.
* @param {number} price Цена товара.
* @return {string} Категория товара.
*/
function getProductCategory(price) {
if (price < 50) {
return 'Бюджетный';
} else if (price < 100) {
return 'Средний класс';
} else {
return 'Премиум';
}
}
Logger.log(getProductCategory(30)); // Выведет 'Бюджетный'
Logger.log(getProductCategory(70)); // Выведет 'Средний класс'
Logger.log(getProductCategory(150)); // Выведет 'Премиум'
Пример с проверкой типа данных:
/**
* Обрабатывает переменную в зависимости от её типа.
* @param {any} variable Переменная для обработки.
* @return {void}
*/
function processVariable(variable) {
if (typeof variable === 'number') {
Logger.log('Переменная - число: ' + variable);
} else if (typeof variable === 'string') {
Logger.log('Переменная - строка: ' + variable);
} else {
Logger.log('Неизвестный тип переменной.');
}
}
processVariable(10); // Выведет 'Переменная - число: 10'
processVariable('Hello'); // Выведет 'Переменная - строка: Hello'
processVariable(true); // Выведет 'Неизвестный тип переменной.'
Когда использовать `if…else if…else` вместо вложенных `if`
Используйте if...else if...else, когда у вас есть несколько взаимоисключающих условий. Это делает код более читаемым и понятным, чем использование вложенных if, особенно когда условий больше двух-трех.
Практический пример: определение оценки на основе баллов
/**
* Определяет оценку на основе полученных баллов.
* @param {number} score Количество баллов.
* @return {string} Оценка.
*/
function getGrade(score) {
if (score >= 90) {
return 'Отлично';
} else if (score >= 80) {
return 'Хорошо';
} else if (score >= 70) {
return 'Удовлетворительно';
} else {
return 'Неудовлетворительно';
}
}
Logger.log(getGrade(95)); // Выведет 'Отлично'
Logger.log(getGrade(82)); // Выведет 'Хорошо'
Logger.log(getGrade(75)); // Выведет 'Удовлетворительно'
Logger.log(getGrade(60)); // Выведет 'Неудовлетворительно'
Вложенные операторы `if`: сложные условия
Что такое вложенные операторы `if` и как они работают
Вложенные операторы if – это операторы if, расположенные внутри других операторов if. Они используются для проверки нескольких уровней условий. Внутренний if выполняется только в том случае, если условие внешнего if истинно.
Примеры использования вложенных `if`
/**
* Проверяет, является ли пользователь администратором и имеет ли доступ к определенному ресурсу.
* @param {boolean} isAdmin Является ли пользователь администратором.
* @param {boolean} hasAccess Имеет ли пользователь доступ к ресурсу.
* @return {void}
*/
function checkAdminAccess(isAdmin, hasAccess) {
if (isAdmin) {
if (hasAccess) {
Logger.log('Администратор имеет доступ к ресурсу.');
} else {
Logger.log('Администратор не имеет доступа к ресурсу.');
}
} else {
Logger.log('Пользователь не является администратором.');
}
}
checkAdminAccess(true, true); // Выведет 'Администратор имеет доступ к ресурсу.'
checkAdminAccess(true, false); // Выведет 'Администратор не имеет доступа к ресурсу.'
checkAdminAccess(false, true); // Выведет 'Пользователь не является администратором.'
Рекомендации по читаемости и избежанию излишней вложенности
Избегайте слишком глубокой вложенности (более 2-3 уровней). Это затрудняет понимание кода.
Используйте логические операторы && и ||, чтобы объединить несколько условий в одно, когда это возможно.
Разбивайте сложные функции на более мелкие, чтобы упростить логику.
Используйте комментарии, чтобы объяснить логику вложенных if.
Практический пример: комплексная проверка доступа к ресурсу
/**
* Проверяет, имеет ли пользователь доступ к ресурсу на основе его роли и группы.
* @param {string} role Роль пользователя (admin, editor, viewer).
* @param {string} group Группа пользователя (groupA, groupB).
* @param {boolean} resourceAvailable Доступен ли ресурс.
* @return {void}
*/
function checkResourceAccess(role, group, resourceAvailable) {
if (resourceAvailable) {
if (role === 'admin') {
Logger.log('Администратор имеет полный доступ к ресурсу.');
} else if (role === 'editor') {
if (group === 'groupA') {
Logger.log('Редактор из группы A имеет доступ к ресурсу.');
} else {
Logger.log('Редактор из группы B не имеет доступа к ресурсу.');
}
} else {
Logger.log('У пользователя нет прав для доступа к ресурсу.');
}
} else {
Logger.log('Ресурс в данный момент недоступен.');
}
}
checkResourceAccess('admin', 'groupA', true); // Выведет 'Администратор имеет полный доступ к ресурсу.'
checkResourceAccess('editor', 'groupA', true); // Выведет 'Редактор из группы A имеет доступ к ресурсу.'
checkResourceAccess('editor', 'groupB', true); // Выведет 'Редактор из группы B не имеет доступа к ресурсу.'
checkResourceAccess('viewer', 'groupA', true); // Выведет 'У пользователя нет прав для доступа к ресурсу.'
checkResourceAccess('admin', 'groupA', false); // Выведет 'Ресурс в данный момент недоступен.'