Как создать Google форму с помощью Apps Script: пошаговое руководство

Что такое Google Apps Script и его возможности

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

GAS предоставляет доступ к обширному набору сервисов Google, позволяя интегрировать различные приложения между собой. Например, можно автоматически создавать отчеты в Google Sheets на основе данных из Google Analytics, отправлять персонализированные email-рассылки через Gmail или, как мы рассмотрим в этой статье, программно управлять Google Forms.

Преимущества использования Apps Script для автоматизации Google Forms

Использование Apps Script для работы с Google Forms открывает ряд преимуществ:

Динамическое создание форм: Формы можно генерировать на основе данных из других источников, например, Google Sheets или внешних баз данных. Это полезно для создания опросов с уникальными вопросами для разных респондентов или для форм, структура которых часто меняется.

Сложная логика и валидация: Реализация кастомной валидации данных, недоступной в стандартном интерфейсе Forms (например, проверка формата ИНН, сверка с базой данных).

Автоматическая обработка ответов: Мгновенная обработка ответов при их поступлении, включая анализ данных, отправку уведомлений, запись результатов в различные системы (Google Sheets, CRM, базы данных), запуск других бизнес-процессов.

Интеграция с другими сервисами: Возможность связать форму с календарем, задачами, документами и другими приложениями Google Workspace или внешними сервисами.

Необходимые условия и подготовка к работе

Для работы с Apps Script и Google Forms потребуется:

Аккаунт Google: Доступ к Google Workspace или личный аккаунт Google.

Базовые знания JavaScript: Понимание синтаксиса, типов данных, функций, объектов и массивов.

Представление об API Google Forms: Знакомство с основными объектами и методами сервиса FormApp.

Создание новой Google Form и получение её ID

Создание новой формы в Google Forms

Проще всего создать пустую форму через интерфейс Google Forms (forms.google.com) или Google Drive. Это дает визуальное представление о будущей структуре.

Как получить ID созданной формы

ID формы необходим для обращения к ней из скрипта. Его можно найти в URL формы в браузере. URL имеет вид: https://docs.google.com/forms/d/FORM_ID/edit Где FORM_ID — это уникальный идентификатор вашей формы.

Также ID можно получить программно, если скрипт создает форму:

/**
 * Создает новую Google Form и возвращает её ID.
 * @param {string} title - Заголовок новой формы.
 * @returns {string} ID созданной формы.
 */
function createNewFormAndGetId(title: string): string {
  const form: GoogleAppsScript.Forms.Form = FormApp.create(title);
  Logger.log(`Создана форма с заголовком: ${form.getTitle()}, ID: ${form.getId()}`);
  return form.getId();
}

Изучение структуры Google Form (элементы, вопросы, типы)

Google Form состоит из элементов (Item). Основные типы элементов — это вопросы различных форматов:

Текстовый ответ (TextItem)

Параграф (ParagraphTextItem)

Один из списка (MultipleChoiceItem)

Несколько из списка (CheckboxItem)

Выпадающий список (ListItem)

Шкала (ScaleItem)

Сетка (GridItem, CheckboxGridItem)

Дата (DateItem)

Время (TimeItem)

Кроме вопросов, форма может содержать и другие элементы: разрыв страницы (PageBreakItem), изображение (ImageItem), видео (VideoItem), заголовок раздела (SectionHeaderItem).

Написание скрипта Apps Script для управления Google Form

Открытие редактора Apps Script из Google Forms

Редактор скриптов можно открыть непосредственно из интерфейса Google Forms:

Откройте форму.

Нажмите на три точки (Дополнительно) в правом верхнем углу.

Выберите "Редактор скриптов".

Откроется новое окно с редактором Apps Script, привязанным к данной форме.

Основные функции Apps Script для работы с формами (FormApp)

Сервис FormApp — это основной инструмент для взаимодействия с Google Forms в Apps Script. Ключевые классы и методы:

FormApp.create(title): Создает новую форму.

FormApp.openById(id): Открывает существующую форму по ID.

FormApp.openByUrl(url): Открывает существующую форму по URL.

FormApp.getActiveForm(): Получает форму, к которой привязан скрипт.

Form: Представляет саму форму. Методы: addItem(), addTextItem(), addMultipleChoiceItem(), getItems(), getId(), getTitle(), setDestination() (для привязки таблицы ответов) и др.

