Страницы

четверг, 17 января 2013 г.

Google Script. MailApp, ContactsApp, CalendarApp.

Продолжаем знакомиться с Google Script. Создадим форму обратной связи для сайта, используя стандартный инструмент Google Docs - формы. Кроме того наша форма будет не только собирать информацию в таблицу, но и своевременно оповещать нас о поступлении информации на E-mail, посредством SMS, создавать новое событие в Календаре, а также вносить контактные данные в Контакты.

Заходим на Google Drive, создаем таблицу.
Для контраста с предыдущей статьей, посвященной SpreadsheetApp, будем обращаться к единственному листу таблицы по имени, для чего назовем его MyForm.
Заполняем заголовки столбцов: Name - Email - Text.
Создаем форму: Инструменты - Создать форму. Остается слегка подрихтовать внешний вид формы (на Ваш вкус):

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

Заходим в Календарь Google.
Открываем страницу настроек (в правом верхнем углу - "Настройки"),
открываем "Настройка для мобильных устройств" и вводим номер мобильного телефона, на который мы планируем получать уведомления.

Создаем новый календарь. Я назвал его Feedback.
В контекстном меню созданного календаря выбираем "Напоминания и оповещения".
На открывшейся странице настроек выбираем "Добавить напоминание" - SMS - 1 мин. и отмечаем чекбокс SMS в строке "Новые мероприятия".

Далее пишем функцию отправки оповещения, назовем ее sendMail:
function sendMail() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MyForm');
  var values = sheet.getDataRange().getValues();

  // проверяем наличие хотя бы одной записи
  if (values.length < 2)
    return;

  var lastValueIndex = values.length - 1;
  
  var myEmail = 'mymail@gmail.com'; // Ваш e-mail
  var subject = 'Feedback';

  // отправляем письмо 
  MailApp.sendEmail(myEmail, subject, values[lastValueIndex][3],{name: values[lastValueIndex][1], replyTo: values[lastValueIndex][2]});

  // получаем группу контактов
  var group = ContactsApp.getContactGroup(subject);
  // если группы не существует - создаем
  if (!group)
    group = ContactsApp.createContactGroup(subject); 

  // если контакта не существует - создаем
  if (!ContactsApp.getContact(values[lastValueIndex][2])) {
    var contact = ContactsApp.createContact(values[lastValueIndex][1], '*', values[lastValueIndex][2]);
    contact.addToGroup(group); // добавляем в группу
  }

  // получаем календарь
  var calendar = CalendarApp.getCalendarsByName(subject)[0]; 
  // проверяем наличие календаря
  if (!calendar)   
    return;

  var currentDate = new Date();
  // добавим к текущей дате пару минут
  var eventDate =  new Date(currentDate.getTime() + 120000);

  // содаем событие в календаре 
  calendar.createEvent(subject, eventDate, eventDate, {description:  values[lastValueIndex][3]});   
}
Затем создаем триггер выполнения функции sendMail: Окно редактора скриптов - Ресурсы - Триггеры текущего скрипта - Добавить Триггер:
Для выполнения скрипта требуется авторизация:
Предоставляем доступ:
Теперь форму можно встроить в веб-страницу:
Однако для теста нам достаточно перейти к активной форме: Форма - Перейти к активной форме:

После отправки формы мы получаем следующее:
- в таблице:
- в Gmail:
- в контактах:
- в календаре:

- плюс напоминание посредством SMS с темой Feedback.

That's all folks :).

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

  1. Привет. При запуске скрипта ошибка "TypeError: Не удается вызвать метод "getDataRange" объекта null.Закрыть" как исправить?

    ОтветитьУдалить
    Ответы
    1. Стало быть в активной таблице (getActiveSpreadsheet()) нет листа по имени MyForm (getSheetByName('MyForm')).

      Удалить
  2. Благодарю, за пример!
    вылезли вот такие косяки:
    1. как у вышеотписавшегося "sendMail TypeError: Не удается вызвать метод "getSheetByName" объекта null. (строка 2, файл Код) formEdit"
    и при этом письмо отправляется, и доставляется в полном порядке.
    2. в календаре создаётся мероприятие, но СМС не приходит. настройки проверил 100 раз, для проверки даже сделал уведомление при изменении события кем-то, дал доступ к календарю другому аккаунту, изменил и смс пришло. А о новом событии не приходит.
    Есть идеи?

    ОтветитьУдалить
    Ответы
    1. Благодарю за вопрос. Отвечаю спустя 3 дня, сорри, несколько дней отсутствовал в сети.
      1. Отвечу как и вышеотписавшемуся - в книге (getActiveSpreadsheet()) есть лист по имени MyForm (getSheetByName('MyForm')) ?
      2. Идей нет, может у гуглов на тот момент косяк был с СМС? Не первый год уже использую фичу с СМС - проблем не было. Например здесь: http://blog.daspot.ru/2012/02/e-mail-sms.html рассказывал как отправлять СМС из любого приложения. Проверьте еще раз "Напоминания и оповещения" в настройках календаря.
      Наверняка Вы уже решили оба "косяка", если нет - пишите, подумаем, решим.

      Удалить
    2. 1. да, я читал что было выше и даже книгу так назвал на всякий случай. и как я писал, письмо то приходит, событие в календаре и всё остальное создаётся, т.е. к листу он обращается, а ошибку всё равно выдаёт :(
      http://clip2net.com/clip/m32170/1371421981-clip-7kb.png
      2. всё вроде ок, но не приходит :(
      http://clip2net.com/clip/m32170/1371421691-clip-19kb.png

      Удалить
    3. К сожалению не могу посмотреть скрины на clip2net.
      ОК, давайте рассуждать логически: кто из нас летит сегодня в Ленинград? :)

      Во второй строке мы пытаемся получить лист по имени MyForm. Здесь ничего сложного нет. Попробуйте вместо getActiveSpreadsheet() использовать getActive(): var sheet = SpreadsheetApp.getActive().getSheetByName('MyForm');

      Нашел я эту форму и код, попробовал - у меня все работает:
      https://lh5.googleusercontent.com/4TNvEbXjWLw67TXnCwxClCYEQQ9iaCEwhJMmoiLXISI
      https://lh4.googleusercontent.com/SVqceAYfqlHaK8CwOBbmpxG2sKILmj9g7IyepVMs2Io

      И с календарем все отработало как надо:
      https://lh4.googleusercontent.com/9VG4NYUg-3MbtObDO8_QE-uZcuvbDHoKUxWJX1vM8gE
      И смс тоже, вот настройки оповещений календаря:
      https://lh6.googleusercontent.com/j3MQyd-DtwCakdEFSjc1Buf2SBJOdjTH3I_qyxYsmvc

      Удалить
    4. а в чём проблем с clip2net? куда вложить что б смогли смотреть?
      заменил getActiveSpreadsheet, ни чего нового, всё отправляется и работает, но отчёт об ошибке всё равно приходит.
      посмотрел на ваш скрин с настройками оповещений по смс, и когда добавил у себя «По умолчанию использовать для напоминаний:SMS перед каждым мероприятием» то тоже работает, но я думаю что понятно что смс приходит не из-за изменения календаря, а за минуту до мероприятия.

      PS: и сделайте что-нибудь с капчей, а то и аккаунт авторизирован и премодерация ещё и капча не самая лёгкая.

      Удалить

Комментарий будет опубликован после модерации