Разработка

Инструкция по работе с AppScript.

Добавляем данные в удалённый промпт с помощью скрипта. Например: забираем задачи из Google Календаря, парсим сайт или соцсеть, читаем RSS. Также через наш бот-помощник можно сформировать скрипт под свои цели.

01

Загрузка задач из Google Календаря

function updateCalendarEvents() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();

  // Найдите начало и конец блока контента
  var startElement = body.findText('##WEB_CONTENT_START##');
  var endElement = body.findText('##WEB_CONTENT_END##');

  if (!startElement || !endElement) {
    Logger.log('Не найдены маркеры начала или конца блока контента');
    return;
  }

  var startIndex = body.getChildIndex(startElement.getElement().getParent());
  var endIndex = body.getChildIndex(endElement.getElement().getParent());

  // Удалите существующий контент между маркерами
  for (var i = endIndex - 1; i > startIndex; i--) {
    body.removeChild(body.getChild(i));
  }

  // Получите события календаря на следующие 60 дней
  var calendar = CalendarApp.getDefaultCalendar();
  var now = new Date();
  var endDate = new Date(now.getTime() + (60 * 24 * 60 * 60 * 1000)); // 60 дней вперед
  var events = calendar.getEvents(now, endDate);

  // Вставьте события в документ
  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    var title = event.getTitle();
    var startTime = event.getStartTime();
    var endTime = event.getEndTime();
    var description = event.getDescription() || 'Нет описания';

    var eventString = Utilities.formatDate(startTime, Session.getScriptTimeZone(), 'dd.MM.yyyy HH:mm') + ' - ' +
      Utilities.formatDate(endTime, Session.getScriptTimeZone(), 'HH:mm') + '\n' +
      title + '\n' +
      description + '\n\n';

    body.insertParagraph(startIndex + i + 1, eventString);
  }
}

function createDailyTrigger() {
  // Удаляем все существующие триггеры
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  // Создаем новый ежедневный триггер на 6:00 утра
  ScriptApp.newTrigger('updateCalendarEvents')
    .timeBased()
    .everyDays(1)
    .atHour(6)
    .create();
}
02

Загрузка данных из Google Sheets

function updateGoogleSheetData() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();

  // Найдите начало и конец блока контента
  var startElement = body.findText('##TABLE_START##');
  var endElement = body.findText('##TABLE_END##');

  if (!startElement || !endElement) {
    Logger.log('Не найдены маркеры начала или конца блока контента');
    return;
  }

  var startIndex = body.getChildIndex(startElement.getElement().getParent());
  var endIndex = body.getChildIndex(endElement.getElement().getParent());

  // Удалите существующий контент между маркерами
  for (var i = endIndex - 1; i > startIndex; i--) {
    body.removeChild(body.getChild(i));
  }

  // Получите данные из Google Таблицы
  var sheetId = '1-XXXXXXXXXXXXXXXXXXXXXXXXX'; // Замените на ID вашей таблицы
  var range = 'Лист1!A1:B300'; // Замените на нужный диапазон
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName('Лист1');
  var data = sheet.getRange(range).getValues();

  // Вставьте данные в документ
  var insertIndex = startIndex + 1; // Увеличиваем индекс на 1, чтобы начать вставку после ##TABLE_START##

  for (var i = 0; i < data.length; i++) {
    var row = data[i].filter(cell => cell).join(' | ').trim();
    if (row) {
      body.insertParagraph(insertIndex++, row);
    }
  }
}

function createDailyTrigger() {
  // Удаляем все существующие триггеры
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  // Создаем новый ежедневный триггер на 6:00 утра
  ScriptApp.newTrigger('updateGoogleSheetData')
    .timeBased()
    .everyDays(1)
    .atHour(6)
    .create();
}
03

Отправка уведомлений в Telegram

function sendTelegramMessage(chatId, message) {
  if (!message) {
    Logger.log("Ошибка: текст сообщения пустой");
    return;
  }
  if (!chatId) {
    Logger.log("Ошибка: chatId не задан");
    return;
  }

  var token = "7615497024:XXXXXXXXXXXXXXXXXXXXXXX"; // Вставь сюда токен своего Telegram-бота
  var url = "https://api.telegram.org/bot" + token + "/sendMessage";
  var payload = {
    method: "POST",
    contentType: "application/json",
    payload: JSON.stringify({
      chat_id: chatId,
      text: message,
    }),
    muteHttpExceptions: true
  };

  try {
    var response = UrlFetchApp.fetch(url, payload);
    Logger.log("Ответ от Telegram: " + response.getContentText());
  } catch (e) {
    Logger.log("Ошибка при отправке сообщения в Telegram: " + e.toString());
  }
}

function doPost(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Проекты");
  var data = JSON.parse(e.postData.contents);

  if (!data.message || !data.message.chat || !data.message.chat.id || !data.message.text) {
    Logger.log("Ошибка: данные сообщения не полные");
    return;
  }

  var chatId = data.message.chat.id;
  var messageText = data.message.text;

  var range = sheet.getDataRange();
  var values = range.getValues();
  for (var i = 1; i < values.length; i++) {
    if (values[i][10] == chatId) { // Колонка K — chatId
      sheet.getRange(i + 1, 9).setValue(messageText); // Колонка I — Отчёт
      sendTelegramMessage(chatId, "Ваш отчёт успешно получен!");
      break;
    }
  }
}

