Google Apps Script: Что такое возвращаемое значение и как его использовать?

Возвращаемое значение – фундаментальная концепция в программировании, и Google Apps Script (GAS) не исключение. Правильное понимание и использование возвращаемых значений позволяет создавать более модульный, читаемый и надежный код.

Что такое возвращаемое значение в Google Apps Script?

Определение возвращаемого значения

Возвращаемое значение – это результат работы функции. Когда функция заканчивает свое выполнение, она может передать определенное значение обратно в ту часть программы, которая ее вызвала. Это значение может быть любого типа данных, поддерживаемого GAS.

Типы возвращаемых значений (строки, числа, объекты, массивы, boolean, null)

GAS поддерживает возвращение различных типов данных:

  • String: Текстовые строки (например, 'Hello World!').
  • Number: Числа (например, 123, 3.14).
  • Object: Объекты, представляющие собой коллекции пар ключ-значение (например, {name: 'John', age: 30}).
  • Array: Массивы, упорядоченные списки значений (например, [1, 2, 3]).
  • Boolean: Логические значения true или false.
  • Null: Специальное значение, представляющее отсутствие значения.

Когда функция возвращает значение (явный и неявный возврат)

Функция явно возвращает значение с помощью ключевого слова return. Если return не указан, функция возвращает undefined (неявный возврат). Важно помнить об этом при проектировании функций, особенно если ожидается, что они должны возвращать определенные типы данных.

/**
 * @param {number} a Первое число.
 * @param {number} b Второе число.
 * @return {number} Сумма двух чисел.
 */
function add(a, b) {
  return a + b; // Явный возврат
}

/**
 * Функция, которая ничего не возвращает явно.
 */
function doSomething() {
  Logger.log('Something was done.');
  // Неявный возврат: undefined
}

Как использовать возвращаемое значение

Присваивание возвращаемого значения переменной

Самый распространенный способ использования возвращаемого значения – присвоить его переменной для дальнейшей работы.

let sum = add(5, 3); // sum будет содержать 8
Logger.log(sum);

Использование возвращаемого значения в условных операторах (if/else)

Возвращаемое значение может быть использовано в условиях для принятия решений.

/**
 * @param {number} score Оценка пользователя.
 * @return {boolean} Возвращает true, если оценка выше порогового значения.
 */
function isPassing(score) {
  return score >= 70;
}

if (isPassing(85)) {
  Logger.log('Пользователь прошел тест.');
} else {
  Logger.log('Пользователь не прошел тест.');
}

Передача возвращаемого значения другой функции в качестве аргумента

Возвращаемое значение одной функции можно сразу передать в другую.

/**
 * @param {number} number Число для возведения в квадрат.
 * @return {number} Квадрат числа.
 */
function square(number) {
  return number * number;
}

/**
 * @param {number} number Число.
 */
function logSquare(number) {
  Logger.log(square(number));
}

logSquare(5); // Выведет 25

Практические примеры использования возвращаемых значений

Пример 1: Функция для расчета площади прямоугольника

/**
 * @param {number} width Ширина прямоугольника.
 * @param {number} height Высота прямоугольника.
 * @return {number} Площадь прямоугольника.
 */
function calculateRectangleArea(width, height) {
  return width * height;
}

let area = calculateRectangleArea(10, 5);
Logger.log('Площадь прямоугольника: ' + area);

Пример 2: Функция для поиска пользователя в Google Sheets

/**
 * @param {string} email Email пользователя для поиска.
 * @param {string} spreadsheetId ID Google Sheets.
 * @param {string} sheetName Имя листа.
 * @return {object|null} Объект с данными пользователя, если найден, или null, если нет.
 */
function findUserByEmail(email, spreadsheetId, sheetName) {
  const ss = SpreadsheetApp.openById(spreadsheetId);
  const sheet = ss.getSheetByName(sheetName);
  const data = sheet.getDataRange().getValues();

  for (let i = 1; i < data.length; i++) { // Начинаем с 1, чтобы пропустить заголовки
    if (data[i][0] === email) { // Предполагаем, что email находится в первом столбце
      return { email: data[i][0], name: data[i][1], role: data[i][2] }; // Возвращаем объект с данными
    }
  }

  return null; // Пользователь не найден
}

let user = findUserByEmail('test@example.com', 'your_spreadsheet_id', 'Users');
if (user) {
  Logger.log('Найде пользователь: ' + user.name);
} else {
  Logger.log('Пользователь не найден.');
}

Пример 3: Функция для отправки email с динамическим содержанием

/**
 * @param {string} recipient Email получателя.
 * @param {string} subject Тема письма.
 * @param {string} template HTML шаблон.
 * @param {object} data Данные для подстановки в шаблон.
 * @return {boolean} True, если письмо отправлено успешно, false - если нет.
 */
function sendDynamicEmail(recipient, subject, template, data) {
  try {
    let htmlBody = template;
    for (let key in data) {
      htmlBody = htmlBody.replace(new RegExp('{{' + key + '}}', 'g'), data[key]);
    }

    MailApp.sendEmail({
      to: recipient,
      subject: subject,
      htmlBody: htmlBody
    });
    return true;
  } catch (e) {
    Logger.log('Ошибка отправки email: ' + e);
    return false;
  }
}

let emailTemplate = '<p>Привет, {{name}}!</p><p>Ваш баланс: {{balance}}</p>';
let userData = { name: 'John Doe', balance: 1000 };

if (sendDynamicEmail('john.doe@example.com', 'Ваш баланс', emailTemplate, userData)) {
  Logger.log('Email отправлен успешно.');
} else {
  Logger.log('Не удалось отправить email.');
}

Обработка ошибок и возвращаемые значения

Возврат null или undefined в случае ошибки

В ситуациях, когда функция не может успешно выполнить свою задачу, хорошей практикой является возвращение null или undefined. Это позволяет вызывающему коду определить, произошла ли ошибка.

Использование try…catch для обработки исключений и возврата значений по умолчанию

Конструкция try...catch позволяет перехватывать исключения и возвращать значения по умолчанию или уведомлять вызывающий код об ошибке.

/**
 * @param {string} str Строка для преобразования.
 * @return {number|null} Число, полученное из строки, или null, если преобразование невозможно.
 */
function parseNumber(str) {
  try {
    let number = parseFloat(str);
    if (isNaN(number)) {
      return null; // Не удалось преобразовать в число
    }
    return number;
  } catch (e) {
    Logger.log('Ошибка преобразования: ' + e);
    return null; // Произошла ошибка
  }
}

Лучшие практики использования возвращаемых значений

Четкое определение типа возвращаемого значения в документации функции

Всегда документируйте тип возвращаемого значения каждой функции, чтобы другие разработчики (и вы сами в будущем) могли легко понять, что ожидать от функции. Используйте JSDoc-комментарии.

Последовательное использование возвращаемых значений для повышения читаемости кода

Старайтесь всегда возвращать значения из функций, а не изменять глобальные переменные или состояние. Это упрощает отладку и понимание кода.

Избегание побочных эффектов в функциях, возвращающих значения

Функция, возвращающая значение, должна выполнять только одну задачу: вычислять и возвращать это значение. Избегайте побочных эффектов (например, изменения глобальных переменных, отправки email) внутри таких функций. Если необходимы побочные эффекты, создайте отдельные функции для их выполнения.


Добавить комментарий