Что такое ключи и зачем они нужны в Google Apps Script
В Google Apps Script, как и во многих других языках программирования, ключи играют важную роль в организации и доступе к данным. Ключ – это уникальный идентификатор, который позволяет получить доступ к определенному значению в структуре данных. Они необходимы для работы с объектами и ассоциативными массивами, позволяя эффективно извлекать, изменять или удалять данные.
Основные типы структур данных, использующих ключи (объекты, ассоциативные массивы)
В Google Apps Script ключи наиболее часто используются в двух основных типах структур данных:
Объекты (Objects): Объекты представляют собой наборы свойств, где каждое свойство состоит из имени (ключа) и значения. Ключи объектов обычно являются строками.
Ассоциативные массивы (Associative Arrays): Хотя в JavaScript (на котором основан Google Apps Script) нет встроенного типа данных «ассоциативный массив», объекты часто используются для эмуляции их поведения. В этом контексте, объект рассматривается как коллекция пар ключ-значение.
Получение значения ключа из объекта в Google Apps Script
Использование точечной нотации (object.key) для доступа к значениям
Точечная нотация – это один из наиболее распространенных и читаемых способов доступа к значениям свойств объекта. Она использует точку (.) для разделения имени объекта и имени ключа.
/**
* @param {object} obj - Объект, из которого нужно получить значение.
* @param {string} key - Ключ, значение которого нужно получить.
* @return {any} Значение ключа или undefined, если ключ не найден.
*/
function getValueWithDotNotation(obj, key) {
// @ts-ignore
return obj.key; // this is problematic - always accesses a property named literally 'key'
}
/**
* @param {object} obj The object.
* @return {string} Gets value.
*/
function getMyValue(obj) {
return obj.myValue;
}
const myObject = { name: 'Иван', age: 30 };
const nameValue = myObject.name; // nameValue будет равен 'Иван'
Logger.log(nameValue);Важно: Точечная нотация работает только в том случае, если имя ключа известно во время написания кода и является допустимым идентификатором JavaScript (начинается с буквы, $ или _, и не содержит пробелов или других специальных символов).
Использование квадратных скобок (object[‘key’]) для доступа к значениям
Квадратные скобки ([]) предоставляют более гибкий способ доступа к значениям свойств объекта. Они позволяют использовать переменные или выражения для определения имени ключа.
/**
* @param {object} obj - Объект, из которого нужно получить значение.
* @param {string} key - Ключ, значение которого нужно получить.
* @return {any} Значение ключа или undefined, если ключ не найден.
*/
function getValueWithBrackets(obj, key) {
return obj[key];
}
const myObject = { name: 'Иван', age: 30 };
const keyName = 'name';
const nameValue = myObject[keyName]; // nameValue будет равен 'Иван'
Logger.log(nameValue);Различия и преимущества между точечной нотацией и квадратными скобками
Точечная нотация: Проще и читаемее для статических ключей, известных во время разработки.
Квадратные скобки: Необходимы для динамического доступа к ключам (когда имя ключа определяется переменной или выражением) или когда имя ключа не является допустимым идентификатором JavaScript.
const object = {
"first name": "John",
"last name": "Doe"
};
// object.first name // Ошибка: SyntaxError: Unexpected identifier
object["first name"]; // "John"Обработка ошибок при попытке доступа к несуществующему ключу
При попытке доступа к несуществующему ключу объекта возвращается значение undefined. Важно обрабатывать такие ситуации, чтобы избежать ошибок в коде. Можно использовать оператор typeof или проверку на undefined.
const myObject = { name: 'Иван' };
const ageValue = myObject.age; // ageValue будет равен undefined
if (typeof ageValue !== 'undefined') {
Logger.log('Возраст: ' + ageValue);
} else {
Logger.log('Возраст не указан');
}Получение значения ключа из ассоциативного массива
Объявление и инициализация ассоциативных массивов в Google Apps Script
Как упоминалось ранее, в Google Apps Script нет встроенного типа данных «ассоциативный массив». Объекты используются для эмуляции их поведения. Инициализация выглядит стандартно для объектов.
const асоциативныйМассив = {
'name': 'Иван',
'age': 30
};Использование квадратных скобок (array[‘key’]) для доступа к значениям
Для доступа к значениям в ассоциативном массиве (объекте) всегда используются квадратные скобки, так как ключи являются строками. Точечная нотация допустима, но нежелательна, так как менее гибка.
const асоциативныйМассив = {
'name': 'Иван',
'age': 30
};
const nameValue = асоциативныйМассив['name']; // nameValue будет равен 'Иван'
Logger.log(nameValue);Примеры получения значений ключей в различных сценариях
Предположим, у вас есть объект, представляющий информацию о пользователе, полученную из формы Google Forms:
const formData = {
'Имя': 'Иван',
'Фамилия': 'Иванов',
'Email': 'ivan@example.com'
};
const email = formData['Email'];
Logger.log(email); // Выведет: ivan@example.comПродвинутые методы работы с ключами
Перебор ключей объекта с использованием цикла for…in
Цикл for...in позволяет перебрать все ключи объекта.
const myObject = { name: 'Иван', age: 30, city: 'Москва' };
for (const key in myObject) {
if (myObject.hasOwnProperty(key)) { // Проверяем, что ключ принадлежит непосредственно объекту, а не его прототипу
const value = myObject[key];
Logger.log(key + ': ' + value);
}
}Проверка существования ключа в объекте или массиве (hasOwnProperty, in)
hasOwnProperty(key): Возвращает true, если объект имеет указанный ключ в качестве собственного свойства (не унаследованного).
in: Возвращает true, если указанный ключ существует в объекте (включая унаследованные свойства).
const myObject = { name: 'Иван' };
Logger.log(myObject.hasOwnProperty('name')); // true
Logger.log('name' in myObject); // true
Logger.log(myObject.hasOwnProperty('toString')); // false
Logger.log('toString' in myObject); // trueДинамическое создание и удаление ключей
Ключи можно добавлять и удалять из объектов во время выполнения кода.
const myObject = { name: 'Иван' };
myObject.age = 30; // Добавление ключа 'age'
Logger.log(myObject.age); // 30
delete myObject.name; // Удаление ключа 'name'
Logger.log(myObject.name); // undefinedПрактические примеры и советы
Чтение значений ключей из Google Sheets
При чтении данных из Google Sheets каждая строка может быть представлена как объект, где ключами являются заголовки столбцов.
function readDataFromSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const range = sheet.getDataRange();
const values = range.getValues();
const headers = values[0]; // Заголовки столбцов
for (let i = 1; i < values.length; i++) {
const rowData = {};
for (let j = 0; j < headers.length; j++) {
rowData[headers[j]] = values[i][j];
}
Logger.log(rowData['Имя столбца']);
}
}Использование ключей для работы с JSON-данными
При работе с JSON-данными, полученными из внешних источников, можно использовать ключи для доступа к конкретным значениям.
const jsonData = '{"name": "Иван", "age": 30}';
const myObject = JSON.parse(jsonData);
Logger.log(myObject.name); // ИванРекомендации по именованию ключей для лучшей читаемости кода
Используйте понятные и описательные имена ключей.
Соблюдайте единый стиль именования (например, camelCase или snake_case).
Избегайте использования зарезервированных слов JavaScript в качестве имен ключей.
По возможности, используйте английский язык для имен ключей, особенно если код может быть использован другими разработчиками.
Следуйте соглашениям об именах, принятым в вашем проекте или команде.