Item: Базовый класс для всех элементов формы.

Специфичные классы вопросов (TextItem, MultipleChoiceItem и т.д.): Предоставляют методы для настройки конкретного типа вопроса.

Добавление вопросов в форму программно (createTextItem, createMultipleChoiceItem и др.)

Рассмотрим пример добавления различных типов вопросов в форму.

/**
 * Добавляет стандартные вопросы в активную Google Form.
 */
function addQuestionsToForm(): void {
  const form: GoogleAppsScript.Forms.Form = FormApp.getActiveForm();

  // Добавление текстового вопроса (Имя)
  const nameItem: GoogleAppsScript.Forms.TextItem = form.addTextItem();
  nameItem.setTitle('Ваше имя');
  nameItem.setRequired(true);

  // Добавление вопроса с выбором одного варианта (Источник трафика)
  const trafficSourceItem: GoogleAppsScript.Forms.MultipleChoiceItem = form.addMultipleChoiceItem();
  trafficSourceItem.setTitle('Откуда вы узнали о нашем вебинаре?');
  trafficSourceItem.setChoices([
    trafficSourceItem.createChoice('Поисковая система (Google, Yandex)'),
    trafficSourceItem.createChoice('Социальные сети (VK, Facebook, Instagram)'),
    trafficSourceItem.createChoice('Email-рассылка'),
    trafficSourceItem.createChoice('Рекомендация коллег'),
    trafficSourceItem.createChoice('Другое')
  ]);
  trafficSourceItem.setRequired(true);

  // Добавление вопроса с параграфом (Комментарий)
  const feedbackItem: GoogleAppsScript.Forms.ParagraphTextItem = form.addParagraphTextItem();
  feedbackItem.setTitle('Ваши комментарии или предложения');
  feedbackItem.setHelpText('Оставьте свой отзыв здесь.');

  Logger.log(`В форму "${form.getTitle()}" добавлены вопросы.`);
}

Настройка параметров вопросов (обязательность, подсказки и др.)

Каждый объект вопроса имеет методы для его настройки:

setTitle(title): Устанавливает заголовок вопроса.

setHelpText(text): Добавляет подсказку под вопросом.

setRequired(isRequired): Делает вопрос обязательным (true) или необязательным (false).

setChoices(choices) (для MultipleChoiceItem, CheckboxItem, ListItem): Устанавливает варианты ответов. Используется массив объектов Choice.

Методы валидации (рассмотрим позже).

Автоматизация обработки ответов Google Form

Получение данных из ответов формы (getResponses, getItemResponses)

Когда пользователь отправляет форму, создается объект FormResponse. Получить все ответы можно методом form.getResponses().

/**
 * Обрабатывает последний полученный ответ формы.
 * @param {GoogleAppsScript.Events.FormsOnSubmit} e - Объект события отправки формы.
 */
function processLatestResponse(e?: GoogleAppsScript.Events.FormsOnSubmit): void {
  const formResponse: GoogleAppsScript.Forms.FormResponse = e ? e.response : FormApp.getActiveForm().getResponses().pop();
  if (!formResponse) {
    Logger.log('Нет ответов для обработки.');
    return;
  }

  const itemResponses: GoogleAppsScript.Forms.ItemResponse[] = formResponse.getItemResponses();

  Logger.log(`Обработка ответа от ${formResponse.getRespondentEmail()} (ID: ${formResponse.getId()})`);

  for (const itemResponse of itemResponses) {
    const questionTitle: string = itemResponse.getItem().getTitle();
    const answer: string | string[] | string[][] = itemResponse.getResponse(); // Тип зависит от вопроса
    Logger.log(`Вопрос: "${questionTitle}", Ответ: ${JSON.stringify(answer)}`);
  }
}

Важно: Для доступа к getRespondentEmail() необходимо включить сбор email-адресов в настройках формы.

Обработка и анализ данных ответов (сортировка, фильтрация, вычисления)

Получив массив ответов (ItemResponse[]), можно выполнять различные операции:

Реклама

Поиск конкретного ответа: Найти ответ на определенный вопрос по его заголовку.

Преобразование типов: Конвертировать строковые ответы в числа или даты для вычислений.

