Что такое JSON и зачем он нужен?
JSON (JavaScript Object Notation) – это легковесный формат обмена данными, который легко читается как людьми, так и машинами. Он основан на подмножестве синтаксиса JavaScript и используется для представления структурированных данных. JSON состоит из пар ключ-значение, массивов и вложенных объектов. Его популярность обусловлена простотой, удобством синтаксического разбора и поддержкой практически всеми языками программирования. JSON является стандартом де-факто для обмена данными между веб-серверами и веб-приложениями, а также для хранения конфигурационных данных.
Обзор Google Apps Script и его возможности
Google Apps Script – это облачный язык сценариев, который позволяет автоматизировать задачи в Google Workspace (Sheets, Docs, Drive, Gmail и др.). Он основан на JavaScript и предоставляет доступ к различным API Google, а также возможность интеграции со сторонними сервисами. Apps Script позволяет создавать пользовательские функции для Google Sheets, автоматизировать обработку почты, управлять файлами на Google Drive, интегрироваться с календарем и выполнять множество других задач. Google Apps Script работает на серверах Google, что обеспечивает надежность и масштабируемость.
Связь между JSON и Google Apps Script: когда это полезно?
JSON играет ключевую роль в Google Apps Script, когда необходимо:
Получать данные из внешних API, которые обычно возвращают данные в формате JSON.
Передавать данные между различными сервисами Google.
Сохранять и извлекать структурированные данные из Google Sheets или Google Drive.
Хранить конфигурационные параметры приложения.
В Apps Script можно легко разбирать JSON-данные в объекты JavaScript и преобразовывать объекты JavaScript обратно в JSON, что позволяет эффективно работать с данными.
Чтение JSON-файлов в Google Apps Script
Получение JSON-данных из внешнего источника (URL)
Для получения JSON-данных из внешнего источника, например API, используется класс UrlFetchApp. Вот пример кода:
/**
* Получает JSON данные из указанного URL.
* @param {string} url URL для получения JSON.
* @return {object} Объект JavaScript, полученный из JSON, или null в случае ошибки.
*/
function getJsonFromUrl(url: string): object | null {
try {
const response = UrlFetchApp.fetch(url);
const jsonString = response.getContentText();
const jsonData = JSON.parse(jsonString);
return jsonData;
} catch (e) {
Logger.log('Ошибка при получении JSON: ' + e);
return null;
}
}
// Пример использования
const apiUrl = 'https://jsonplaceholder.typicode.com/todos/1';
const data = getJsonFromUrl(apiUrl);
if (data) {
Logger.log(data.title);
}Чтение JSON из Google Sheets
JSON можно хранить непосредственно в ячейках Google Sheets. Для чтения таких данных необходимо получить значение ячейки и преобразовать его в объект JavaScript.
/**
* Читает JSON из указанной ячейки Google Sheets.
* @param {string} spreadsheetId ID Google Sheets.
* @param {string} sheetName Название листа.
* @param {string} cell Адрес ячейки (например, 'A1').
* @return {object} Объект JavaScript, полученный из JSON, или null в случае ошибки.
*/
function getJsonFromSheet(spreadsheetId: string, sheetName: string, cell: string): object | null {
try {
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
Logger.log('Лист с именем ' + sheetName + ' не найден.');
return null;
}
const jsonString = sheet.getRange(cell).getValue();
const jsonData = JSON.parse(jsonString);
return jsonData;
} catch (e) {
Logger.log('Ошибка при чтении JSON из Sheets: ' + e);
return null;
}
}
// Пример использования
const spreadsheetId = 'YOUR_SPREADSHEET_ID';
const sheetName = 'Sheet1';
const cell = 'A1';
const data = getJsonFromSheet(spreadsheetId, sheetName, cell);
if (data) {
Logger.log(data);
}Чтение JSON из Google Drive
JSON-файлы можно хранить на Google Drive. Для чтения такого файла используется класс DriveApp.
/**
* Читает JSON из файла на Google Drive.
* @param {string} fileId ID файла на Google Drive.
* @return {object} Объект JavaScript, полученный из JSON, или null в случае ошибки.
*/
function getJsonFromFile(fileId: string): object | null {
try {
const file = DriveApp.getFileById(fileId);
const jsonString = file.getBlob().getDataAsString();
const jsonData = JSON.parse(jsonString);
return jsonData;
} catch (e) {
Logger.log('Ошибка при чтении JSON из Drive: ' + e);
return null;
}
}
// Пример использования
const fileId = 'YOUR_FILE_ID';
const data = getJsonFromFile(fileId);
if (data) {
Logger.log(data);
}Обработка ошибок при чтении JSON
При работе с JSON важно предусмотреть обработку ошибок, таких как неверный формат JSON или отсутствие файла. Используйте блоки try...catch для перехвата исключений и логирования ошибок. Также полезно проверять типы данных перед их использованием.
Преобразование JSON в объекты JavaScript и обратно
Использование `JSON.parse()` для преобразования JSON в JavaScript
Функция JSON.parse() преобразует строку в формате JSON в объект JavaScript. Эта функция ключевая для работы с данными, полученными из внешних источников или хранилищ.
const jsonString = '{"name":"John", "age":30, "city":"New York"}';
const obj = JSON.parse(jsonString);
Logger.log(obj.name); // Выведет: JohnИспользование `JSON.stringify()` для преобразования JavaScript в JSON
Функция JSON.stringify() преобразует объект JavaScript в строку в формате JSON. Это необходимо для отправки данных на сервер или сохранения их в файл.
const obj = { name: 'John', age: 30, city: 'New York' };
const jsonString = JSON.stringify(obj);
Logger.log(jsonString); // Выведет: {"name":"John","age":30,"city":"New York"}Работа с вложенными JSON-объектами и массивами
JSON может содержать вложенные объекты и массивы. Для доступа к данным в таких структурах используются стандартные операторы JavaScript.
const jsonString = '{"name":"John", "address":{"street":"Main St", "city":"New York"}, "hobbies":["reading", "coding"]}';
const obj = JSON.parse(jsonString);
Logger.log(obj.address.city); // Выведет: New York
Logger.log(obj.hobbies[0]); // Выведет: readingЗапись JSON-данных в Google Sheets и Drive
Создание JSON-файла и сохранение на Google Drive
/**
* Создает JSON файл на Google Drive.
* @param {object} data Данные для записи в JSON файл.
* @param {string} fileName Имя файла.
* @param {string} folderId ID папки на Google Drive (необязательно).
* @return {string} ID созданного файла.
*/
function createJsonFile(data: object, fileName: string, folderId?: string): string {
const jsonString = JSON.stringify(data);
const blob = Utilities.newBlob(jsonString, 'application/json', fileName + '.json');
let folder;
if (folderId) {
folder = DriveApp.getFolderById(folderId);
} else {
folder = DriveApp.getRootFolder();
}
const file = folder.createFile(blob);
return file.getId();
}
// Пример использования
const data = { name: 'John', age: 30 };
const fileName = 'data';
const fileId = createJsonFile(data, fileName);
Logger.log('Файл создан с ID: ' + fileId);Запись JSON-данных в ячейки Google Sheets
/**
* Записывает JSON данные в указанную ячейку Google Sheets.
* @param {string} spreadsheetId ID Google Sheets.
* @param {string} sheetName Название листа.
* @param {string} cell Адрес ячейки (например, 'A1').
* @param {object} data Данные для записи в JSON.
*/
function writeJsonToSheet(spreadsheetId: string, sheetName: string, cell: string, data: object): void {
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
Logger.log('Лист с именем ' + sheetName + ' не найден.');
return;
}
const jsonString = JSON.stringify(data);
sheet.getRange(cell).setValue(jsonString);
}
// Пример использования
const spreadsheetId = 'YOUR_SPREADSHEET_ID';
const sheetName = 'Sheet1';
const cell = 'A1';
const data = { name: 'John', age: 30 };
writeJsonToSheet(spreadsheetId, sheetName, cell, data);Форматирование JSON для удобства чтения (отступы)
При использовании JSON.stringify() можно добавить параметры для форматирования JSON, чтобы сделать его более читаемым.
const obj = { name: 'John', age: 30, city: 'New York' };
const jsonString = JSON.stringify(obj, null, 2); // 2 - количество пробелов для отступов
Logger.log(jsonString);
/* Выведет:
{
"name": "John",
"age": 30,
"city": "New York"
}
*/Примеры использования и лучшие практики
Пример: Получение и обработка данных из API (с использованием JSON)
Предположим, необходимо получить данные о курсах валют из API и записать их в Google Sheets. Этот процесс включает в себя получение JSON-данных, их разбор и запись в таблицу.
/**
* Получает курсы валют из API и записывает их в Google Sheets.
* @param {string} spreadsheetId ID Google Sheets.
* @param {string} sheetName Название листа.
*/
function updateCurrencyRates(spreadsheetId: string, sheetName: string): void {
const apiUrl = 'https://api.exchangerate-api.com/v4/latest/USD'; // Пример API
const data = getJsonFromUrl(apiUrl);
if (!data || !data.rates) {
Logger.log('Не удалось получить данные о курсах валют.');
return;
}
const rates = data.rates;
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
Logger.log('Лист с именем ' + sheetName + ' не найден.');
return;
}
// Записываем заголовки столбцов
sheet.getRange('A1').setValue('Currency');
sheet.getRange('B1').setValue('Rate');
let row = 2;
for (const currency in rates) {
sheet.getRange(row, 1).setValue(currency);
sheet.getRange(row, 2).setValue(rates[currency]);
row++;
}
}
// Пример использования
const spreadsheetId = 'YOUR_SPREADSHEET_ID';
const sheetName = 'CurrencyRates';
updateCurrencyRates(spreadsheetId, sheetName);Пример: Хранение конфигурации приложения в JSON-файле
Конфигурационные параметры приложения (например, ключи API, настройки подключения) удобно хранить в JSON-файле на Google Drive. Это позволяет легко изменять настройки без необходимости переписывать код.
Рекомендации по работе с большими JSON-файлами
Используйте потоковую обработку: Если JSON-файл очень большой, не загружайте его целиком в память. Рассмотрите возможность потоковой обработки данных.
Оптимизируйте структуру JSON: Упростите структуру JSON, чтобы уменьшить его размер и ускорить обработку.
Используйте JSON.parse() с осторожностью: Функция JSON.parse() может быть ресурсоемкой для больших файлов. По возможности используйте альтернативные методы.
Советы по отладке и обработке ошибок JSON
Проверяйте валидность JSON: Используйте онлайн-валидаторы JSON, чтобы убедиться в правильности формата.
Логируйте ошибки: Добавляйте подробные сообщения об ошибках в блоки try...catch.
Используйте отладчик: Используйте встроенный отладчик Google Apps Script для пошагового выполнения кода и анализа значений переменных.
Обрабатывайте исключения: Обязательно обрабатывайте исключения, возникающие при чтении и разборе JSON, чтобы предотвратить сбои в работе скрипта.