Как работать с JSON-файлами в Google Apps Script?

Что такое 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, чтобы предотвратить сбои в работе скрипта.


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