Агрегация: Подсчитать количество выборов определенного варианта, вычислить среднее значение по шкале.

Фильтрация: Обрабатывать только те ответы, которые удовлетворяют определенным условиям (например, только ответы с низким рейтингом).

Отправка уведомлений по электронной почте на основе ответов (MailApp)

Сервис MailApp позволяет отправлять email-уведомления.

/**
 * Отправляет уведомление администратору, если получен низкий рейтинг.
 * @param {GoogleAppsScript.Forms.FormResponse} formResponse - Объект ответа формы.
 */
function sendNotificationOnLowRating(formResponse: GoogleAppsScript.Forms.FormResponse): void {
  const itemResponses: GoogleAppsScript.Forms.ItemResponse[] = formResponse.getItemResponses();
  const adminEmail: string = 'admin@example.com'; // Замените на реальный email
  const ratingQuestionTitle: string = 'Оцените качество вебинара (1-5)'; // Заголовок вопроса с рейтингом

  for (const itemResponse of itemResponses) {
    if (itemResponse.getItem().getTitle() === ratingQuestionTitle) {
      const rating: number = parseInt(itemResponse.getResponse() as string, 10);
      if (rating <= 2) {
        const subject: string = `Низкая оценка вебинара! (${rating}/5)`;
        const body: string = `Получен ответ с низкой оценкой (${rating}) от пользователя ${formResponse.getRespondentEmail()}.
` +
                           `Ссылка на все ответы: ${FormApp.getActiveForm().getPublishedUrl()}`; // Или ссылка на таблицу
        MailApp.sendEmail(adminEmail, subject, body);
        Logger.log(`Отправлено уведомление о низкой оценке на ${adminEmail}`);
        break; // Достаточно одного уведомления на ответ
      }
    }
  }
}

// Эту функцию нужно вызывать из обработчика триггера onSubmit, передавая e.response
function onFormSubmitHandler(e: GoogleAppsScript.Events.FormsOnSubmit): void {
   processLatestResponse(e);
   sendNotificationOnLowRating(e.response);
   // Добавьте сюда вызов функции записи в Google Sheets, если нужно
}

Запись данных ответов в Google Sheets или другие базы данных

Часто ответы удобно сохранять и анализировать в Google Sheets.

Привязка таблицы: В настройках формы (вкладка "Ответы") можно создать или выбрать существующую Google Sheet для автоматического сохранения ответов.

Программная запись: Использовать сервис SpreadsheetApp для добавления строки с обработанными данными в нужную таблицу.

/**
 * Записывает основные данные из ответа формы в Google Sheet.
 * @param {GoogleAppsScript.Forms.FormResponse} formResponse - Объект ответа формы.
 * @param {string} spreadsheetId - ID таблицы Google Sheets.
 * @param {string} sheetName - Имя листа в таблице.
 */
function logResponseToSheet(formResponse: GoogleAppsScript.Forms.FormResponse, spreadsheetId: string, sheetName: string): void {
  try {
    const ss: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.openById(spreadsheetId);
    const sheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getSheetByName(sheetName);
    if (!sheet) {
        Logger.log(`Лист с именем "${sheetName}" не найден в таблице ID: ${spreadsheetId}`);
        return;
    }

    const timestamp: Date = formResponse.getTimestamp();
    const email: string = formResponse.getRespondentEmail() || 'N/A';
    const itemResponses: GoogleAppsScript.Forms.ItemResponse[] = formResponse.getItemResponses();
    const rowData: any[] = [timestamp, email]; // Начинаем строку с даты и email

    // Собираем ответы в том порядке, в котором вопросы идут в форме
    // Это упрощенный подход, лучше получать вопросы из формы и сопоставлять
    itemResponses.forEach(itemResponse => {
      rowData.push(JSON.stringify(itemResponse.getResponse()));
    });

    sheet.appendRow(rowData);
    Logger.log(`Ответ записан в ${sheetName}`);

  } catch (error) {
    Logger.log(`Ошибка записи в Google Sheet: ${error}`);
  }
}

// Пример вызова внутри onFormSubmitHandler
function onFormSubmitHandlerWithSheetLog(e: GoogleAppsScript.Events.FormsOnSubmit): void {
   const SPREADSHEET_ID: string = 'YOUR_SPREADSHEET_ID'; // Укажите ID вашей таблицы
   const SHEET_NAME: string = 'Ответы_Формы'; // Укажите имя листа

   processLatestResponse(e);
   sendNotificationOnLowRating(e.response);
   logResponseToSheet(e.response, SPREADSHEET_ID, SHEET_NAME);
}