function sendMessageToProTalk(chatId, messageId, message) {
  var apiKey = "11622_IXEpowAR8ZvHkjYs6WOgvsq6TBV4KCKy"; // Вставьте ваш API-ключ
  var url = "https://api.pro-talk.ru/api/v1.0/send_message";

  var payload = {
    "chat_id": chatId,
    "message_id": messageId,
    "message": message
  };

  var options = {
    method: "POST",
    contentType: "application/json",
    headers: {
      "Authorization": "Bearer " + apiKey
    },
    payload: JSON.stringify(payload)
  };

  try {
    var response = UrlFetchApp.fetch(url, options);
    Logger.log("Ответ от ProTalk: " + response.getContentText());
  } catch (e) {
    Logger.log("Ошибка при отправке сообщения в ProTalk: " + e.toString());
  }
}

function sendMessagesFromSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Проекты");
  var data = sheet.getDataRange().getValues();

  for (var i = 1; i < data.length; i++) {
    var chatId = data[i][10]; // Колонка K — chat_id
    var messageId = "m" + (i + 1); // Создаём уникальный message_id
    var message = "Напоминание: осталось менее часа до дедлайна вашей задачи!";

    if (chatId) {
      sendMessageToProTalk(chatId, messageId, message);
    } else {
      Logger.log("Пропущена строка " + (i + 1) + ": chatId пустой");
    }
  }
}
04

Загрузка данных с сайта

function updateWebsiteContent() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();

  // Найдите начало и конец блока контента
  var startElement = body.findText('##WEBSITE_CONTENT_START##');
  var endElement = body.findText('##WEBSITE_CONTENT_END##');

  if (!startElement || !endElement) {
    Logger.log('Не найдены маркеры начала или конца блока контента');
    return;
  }

  var startIndex = body.getChildIndex(startElement.getElement().getParent());
  var endIndex = body.getChildIndex(endElement.getElement().getParent());

  // Удалите существующий контент между маркерами
  for (var i = endIndex - 1; i > startIndex; i--) {
    body.removeChild(body.getChild(i));
  }

  // Получите HTML-контент с вашего сайта
  var url = 'https://wl.atiks.org/ru'; // Замените на ваш URL
  var response;
  try {
    response = UrlFetchApp.fetch(url);
    if (response.getResponseCode() !== 200) {
      Logger.log('Ошибка получения контента: ' + response.getResponseCode());
      return;
    }
    var html = response.getContentText();
    if (!html) {
      Logger.log('Получен пустой контент');
      return;
    }
  } catch (e) {
    Logger.log('Ошибка при запросе: ' + e.toString());
    return;
  }

  var text = extractTextFromHtml(html);

  // Проверка на пустой текст после обработки
  if (!text.trim()) {
    Logger.log('После обработки HTML получен пустой текст');
    return;
  }

  // Вставьте очищенный текст в документ
  body.insertParagraph(startIndex + 1, text);
  Logger.log('Контент успешно обновлён');
}

function extractTextFromHtml(html) {
  // Удаляем все HTML-теги
  var text = html
    // Удаляем style и script теги с содержимым
    .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
    .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
    // Заменяем основные HTML-элементы на переносы строк
    .replace(/<div>/ig, '\n')
    .replace(/<\/div>/ig, '\n')
    .replace(/<\/li>/ig, '\n')
    .replace(/<li>/ig, ' * ')
    .replace(/<\/ul>/ig, '\n')
    .replace(/<\/p>/ig, '\n')
    .replace(/<br\s*[\/]?>/gi, '\n')
    // Удаляем все оставшиеся HTML-теги
    .replace(/<[^>]+>/ig, '');

  // Декодируем HTML-сущности
  text = text
    .replace(/&nbsp;/g, ' ')
    .replace(/&amp;/g, '&')
    .replace(/&lt;/g, '<')
    .replace(/&gt;/g, '>')
    .replace(/&quot;/g, '"')
    .replace(/&#39;/g, "'")
    .replace(/&apos;/g, "'");

  // Удаляем лишние пробелы и пустые строки
  text = text
    .replace(/\n\s*\n/g, '\n') // Удаляем множественные пустые строки
    .replace(/^\s+|\s+$/g, '') // Удаляем пробелы в начале и конце
    .replace(/[ \t]+/g, ' '); // Заменяем множественные пробелы одним

  return text;
}

function createDailyTrigger() {
  // Удаляем все существующие триггеры
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  // Создаем новый ежедневный триггер на 6:00 утра
  ScriptApp.newTrigger('updateWebsiteContent')
    .timeBased()
    .everyDays(1)
    .atHour(6)
    .create();

  Logger.log('Ежедневный триггер успешно создан на 6:00');
}

// Дополнительная функция для тестирования
function testUpdate() {
  updateWebsiteContent();
}