Продолжаем знакомиться с Google Script. Создадим форму обратной связи для сайта, используя стандартный инструмент Google Docs - формы. Кроме того наша форма будет не только собирать информацию в таблицу, но и своевременно оповещать нас о поступлении информации на E-mail, посредством SMS, создавать новое событие в Календаре, а также вносить контактные данные в Контакты.
Заходим на Google Drive, создаем таблицу.
Для контраста с предыдущей статьей, посвященной SpreadsheetApp, будем обращаться к единственному листу таблицы по имени, для чего назовем его MyForm.
Заполняем заголовки столбцов: Name - Email - Text.
Создаем форму: Инструменты - Создать форму. Остается слегка подрихтовать внешний вид формы (на Ваш вкус):
После создания формы в таблице появился еще один столбец - Отметка времени, в котором будет фиксироваться дата занесения данных.
Кроме того в меню появился пункт Форма для доступа к настройкам нашей формы.
Заходим в Календарь Google.
Открываем страницу настроек (в правом верхнем углу - "Настройки"),
открываем "Настройка для мобильных устройств" и вводим номер мобильного телефона, на который мы планируем получать уведомления.
Создаем новый календарь. Я назвал его Feedback.
В контекстном меню созданного календаря выбираем "Напоминания и оповещения".
На открывшейся странице настроек выбираем "Добавить напоминание" - SMS - 1 мин. и отмечаем чекбокс SMS в строке "Новые мероприятия".
Далее пишем функцию отправки оповещения, назовем ее sendMail:
Для выполнения скрипта требуется авторизация:
Предоставляем доступ:
Теперь форму можно встроить в веб-страницу:
Однако для теста нам достаточно перейти к активной форме: Форма - Перейти к активной форме:
После отправки формы мы получаем следующее:
- в таблице:
- в Gmail:
- в контактах:
- в календаре:
- плюс напоминание посредством SMS с темой Feedback.
That's all folks :).
Заходим на 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:
- в контактах:
- в календаре:
That's all folks :).
Привет. При запуске скрипта ошибка "TypeError: Не удается вызвать метод "getDataRange" объекта null.Закрыть" как исправить?
ОтветитьУдалитьСтало быть в активной таблице (getActiveSpreadsheet()) нет листа по имени MyForm (getSheetByName('MyForm')).
УдалитьБлагодарю, за пример!
ОтветитьУдалитьвылезли вот такие косяки:
1. как у вышеотписавшегося "sendMail TypeError: Не удается вызвать метод "getSheetByName" объекта null. (строка 2, файл Код) formEdit"
и при этом письмо отправляется, и доставляется в полном порядке.
2. в календаре создаётся мероприятие, но СМС не приходит. настройки проверил 100 раз, для проверки даже сделал уведомление при изменении события кем-то, дал доступ к календарю другому аккаунту, изменил и смс пришло. А о новом событии не приходит.
Есть идеи?
Благодарю за вопрос. Отвечаю спустя 3 дня, сорри, несколько дней отсутствовал в сети.
Удалить1. Отвечу как и вышеотписавшемуся - в книге (getActiveSpreadsheet()) есть лист по имени MyForm (getSheetByName('MyForm')) ?
2. Идей нет, может у гуглов на тот момент косяк был с СМС? Не первый год уже использую фичу с СМС - проблем не было. Например здесь: http://blog.daspot.ru/2012/02/e-mail-sms.html рассказывал как отправлять СМС из любого приложения. Проверьте еще раз "Напоминания и оповещения" в настройках календаря.
Наверняка Вы уже решили оба "косяка", если нет - пишите, подумаем, решим.
1. да, я читал что было выше и даже книгу так назвал на всякий случай. и как я писал, письмо то приходит, событие в календаре и всё остальное создаётся, т.е. к листу он обращается, а ошибку всё равно выдаёт :(
Удалитьhttp://clip2net.com/clip/m32170/1371421981-clip-7kb.png
2. всё вроде ок, но не приходит :(
http://clip2net.com/clip/m32170/1371421691-clip-19kb.png
К сожалению не могу посмотреть скрины на 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
а в чём проблем с clip2net? куда вложить что б смогли смотреть?
Удалитьзаменил getActiveSpreadsheet, ни чего нового, всё отправляется и работает, но отчёт об ошибке всё равно приходит.
посмотрел на ваш скрин с настройками оповещений по смс, и когда добавил у себя «По умолчанию использовать для напоминаний:SMS перед каждым мероприятием» то тоже работает, но я думаю что понятно что смс приходит не из-за изменения календаря, а за минуту до мероприятия.
PS: и сделайте что-нибудь с капчей, а то и аккаунт авторизирован и премодерация ещё и капча не самая лёгкая.