Примеры и продвинутые техники

Динамическое создание формы на основе данных из Google Sheets

Предположим, у вас есть список ключевых слов в Google Sheet, и для каждого нужно создать вопрос в форме.

/**
 * Создает вопросы в форме на основе данных из Google Sheet.
 * @param {string} spreadsheetId - ID таблицы с данными.
 * @param {string} sheetName - Имя листа с ключевыми словами (предполагается, что они в первом столбце).
 */
function createFormFromSheetData(spreadsheetId: string, sheetName: string): void {
  const form: GoogleAppsScript.Forms.Form = FormApp.getActiveForm();
  const ss: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  const sheet: GoogleAppsScript.Spreadsheet.Sheet | null = ss.getSheetByName(sheetName);

  if (!sheet) {
      Logger.log(`Лист "${sheetName}" не найден.`);
      return;
  }

  const dataRange: GoogleAppsScript.Spreadsheet.Range = sheet.getDataRange();
  const values: any[][] = dataRange.getValues();

  // Пропускаем заголовок, если он есть (values[0])
  for (let i = 1; i < values.length; i++) {
    const keyword: string = values[i][0]; // Ключевое слово в первом столбце
    if (keyword) {
      const item: GoogleAppsScript.Forms.ScaleItem = form.addScaleItem();
      item.setTitle(`Оцените релевантность ключевого слова: "${keyword}"`);
      item.setBounds(1, 5); // Шкала от 1 до 5
      item.setRequired(true);
    }
  }
  Logger.log('Вопросы на основе данных из таблицы добавлены.');
}

Добавление валидации ответов (например, проверка email адреса)

Apps Script позволяет добавлять более сложную валидацию, чем стандартный интерфейс.

/**
 * Добавляет текстовый вопрос с валидацией email.
 */
function addEmailValidationQuestion(): void {
  const form: GoogleAppsScript.Forms.Form = FormApp.getActiveForm();

  const emailItem: GoogleAppsScript.Forms.TextItem = form.addTextItem().setTitle('Ваш рабочий Email');

  // Создание правила валидации
  const emailValidation: GoogleAppsScript.Forms.TextValidation = FormApp.createTextValidation()
    .setHelpText('Введите корректный email адрес.')
    .requireTextMatchesPattern(".+@.+\.+") // Простое регулярное выражение для email
    .build();

  emailItem.setValidation(emailValidation);
  emailItem.setRequired(true);
  Logger.log('Добавлен вопрос с валидацией email.');
}

Создание триггеров для автоматического запуска скрипта (onSubmit)

Чтобы скрипты обработки ответов выполнялись автоматически при отправке формы, необходимо создать триггер onSubmit.

В редакторе скриптов перейдите в раздел "Триггеры" (иконка будильника слева).

Нажмите "+ Добавить триггер".

Настройте триггер:

Выберите функцию для запуска: onFormSubmitHandler (или ваша функция-обработчик).

Выберите развертывание: Головное.

Выберите источник события: Из формы.

Выберите тип события: При отправке формы.

Нажмите "Сохранить". Потребуется авторизовать скрипт.

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

Отладка и тестирование скрипта

Logger.log(): Используйте для вывода значений переменных и сообщений в журнал выполнения (Просмотр -> Журналы).

Отладчик: В редакторе можно устанавливать точки останова и пошагово выполнять скрипт, проверяя значения переменных.

Запуск вручную: Функции можно запускать вручную из редактора для тестирования (выбрав нужную функцию в выпадающем списке и нажав "Выполнить"). Для функций, ожидающих объект события (как onFormSubmitHandler), потребуется либо тестовый вызов с имитацией объекта e, либо тестирование через реальную отправку формы с установленным триггером.

Обработка ошибок: Используйте блоки try...catch для перехвата и логирования ошибок во время выполнения, особенно при работе с внешними сервисами или данными.

Используя Google Apps Script, вы можете значительно расширить возможности стандартных Google Forms, создавая мощные и автоматизированные решения для сбора и обработки данных.


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