Google Разработчик Эксперт для Google Workspace и Google Apps Script.

«Архитектор цифрового мира»



https://stomaks.me/ - портфолио.

https://g-apps-script.com/ - русскоязычный учебник по Google Apps Script.

Контакты

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (7)

Лучшие ответы пользователя

Все ответы (39)
  • Отправить email из Google таблиц по условию?

    stomaks
    @stomaks
    Google Apps Script Expert (stomaks.me)
    Вот рабочий код:
    /**
     * Конфигурация.
     */
    const CONFIG = {};
    
    // Рабочие листы
    CONFIG.sheets = [
      `Журнал заказов`
    ];
    
    CONFIG.cols = {};
    
    // Порядок столбцов
    CONFIG.cols[`Заказ`] = 1;
    CONFIG.cols[`Email`] = 2;
    CONFIG.cols[`Статус`] = 3;
    
    
    
    /**
     * Отправляет письмо при смене статуса.
     * 
     * @param {Object} event
     */
    function onEditTrigger(event = {}) {
      try {
        if (!event.source)
          event.source = SpreadsheetApp
            .getActiveSpreadsheet();
    
        if (!event.range)
          event.range = SpreadsheetApp
            .getActiveRange();
    
        // Открыть текущий лист
        const sheet = event.source
          .getActiveSheet();
    
        // Обходим листы не из списка
        if (!CONFIG.sheets.includes(sheet.getName()))
          return;
    
        // Номер активной строки
        const row = event.range
          .getRow();
    
        // Обходим закрепленные строки
        if (row <= sheet.getFrozenRows())
          return;
    
        // Номер активного столбца
        const col = event.range
          .getColumn();
    
        // Обхотим столбцы (не статус)
        if (col !== CONFIG.cols[`Статус`])
          return;
    
        // Получаем данные строки
        const values = sheet
          .getRange(`${row}:${row}`)
          .getValues()[0];
    
        const recipient = values[CONFIG.cols[`Email`] - 1];
        const status = values[CONFIG.cols[`Статус`] - 1];
    
        const subject = `Заголовок письма`;
        const body = `Здравствуйте, статус вашего заказа изменен на "${status}"`;
    
        // Отправляем письмо
        const response = MailApp
          .sendEmail(recipient, subject, body);
    
        if (!response)
          throw new TypeError(`Не удалось отправить письмо!`);
    
        console.log(`Письмо успешно отправлено!`, recipient, subject, body);
      }
      catch (error) {
        console.error(error.stack);
    
        throw new Error(error.toString());
      }
    };


    Чтобы это сработало нужно:
    1. Открыть редактор скриптов в таблице и вставить туда код выше.
    617ff57ce528c038052771.png

    2. Создать новый триггер
    617ff5559eed5232989193.png

    ---
    Максим Стоянов (stomaks), pазработчик Google Apps Script.
    g-apps-script.com
    stomaks.me
    Ответ написан
    Комментировать
  • Как достать нужные данные из UrlFetchApp или JSON.parse?

    stomaks
    @stomaks
    Google Apps Script Expert (stomaks.me)
    Вы двигаетесь в верном напралвении, но есть несколько замечаний.

    Первое, url запроса (в вашем случае: 'https://api.telegram.org/bot' + token + '/') не содержит функцию для запуска.
    Должно быть так:
    'https://api.telegram.org/bot' + token + '/getUpdates'

    или
    'https://api.telegram.org/bot' + token + '/getMe'
    или
    'https://api.telegram.org/bot' + token + '/sendMessage'

    и тд.

    Второе замечание, data - второй параметр для функции fetch(url, data) класса UrlFetchApp должен быть объектом.
    И желательно чтобы в этом объекте метод запроса был post.
    В идеале вод так:
    {
      "method": `POST`,
      "contentType": `application/json`,
      "muteHttpExceptions": true,
      "payload": JSON.stringify(data)
    }

    При этом payload указываем если вы хотите что-то передать телеграму (зависит от выбранной функции в url запроса).

    Третье, После того как метод fetch(url, data) вернул результат response, из него нужно вытащить данные методом response .getContentText(). И аш потом уже парсить через JSON.parse.

    Полный код выглядит так:
    /**
       * Простой метод проверки токена авторизации вашего бота. Не требует параметров. Возвращает основную информацию о боте в виде объекта User.
       * 
       * @return {Object.User}
       */
      function getMe() {
        const response = UrlFetchApp
          .fetch(
            `https://api.telegram.org/bot${TOKEN}/getMe`,
            {
              "method": `POST`,
              "contentType": `application/json`,
              "muteHttpExceptions": true
            }
          );
    
        let result = response
          .getContentText();
    
        result = JSON
          .parse(result);
    
        if (!result.ok)
          throw new Error(result.description);
    
        return result;
      }

    Только не забудьте заменить слово TOKEN на имя переменной с вашим токеном.

    Для отправки сообщения в бот используйте:
    /**
       * Используйте этот метод для отправки текстовых сообщений. В случае успеха отправленное сообщение возвращается.
       * 
       * @param {String|Number} chatId Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
       * @param {String} text Текст отправляемого сообщения, 1-4096 знаков после синтаксического анализа сущностей.
       * @param {Object} options
       * 
       * @return {Object.Message}
       */
      function sendMessage(chatId, text, options) {
        if (!arguments.length)
          throw new TypeError(`Параметры () не соответствуют сигнатуре метода TelegramBot.sendMessage.`);
    
        const data = {};
    
        if (!([`string`, `number`].includes(typeof chatId) && String(chatId).trim().length))
          throw new TypeError(`Параметры (${typeof chatId}) не соответствуют сигнатуре метода TelegramBot.sendMessage.`);
    
        data.chat_id = String(chatId).trim();
    
        if (!([`string`, `number`].includes(typeof text) && String(text).trim().length))
          throw new TypeError(`Параметры (${typeof chatId}, ${typeof text}) не соответствуют сигнатуре метода TelegramBot.sendMessage.`);
    
        data.text = String(text).trim();
    
        if (options) {
          if (typeof options !== `object`)
            throw new TypeError(`Параметры (${typeof chatId}, ${typeof text}, ${typeof options}) не соответствуют сигнатуре метода TelegramBot.sendMessage.`);
    
          if ((item => typeof item === `string` && item.trim().length)(options.parse_mode))
            data.parse_mode = options.parse_mode;
    
          if (typeof options.entities === `object`)
            data.entities = options.entities;
    
          if (typeof options.disable_web_page_preview === `boolean`)
            data.disable_web_page_preview = options.disable_web_page_preview;
    
          if (typeof options.disable_notification === `boolean`)
            data.disable_notification = options.disable_notification;
    
          if ((item => typeof item === `number` && Number.isInteger(item) && item > 0)(options.reply_to_message_id))
            data.reply_to_message_id = options.reply_to_message_id;
    
          if (typeof options.allow_sending_without_reply === `boolean`)
            data.allow_sending_without_reply = options.allow_sending_without_reply;
    
          if (typeof options.reply_markup === `object`)
            data.reply_markup = options.reply_markup;
        }
    
        const response = UrlFetchApp
          .fetch(
            `https://api.telegram.org/bot${TOKEN}/sendMessage`,
            {
              "method": `POST`,
              "contentType": `application/json`,
              "muteHttpExceptions": true,
              "payload": JSON.stringify(data)
            }
          );
    
        let result = response
          .getContentText();
    
        result = JSON
          .parse(result);
    
        if (!result.ok)
          throw new Error(result.description);
    
        return result;
      }


    Ну и напоследок, если умеете пользоваться библиотеками gas вот моя для телеграм ботов:
    TelegramApi (1d78ytTohb5IBskJadNg1hwu-LRyqYONmnQQWbkVUlmX3Ft2Q6AEOgW9m)
    (она еще немного сырая, но юзать можно, документации пока нет, сори, открывайте код и читайте описание методов)

    ---
    Максим Стоянов (stomaks), pазработчик Google Apps Script.
    g-apps-script.com
    stomaks.me
    Ответ написан
    6 комментариев

Лучшие вопросы пользователя

Все вопросы (1)