Привет ребята! Это мой первый раз здесь в среде, поэтому я надеюсь, что со временем я пойму суть. Как аналитик данных уже около 3 лет, я столкнулся с некоторыми инструментами и сценариями, но я бы сказал, что самое сложное — это когда у вас нет надежных данных для работы. Заставить команду разработчиков создать надежное приложение иногда нецелесообразно, бизнес должен быть запущен в любом случае, или люди должны иметь доказательство концепции, поэтому создание прототипа чего-либо в то же время является важным навыком для реализации бизнес-мечты (и, следовательно, вашей работы) живой.

Gsuite (теперь Google Workspace) — это хорошо известный инструмент, который имеет в основном функции, которые вы найдете в его аналоге Microsoft Office, но с большим преимуществом: он в основном бесплатный. Таким образом, есть возможность автоматизировать вещи с помощью кода, и этот код позволяет создавать довольно продвинутые вещи!

Сегодня я собираюсь показать автоматизацию, которая создает динамическую форму на основе информации, содержащейся в электронной таблице. Поскольку Google Forms на самом деле не может вести себя динамически — один ответ изменяет параметры следующего вопроса — мы будем полагаться на ветвление разделов для обработки возможностей. В качестве плюса, чтобы преодолеть вопрос без ответа, мы также должны обработать содержимое ответа, поэтому также рассмотрим некоторую обработку события триггера.

Проблема

Давайте создадим форму, в которой люди могут планировать встречи на основе доступных слотов, поэтому она должна учитывать внешний контент и, следовательно, должна часто обновляться. Также, конечно, мы должны собирать эти ответы для создания встреч, а почему бы и нет, также создавать с их помощью события Google Календаря.

1. Создание электронной таблицы, в которой будет храниться это

В основном листовая работа здесь…

Создал 2 листа в этой электронной таблице, на одном будут ответы о встречах из форм, на другом будут расчеты доступности.

Я рассмотрю слоты по 1 часу для каждого места, и в опциях в формах будут учтены эти доступные/занятые часы.

Если у нас есть эти две встречи, которые начинаются в 10 и заканчиваются в 12, и давайте для простоты притворимся, что это весь доступный период (с 7 до 12), то последний слот начинается в 11.

Мы собираемся поймать то, используя следующую формулу:

И, наконец, мы можем показать реальную динамическую доступность на основе этих встреч, это информация, которую мы собираемся использовать для изменения форм.

2.1 Теперь о коде

Это та часть, где нам нужно немного больше погрузиться в код, Gsuite Apps Script — это очень хорошо документированное расширение, которое позволяет нам создавать множество вещей, оно использует javascript и имеет модули для нескольких приложений Google [1], в этом уроке я предполагаю базовое понятие обработки списков/циклов и наследования классов.

Во-первых, создайте новые формы и скопируйте эту часть URL-адреса, это идентификатор формы, которую мы собираемся редактировать:

Вернитесь к нашей электронной таблице, нажмите «Расширения», затем «Скрипт приложений». Я буду обрисовывать строки кода блоками…

Вот так мы и будем подключать логику динамических ответов [2]. Основная идея здесь состоит в том, чтобы полагаться на разделы как на способ разветвления возможностей, поэтому для каждой даты мы создадим отдельный раздел с доступными часами, чтобы мы могли настраивать параметры в каждом разделе. Параметры внутри этих разделов динамически обновляются при запуске скрипта.

В этой первой части кода мы устанавливаем переменные среды и получаем информацию о формах. Эта логика может работать с уже установленной формой, или мы также можем создавать вопросы с помощью скрипта (об этом строка 15). Элемент, собранный в строке 20, очень важен, с ним мы будем задавать логику ветвления на каждый день.

Ps.: Для правильного доступа к каждому элементу необходимо правильно указать тип, этого недостаточно для доступа к элементу, также необходимо открыть его как правильный тип, в этом случае раскрывающийся список, называемый в документах как ЭлементСписка().

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

Ps.: возврат данных в виде отдельных массивов был моим предпочтительным способом обработки информации впоследствии, но это можно было сделать и иначе; преобразование даты в строку — важный шаг для правильной работы этой логики, поскольку мы переходим к разделам по строке даты.

Затем мы, наконец, построим разделы, используя доступность, которую мы собрали:

Идея здесь состоит в том, чтобы перебрать даты, и для каждой даты мы создадим или обновим раздел с этой датой в качестве заголовка и доступными часами в качестве параметров. Каждый раздел (элемент page_break_item) будет иметь заголовок в виде даты и только один вопрос о доступности в час (элемент hours_dropdown). Сначала мы создаем разделы, а затем обновляем вопрос «Доступные даты:» с помощью этого списка, в котором для каждого параметра есть связанный раздел с настроенным setGoToPage.

2.2 Сбор ответов

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

Этот фрагмент кода получает объект «e» каждый раз, когда срабатывает триггер, мы будем использовать этот объект, чтобы получить информацию об ответе и добавить ее в электронную таблицу. Для этого нам нужно запустить эту часть кода один раз только для установки триггера. Имя функции должно совпадать с именем триггера.

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

И, наконец, нам нужно настроить еще один триггер, который будет обновлять параметры формы по мере поступления новых ответов, его можно установить в разделе «Триггеры» (левая панель):

3 Подведение итогов

Это всего лишь небольшое введение в мир Apps Script, следующим очевидным шагом будет использование этих строк для фактического создания событий в Календаре Google, но из-за размера я останавливаюсь на этом. В использовании интерфейса Google есть некоторые недостатки, он простой, но мы получим ограниченные ресурсы, такие как не щедрые тайм-ауты. Но имейте в виду, что это инструмент для прототипирования, для создания кейсов и доказательств, так что хороший код.

Ps: извините за мое ужасное кодирование, я начал с js около 4 месяцев, и я все еще использую стандарты заглавных букв в методах/переменных.

Исходный код будет доступен в моем репозитории на git [3].

Рекомендации

[1] https://developers.google.com/apps-script/reference

[2] https://developers.google.com/apps-script/reference/forms/page-break-item

[3] исходный код: https://github.com/hiramshirata/medium_articles/blob/master/dynamicForm.js