СМС-рассылка с Google Sheets API

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

Минимальное исследование существующих веб-инструментов работы с электронными таблицами показало, что разработка на их основе потребует времени в разы больше. Например, связка PHPExcel и какой-нибудь AJAX-таблицы выливалась в разработку функционала полноценного сайта. К тому же требующего отдельного хостинга в целях безопасности. Теоретически рассматривался вариант MS Excel + VB script, но и тут были свои подводные камни. В итоге выбор пал на Google Sheets.

Прежде всего нужно иметь учетную запись Google. Далее, зайдя в нее, переходим на http://sheets.google.com/. Сюда можно загрузить .xls-файл. После загрузки таблицы был написан первый скрипт отправки смс. Представляет собой формирование и отсылку определенного http POST запроса.

function sendHttpOneSms(msgStr, receiver) {
   var payload = 
   { // данные для sms-рассылки
     "user" : "xxxx",
     "pass" : "*******",
     "action": "post_sms",
     "message": msgStr,
     "target": receiver
   };

   var options = 
   { // опции для http-запроса
     "method" : "post", 
     "payload" : payload,
     "muteHttpExceptions" : true
   };

  var result = UrlFetchApp.fetch("http://сайт-рассылки/sendsms/", options);
   Logger.log(result.getContentText());
 }

Далее формируем простейший ежедневный триггер.

function dailySend()
{
  var sendText = "Текст простого уведомления";
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues(); // получение массива ячеек активного листа
  var dateToday = new Date(); // дата на сегодня
  
  for(var i=0; i<data.length; i++) // цикл по всем строкам
  {
   var dateSend = parseDate(data[i][3]); 
    if(compareDate(dateToday, dateSend)) // если дата совпадает с сегодняшней, то
      sendHttpOneSms(sendText, data[i][5]); // осуществить отправку смс
  }
}

В этом триггере есть две функции. Первая — простая — compareDate. Ее задача — сравнить две даты не учитывая время.

Вторая функция сложнее, и, несмотря на маленький объем, на её написание у меня ушло довольно много времени. Дело в том, что при попытке прочитать дату из ячейки я получал непонятное пятизначное число, автоматически не преобразуемое ни к какому другому типу. Google API здесь нагло врали, говоря, что должен быть объект типа Date. А здесь и не Date, и даже не строка, которую тоже можно было бы ожидать, а число. Оно очевидно не соответствовало unix-формату (количество миллисекунд с полуночи 1 января 1970 года). Эмпирически было установлено, что число, скорее всего, представляет собой количество дней с 1 января 1900 года. После этого функция преобразования даты в удобоваримый формат стала очевидной:

function parseDate(dec)
{
  return new Date((dec-70*365-19)*24*3600*1000);
}

Теперь осталось запустить наш триггер. Это можно сделать с помощью окошка «Триггеры текущего проекта» (вызывается при нажатии на изображение часов под меню). Также это можно сделать программно, выполнив скрипт:

ScriptApp.newTrigger("dailySend")
   .timeBased() // Тип триггера - по времени
   .atHour(12) // время вызова - около 12 часов
   .everyDays(1)  // Частота вызова - раз в день
   .create();

Полезные ссылки


Google API для электронных таблиц
Класс ClockTriggerBuilder
Google класс UrlFetchApp для использования http-запросов

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 3

    0
    По поводу даты, это довольно широко распространенное представление времени.
    Подробнее про историю возникновения можно почерпнуть здесь.
      0
      Отличная штука — Google API! Я на подобным образом делал подтверждение отправки гугл формы по email с отправкой всех ответов и ссылки на редактирование. Когда начинал, даже не думал что задача вообще решится, а в итоге решение оказалось очень элегантным
        +4
        Добра и процветания!

        Позвольте добавить немного определений.

        Во-первых, и это очень важно, различают понятия Google Drive и Google Docs. При этом параллельно существуют понятия Google Docs, Google Sheets, Google Slides, Google Forms и некоторые другие #ссылка
        Во-вторых, что существенно, вы указываете путь http://docs.google.com/, хотя уместнее указать http://sheets.google.com/
        В-третьих, наименование статьи «Google Docs API» при поиске приведет нас совершенно не туда https://www.google.ru/search?q=Google+Docs+API
        В-четвертых, вы скромно умалчиваете про комплексное название технологии Google Apps Script, которая по мнению самих авторов называется не меньше не больше как "a scripting language based on JavaScript that lets you do new and cool things with Google Apps like Docs, Sheets, and Forms". Кстати, непосредственно с API разработчик может и не столкнуться, оставаясь в пределах рабочей среды языка. Это часто не так, но для простых задач API будет вызвано лишь косвенно.
        В-пятых, из API в коде только интерфейс прикладного программирования сервиса, запущенного для сайта сайт-рассылки

        Было бы здорово прочитать эту статью еще раз, но при этом понимать, что за чем идет и к чему относится.

        С уважением.

        НАИМЕНОВАНИЕ ПРИЛОЖЕНИЙ СЕРВИСА «ДИСК GOOGLE»
        Форматирование дат в Google Apps Script

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

        Самое читаемое