вторник, 4 июня 2019 г.

Объединяем форму и календарь google


Формы google - простой, доступный инструмент для создания различных опросников. Конечно и он не лишён недостатков, я нашёл один существенный - нет возможности встраивать <iframe> в саму форму. Сколько возможностей открылось бы для простого обывателя.


Представим себе что Вы мастер своего дела, хотя что я пишу Вы и есть мастер своего дела. К Вам выстраиваются очереди из жаждущих клиентов, желающих дать Вам возможность заработать. Но настаёт такой момент, когда Вам не удаётся управлять своим расписанием и кажется что вот-вот придётся начать оплачивать работу личного секретаря. 
Вы управляете небольшой компанией, которая занимается очень хорошим делом. Клиенты идут к Вам, не обращая внимания на конкурентов. Ввиду чрезмерной занятости, Вам не удаётся правильно организовать работу с клиентами, так как очередь к Вам выстроилась на месяц вперёд.

Каким образом выстроить работу чтобы и клиенты знали когда к Вам можно обратиться, и не оплачивать работу секретаря. Можно создать google форму, в которой клиенту можно предложить заполнить желаемый день и время.
Например, такую.
Но проблема в том что клиент даже приблизительно не может себе представить Вашу загруженность.
Можно предоставить клиенту ссылку на один из Ваших рабочих календарей google. Но это скорее всего только запутает человека, да и в календарях может содержаться конфиденциальная информация (потому что это удобно для Вас).

Нужно объединить форму с календарём на странице одного из Ваших сайтов. Почему сайта - да потому что так проще встроить нужные Вам <iframe>. В настройках каждого google календаря, а их может быть больше чем один, можно получить html-код для размещения календаря на страницах сайта.

Например, такой


<iframe frameborder="0" height="600" scrolling="no" src="https://calendar.google.com/calendar/embed?height=600&wkst=1&bgcolor=%23ffffff&ctz=Europe%2FMoscow&src=dGJnOWE0bWxpbnVkZzEwYWJnczMxbWFjNzRAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&src=cnUub3J0aG9kb3hfY2hyaXN0aWFuaXR5I2hvbGlkYXlAZ3JvdXAudi5jYWxlbmRhci5nb29nbGUuY29t&src=cnUucnVzc2lhbiNob2xpZGF5QGdyb3VwLnYuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&color=%23EF6C00&color=%230B8043&color=%23009688&showNav=1&showPrint=0&showCalendars=0&title=%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20%D0%BA%20%D0%BC%D0%B0%D1%81%D1%82%D0%B5%D1%80%D1%83" style="border-width: 0;" width="800"></iframe>

Остаётся дело за малым - прочитать статью о кастомизации google форм и создать свою
























Исходный код

<iframe src="https://calendar.google.com/calendar/embed?height=600&wkst=1&bgcolor=%23ffffff&ctz=Europe%2FMoscow&src=dGJnOWE0bWxpbnVkZzEwYWJnczMxbWFjNzRAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&src=cnUub3J0aG9kb3hfY2hyaXN0aWFuaXR5I2hvbGlkYXlAZ3JvdXAudi5jYWxlbmRhci5nb29nbGUuY29t&src=cnUucnVzc2lhbiNob2xpZGF5QGdyb3VwLnYuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&color=%23EF6C00&color=%230B8043&color=%23009688&showPrint=0&showTabs=1&showCalendars=1&showTz=1&showDate=1" style="border-width:0" width="800" height="600" frameborder="0" scrolling="no"></iframe>

<form action="https://docs.google.com/forms/d/e/1FAIpQLScc8eCnb6vQtOgV_DUHx1ojBI6zSLzCs6dAmoLox73B5u87hQ/formResponse" class="form">

<label>Ваше имя</label>
<input name="entry.588593630" type="text" />

<label>Email</label>
<input name="entry.739575401" required="" type="email" />

<label>№ телефона</label>
<input name="entry.1270724335" required="" />

<label> Желаемый день записи</label>
<input name="entry.1782723370" required="" type="date" />

