Google Apps Script: почему fetch не определен?

Распространенность ошибки ‘ReferenceError: «fetch» is not defined’

Ошибка ReferenceError: "fetch" is not defined является довольно распространенной проблемой при разработке с использованием Google Apps Script (GAS). Разработчики, знакомые с современным JavaScript, часто пытаются использовать fetch для выполнения HTTP-запросов, но сталкиваются с тем, что среда выполнения GAS не поддерживает эту функцию напрямую «из коробки».

Краткое описание Google Apps Script и его возможностей

Google Apps Script — это облачная платформа, позволяющая автоматизировать задачи и расширять возможности Google Workspace (Sheets, Docs, Slides, Forms и т.д.). GAS поддерживает JavaScript (ECMAScript 5.1, с некоторыми дополнениями и ограничениями) и предоставляет доступ к различным сервисам Google и сторонним API. С помощью GAS можно создавать пользовательские функции, веб-приложения, триггеры и многое другое. GAS часто используется для задач, связанных с обработкой данных, автоматизацией маркетинговых процессов, интеграцией с рекламными платформами и другими web-сервисами.

Причины возникновения ошибки ‘fetch не определен’

Отсутствие необходимого разрешения: scopes

Основная причина ошибки заключается в том, что, в отличие от браузерной среды, Google Apps Script требует явного указания разрешений (scopes) для доступа к внешним ресурсам. Если ваш скрипт пытается выполнить HTTP-запрос, но в манифесте проекта не указан соответствующий scope (например, https://www.googleapis.com/auth/script.external_request), то функция fetch (если бы она была доступна) все равно не смогла бы выполнить запрос.

Неправильное использование синтаксиса fetch (если применимо)

Хотя в GAS нет встроенной функции fetch, некоторые разработчики пытаются использовать полифиллы или сторонние библиотеки для эмуляции ее работы. В таких случаях ошибки в синтаксисе или неправильная настройка библиотеки могут привести к появлению ошибки ReferenceError. Однако, как правило, проще использовать штатные средства GAS.

Ограничения среды выполнения Google Apps Script

Google Apps Script имеет ряд ограничений, связанных с безопасностью и производительностью. Одним из таких ограничений является отсутствие встроенной поддержки fetch. Для выполнения HTTP-запросов в GAS рекомендуется использовать UrlFetchApp.

Решения и способы устранения ошибки

Добавление необходимого scope (разрешения) в манифест проекта

Если вы все же пытаетесь использовать fetch через полифилл, убедитесь, что в манифесте проекта указан scope https://www.googleapis.com/auth/script.external_request. Манифест проекта — это файл appsscript.json, который содержит метаданные о вашем скрипте. Добавьте или отредактируйте раздел oauthScopes:

{
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    // Другие scopes...
  ]
}

Использование UrlFetchApp вместо fetch

Вместо fetch используйте встроенный сервис UrlFetchApp. Это стандартный и рекомендуемый способ выполнения HTTP-запросов в Google Apps Script.

Реклама
/**
 * Функция для выполнения GET-запроса к API.
 * @param {string} url - URL для запроса.
 * @return {string} - Ответ от API в виде строки.
 */
function fetchData(url: string): string {
  try {
    const response: GoogleAppsScript.URL_Fetch.HTTPResponse = UrlFetchApp.fetch(url);
    const content: string = response.getContentText();
    return content;
  } catch (e) {
    Logger.log("Ошибка при выполнении запроса: " + e);
    return null;
  }
}

// Пример использования
function main() {
  const apiUrl: string = "https://example.com/api/data";
  const data: string = fetchData(apiUrl);
  if (data) {
    Logger.log(data);
  }
}

Проверка синтаксиса и правильности запроса

Убедитесь, что URL, параметры запроса и заголовки передаются в UrlFetchApp.fetch() правильно. Проверьте, не содержат ли URL опечаток или некорректных символов. Используйте Logger.log() для отладки значений переменных.

Альтернативные методы выполнения HTTP-запросов в Google Apps Script

Подробное рассмотрение UrlFetchApp: параметры и примеры использования

UrlFetchApp.fetch() принимает два параметра: URL и необязательный объект options. Объект options позволяет задать различные параметры запроса, такие как метод (GET, POST, PUT, DELETE и т.д.), заголовки, payload (тело запроса для POST и PUT) и другие.

/**
 * Функция для выполнения POST-запроса с данными в формате JSON.
 * @param {string} url - URL для запроса.
 * @param {object} data - Объект с данными для отправки.
 * @return {string} - Ответ от API в виде строки.
 */
function postData(url: string, data: object): string {
  const options: GoogleAppsScript.URL_Fetch.URLFetchRequestOptions = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(data),
    'muteHttpExceptions': true // Чтобы получать ответы с кодами ошибок (4xx, 5xx)
  };
  try {
    const response: GoogleAppsScript.URL_Fetch.HTTPResponse = UrlFetchApp.fetch(url, options);
    const content: string = response.getContentText();
    return content;
  } catch (e) {
    Logger.log("Ошибка при выполнении запроса: " + e);
    return null;
  }
}

// Пример использования
function main() {
  const apiUrl: string = "https://example.com/api/submit";
  const postDataObj: object = {
    'name': 'John Doe',
    'email': 'john.doe@example.com'
  };
  const response: string = postData(apiUrl, postDataObj);
  if (response) {
    Logger.log(response);
  }
}

Преимущества и недостатки использования UrlFetchApp вместо fetch

Преимущества:

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

Недостатки:

  • Более низкий уровень абстракции по сравнению с fetch.
  • Менее современный API.

Заключение

Краткое резюме по устранению ошибки ‘fetch не определен’

Ошибка ReferenceError: "fetch" is not defined в Google Apps Script возникает из-за отсутствия встроенной поддержки этой функции. Для выполнения HTTP-запросов используйте UrlFetchApp, убедитесь, что в манифесте проекта указан необходимый scope (https://www.googleapis.com/auth/script.external_request, хотя для UrlFetchApp это, как правило, не требуется, но явно указывать scope — хорошая практика). Проверяйте синтаксис и параметры запросов.

Рекомендации по отладке и предотвращению подобных ошибок в будущем

  • Используйте Logger.log() для вывода отладочной информации.
  • Внимательно читайте документацию Google Apps Script.
  • Тестируйте свой код в разных сценариях.
  • Разбивайте сложные задачи на более мелкие и тестируйте каждую часть отдельно.
  • Используйте современные инструменты для отладки и профилирования кода.

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