<label> Желаемое время записи</label>
<input name="entry.884475298" required="" type="time" />


<input type="submit" value="Записаться" />

</form>


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


function myOnFormSubmit(e) {
  var answers=e.values;
  var day=Date.parse(answers[4]+'T'+answers[5]);
  var calendar;
  var calendars=CalendarApp.getCalendarsByName('Моя занятость');
  if (calendars.length==0){
    calendar=CalendarApp.createCalendar('Моя занятость');
  }
  else{
    calendar=calendars[0];
  }
  var event=calendar.createEvent('Занят', new Date(day),new Date(day+1*1000*60*60))
  var event2=CalendarApp.getDefaultCalendar().createEvent(answers[1], new Date(day),new Date(day+1*1000*60*60)).setDescription(answers[2]+'\n'+answers[3]).addGuest(answers[3])
}

Этот скрипт помещается в таблицу с ответами из формы, устанавливается триггер на функцию myOnFormSubmit на отправку формы. По умолчанию считается одно мероприятие - 1 час. Можно было бы добавить время окончания, но это уже мелочи. :)
Надеюсь кому-нибудь будет полезна статья.

30 комментариев:

  1. Добрый день! Воспользовался вашим скриптом, но мне выдает ошибку на этой строчке (var answers=e.values;) следующего содержания:

    "TypeError: Не удается прочитать свойство "values" объекта undefined. (строка 2, файл Код)".

    Не подскажите, в чем может быть проблема?

    ОтветитьУдалить
    Ответы
    1. Здравствуйте.
      Запускать скрипт из редактора скриптов, в данном случае - бесполезное занятие.
      Необходимо устанавливать триггер на отправку формы.

      Удалить
    2. Спасибо большое! Все получилось!

      Удалить
  2. Здравствуйте. Почему может не связывается форма к с календарем? Делали один в один, как указано. Благодарю.

    ОтветитьУдалить
    Ответы
    1. Доброго.
      Один в один делать бесполезно.
      https://blog.webjeda.com/google-form-customize/ читали?
      Возможно про триггер забыли?

      Удалить
    2. Большое спасибо! Все получилось!

      Удалить
    3. Также в журналах Stackdriver Google Aps при отправке формы появляться ошибка (в данном поле, как и вас номер телефона):
      Недействительный аргумент: 927927927
      at myOnFormSubmit(Код:13)
      Помогите пожалуйста решить проблему. Благодарю.

      Удалить
    4. Доброго.
      Что то напутали с прописыванием полей формы, а точнее с номерами id формы. Нет у вас в форме input name=entry.927927927.

      Удалить
    5. Ошибку удалось убрать. Содержалась в скрипте function myOnFormSubmit(e):
      Удалить параметр: .addGuest(answers[3]

      Удалить
    6. Да, проблема возникает если не вводится email.

      Удалить
  3. Приветствую! Есть такая проблема

    function myFunction(e) {
    var answers=e.values;
    var title_event = answers[1];
    var start_ = answers[2];
    var end_ = answers[3];
    //var title_event = 'Обед';
    //var start_ = '18 April 2020 11:11:00';
    //var end_ = '18 April 2020 11:12:00';

    var event = CalendarApp.getDefaultCalendar().createEvent(title_event, new Date(start_), new Date (end_))

    }

    Если раскоментить то все работает нормально, как я понимаю передается из формы неверный формат даты (18.04.2020 11:11:00). Как решить эту проблему?

    ОтветитьУдалить
    Ответы
    1. Доброго времени суток.
      В моей форме и скрипте строчка
      var day=Date.parse(answers[4]+'T'+answers[5]);
      отвечает как раз за то чтобы получить правильную дату со временем в формате js.

      Удалить
  4. Здравствуйте. Я не до конца понял как скрипт настроить под себя. Хотел бы попросить у вас помощи, где я именно сделал ошибку и не добавил что-то важное.
    Присылаю скрины через диск https://drive.google.com/drive/folders/1uBWAfR_9lA7tmpvqs_geFsFDOdARWEA-?usp=sharing

    ОтветитьУдалить
    Ответы
    1. Ошибок форма не выдаёт, но и не добавляет мероприятие в гугл календарь.
      А id "entry." так и не нашёл через обзор кода. Почему-то там такого нет. При попытке занести в поля на сайте, выкидывает в гугл-форму с чистыми полями. И сама форма, заносить данные в таблицу может, а вот в календарь тишина. Помогите, пожалуйста, тупню. В мануалах пробую разобраться, но такой уровень программирования мне пока не по зубам =/

      Удалить
    2. Доброго.
      Вами не правильно определены entry для формы. Попробуйте перечитать статью которую указал по ссылке. У вас всё получится.

      Удалить
    3. А в скрипте таблицы всё в порядке получается?

      Удалить
    4. В моём скрипте, в моей таблице всё в порядке.)
      Добейтесь для начала отсылку ответов в таблицу, а для этого поправьте entry.

      Удалить
    5. Я имел в виду в своём) "entry" найти не могу =/ Как по скринам видно такого показателя на странице гугл-формы у меня нет. Поменял браузеры, всеравно не появляется. В статье написано что он скрыт, и нужно заполнить поля, но и это не помогает. Пока ищу "entry"...

      Удалить
    6. Ура! Нашёл все "entry" через создание ссылки. Кроме времени =/

      Удалить
    7. Что-то упустили, значит. Кто ищет тот всегда найдёт.

      Удалить
    8. В общем в гугл-форме есть возможность к дате прикручивать время. По вашему коду он не прописывается. Пришлось создать отдельные поля, чтобы скрипт сработал.
      В итоге: При заполнении формы на сайте и нажатии на клавишу "Записаться" переходит на гугл-форму, уже заполненную которую я заполнял на сайте, и.. автоматически не отправляет...а просто висит с моими заполненными данными. Отправляются только после нажатия клавиши "отправить". Помнится у вас автоматически она "нажимается".

      Удалить
    9. Абсолютно верно. Всё отправляется автоматически - только что записался к себе на 30 сентября в 13:03.

      Удалить
    10. А "function myOnFormSubmit(e)" нужно прописывать в гугл-форму, или в таблицу?

      Удалить
    11. function myOnFormSubmit(e) {
      var answers=e.values;
      var day=Date.parse(answers[2]+'T'+answers[6]);
      var calendar;
      var calendars=CalendarApp.getCalendarsByName('Учреждения мероприятия');
      if (calendars.length==0){
      calendar=CalendarApp.createCalendar('Учреждения мероприятия');
      }
      else{
      calendar=calendars[0];
      }
      var event=calendar.createEvent('Занят', new Date(day),new Date(day+1*1000*60*60))
      var event2=CalendarApp.getDefaultCalendar().createEvent(answers[1], new Date(day),new Date(day+1*1000*60*60)).setDescription(answers[4]+answers[5])
      }

      Вот то что записано в скрипте. Триггеру дано добро. Но гугл-форма автоматически не отправляет в таблицу, только через отправить. И если отправить, то ничего в гугл-календарь не попадает.

      Удалить
    12. форма на сайте связана с таблицей только посредством entries - пока форма не будет отправлена в таблице ничего не произойдёт. Возможно вы что-то упустили из виду важное.
      Насчёт ошибок скрипта, которые могут возникать при появлении ответов в таблице, вам необходимо смотреть в редакторе скриптов в Выполнениях.

      Удалить
    13. В таблицу записи вносятся, а вот в календарь нет. В чём может быть причина?

      Удалить
    14. Выше в сообщении написал уже где и что смотреть.)

      Удалить
    15. Здравствуйте. Я так и не могу разобраться с кодом. Есть ли возможность на платной основе, чтобы вы мне помогли наладить код, чтобы скрипты работали и мероприятия попадали в календарь?

      Удалить
    16. Доброго. Мой майл - igro83@gmail.com.

      Удалить