Co-pilot в Google Sheet (нейросеть в вашей XLS таблице)

УПРАВЛЯЙТЕ БОТАМИ PRO-TALK ПРЯМО ИЗ GOOGLE ТАБЛИЦ! 

Теперь вы можете автоматизировать работу с ботами ProTalk без лишних действий — просто пишите команды в Google Sheets, и боты мгновенно отвечают!  

🔥 Как это работает? 

1️⃣ В любой ячейке пишете:  
   @НОМЕР_БОТА Ваш запрос 
   Например:  
   @12345 Напиши пост про скидки 

2️⃣ Скрипт автоматически отправляет запрос боту ProTalk.  
3️⃣ Ответ появляется прямо в таблице!  

💡 Зачем это нужно? 

✅ Автоматизация рутины — генерация текстов, анализ данных и многое другое прямо в таблицах.  
✅ Работа в команде — коллеги могут отправлять запросы боту без доступа к ProTalk.  
✅ Мгновенные ответы — больше не нужно переключаться между сервисами.  







Скачайте один из шаблонов Google таблицы

📌 Инструкция по использованию Copilot для Google Sheets с ботами ProTalk

Этот скрипт позволяет автоматически обрабатывать команды в Google Таблицах через ваших ботов ProTalk. Например, вы можете отправлять запросы к ИИ прямо из ячеек таблицы!

🔹 Как это работает?

  1. Вы пишете в ячейке команду для бота, начиная с его номера (например, @12345 Напиши пост про скидки).

  2. Скрипт находит эту команду, отправляет её вашему боту в ProTalk.

  3. Бот обрабатывает запрос и возвращает ответ прямо в таблицу.

🔹 Что нужно сделать перед использованием?

1. Подготовьте данные ботов

  • Создайте в вашей Google Таблице лист с названием Боты ProTalk.

  • На этом листе укажите:

  • В столбце A — номера ваших ботов (например, 12345).

  • В столбце B — API-токены этих ботов (можно взять в личном кабинете ProTalk → меню бота → "Интеграция и API").

Пример:

A (ID бота)
   B (Токен)
12345
   pt_abc123...
67890
   pt_xyz456...

2. Как писать команды в таблице?

  • В любой ячейке любой таблицы напишите:
@НОМЕР_БОТА Ваш запрос  

Например:

  • @12345 Напиши коммерческое предложение

  • @67890 Придумай 5 идей для поста

✏️ Можно писать несколько команд через ##:

@12345 Первая команда ## Вторая команда  

🔹 Как запустить обработку команд?

  1. Откройте редактор скриптов
  • В Google Таблице перейдите в меню "Расширения" → "Apps Script".
  1. Вставьте код скрипта
  • Скопируйте предоставленный код и вставьте его в редактор.
  1. Настройте автоматический триггер
  • В редакторе скриптов нажмите на иконку ⏰ "Триггеры" (в левой панели).

  • Выберите "Добавить триггер".

  • Настройте параметры:

    • Выберите функцию: processBotMentions

    • Развертывание: "Головной"

    • Событие: "При изменении"

    • Тип изменения: "При редактировании"

  • Сохраните триггер.

Готово! Теперь скрипт будет автоматически запускаться при любом изменении в таблице и обрабатывать новые команды.

🔹 Пример работы

До:

@12345 Напиши пост про скидки 20%  

После:

✅ @12345 Напиши пост про скидки 20%  

🔥 Акция! Скидки 20% на все курсы! Успейте до конца месяца! ...  

Частые вопросы

Q: Где взять токен бота?→ В Личном кабинете ProTalk → выберите бота → раздел "Интеграция и API".

Q: Можно ли вызывать бота из формул?→ Да! Используйте =A1 (если команда в ячейке A1).

Q: Почему команды не обрабатываются?→ Проверьте:

  • Есть ли лист Боты ProTalk с ID и токенами.

  • Правильно ли написаны команды (@номер_бота текст).

Коды AppScript

Код AppScript для v1

function processBotMentions() {
  const spreadsheet = SpreadsheetApp.getActive();
  
  // Получаем список ботов из листа "Боты ProTalk" (со второй строки)
  let bots = {};
  try {
    const botsSheet = spreadsheet.getSheetByName("Боты ProTalk");
    if (botsSheet) {
      const botData = botsSheet.getRange(2, 1, botsSheet.getLastRow()-1, 2).getValues();
      botData.forEach(row => {
        if (row[0] && row[1]) {
          bots[row[0]] = row[1]; // { botId: token }
        }
      });
    }
  } catch (e) {
    Logger.log("Ошибка при чтении листа с ботами: " + e.toString());
    return;
  }
  
  if (Object.keys(bots).length === 0) {
    Logger.log("Не найдены данные о ботах на листе 'Боты ProTalk'");
    return;
  }

  const sheets = spreadsheet.getSheets();
  const botPattern = new RegExp(`@(${Object.keys(bots).join('|')})`, 'i');
  
  // Собираем все команды со всех листов
  const allCommands = [];
  
  sheets.forEach(sheet => {
    if (sheet.getName() === "Боты ProTalk") return;
    
    const data = sheet.getDataRange().getValues();
    
    data.forEach((row, rowIndex) => {
      row.forEach((cell, colIndex) => {
        if (typeof cell === 'string') {
          const botMatch = cell.match(botPattern);
          if (botMatch && !cell.includes("Бот №") && !cell.startsWith('✅')) {
            const botId = botMatch[1];
            const botToken = bots[botId];
            
            if (!botToken) {
              Logger.log(`Не найден токен для бота ${botId}`);
              return;
            }
            
            // Заменяем ссылки на ячейки типа {A24} на их значения
            const processedCommand = cell.replace(/\{([A-Z]+\d+)\}/g, (match, ref) => {
              try {
                return sheet.getRange(ref).getValue();
              } catch (e) {
                return match;
              }
            });
            
            // Удаляем упоминание бота и добавляем команду
            const command = processedCommand.replace(`@${botId}`, '').trim();
            allCommands.push({
              sheet: sheet,
              command: command,
              row: rowIndex + 1,
              column: colIndex + 1,
              originalText: cell,
              botId: botId,
              botToken: botToken
            });
          }
        }
      });
    });
  });
  
  if (allCommands.length === 0) {
    Logger.log("Новых команд для ботов не найдено");
    return;
  }
  
  // Обрабатываем все команды
  allCommands.forEach(cmd => {
    const resultCell = cmd.sheet.getRange(cmd.row, cmd.column);
    
    // Ставим статус "бот думает"
    resultCell.setValue(`Бот №${cmd.botId} думает...`);
    SpreadsheetApp.flush(); // Принудительно обновляем данные
    
    const chatId = "chat_" + Date.now() + "_" + Math.random().toString(36).substr(2, 5);
    const apiUrl = `https://us1.api.pro-talk.ru/api/v1.0/ask/${cmd.botToken}`;
    const requests = cmd.command.split("##").map(q => q.trim()).filter(Boolean);
    
    let lastResponse = "";
    let allSuccess = true;
    
    for (const q of requests) {
      try {
        const response = UrlFetchApp.fetch(apiUrl, {
          method: "post",
          contentType: "application/json",
          payload: JSON.stringify({
            bot_id: cmd.botId,
            chat_id: chatId,
            message: q
          }),
          muteHttpExceptions: true
        });
        
        const responseData = JSON.parse(response.getContentText());
        if (responseData.done) {
          lastResponse = responseData.done;
        } else {
          lastResponse = "Ошибка: " + (responseData.error || "Неизвестная ошибка");
          allSuccess = false;
          break;
        }
      } catch(e) {
        lastResponse = "Ошибка: " + e.toString();
        allSuccess = false;
        break;
      }
    }
    
    // Обновляем ячейку с результатом
    if (allSuccess) {
      resultCell.setValue(`✅ ${cmd.originalText}\n\n${lastResponse}`);
    } else {
      resultCell.setValue(`❌ ${cmd.originalText}\n\n${lastResponse}`);
    }
  });
  
  Logger.log(`Обработано ${allCommands.length} команд`);
}

Код AppScript для v2

function processBotMentions() {
  const spreadsheet = SpreadsheetApp.getActive();
  
  // Получаем список ботов из листа "Боты ProTalk"
  let bots = {};
  try {
    const botsSheet = spreadsheet.getSheetByName("Боты ProTalk");
    if (botsSheet) {
      const botData = botsSheet.getRange(2, 1, botsSheet.getLastRow()-1, 2).getValues();
      botData.forEach(row => {
        if (row[0] && row[1]) {
          bots[row[0]] = row[1]; // { botId: token }
        }
      });
    }
  } catch (e) {
    Logger.log("Ошибка при чтении листа с ботами: " + e.toString());
    return;
  }
  
  if (Object.keys(bots).length === 0) {
    Logger.log("Не найдены данные о ботах");
    return;
  }

  const sheets = spreadsheet.getSheets();
  const botPattern = new RegExp(`@(${Object.keys(bots).join('|')})`, 'i');
  
  // Собираем все команды
  const allCommands = [];
  
  sheets.forEach(sheet => {
    if (sheet.getName() === "Боты ProTalk") return;
    
    const data = sheet.getDataRange().getValues();
    
    data.forEach((row, rowIndex) => {
      row.forEach((cell, colIndex) => {
        if (typeof cell === 'string') {
          const botMatch = cell.match(botPattern);
          if (botMatch && !cell.includes("Бот №") && !cell.startsWith('✅')) {
            const botId = botMatch[1];
            const botToken = bots[botId];
            
            if (!botToken) {
              Logger.log(`Не найден токен для бота ${botId}`);
              return;
            }
            
            allCommands.push({
              sheet: sheet,
              row: rowIndex + 1,
              column: colIndex + 1,
              originalText: cell,
              botId: botId,
              botToken: botToken
            });
          }
        }
      });
    });
  });
  
  if (allCommands.length === 0) {
    Logger.log("Новых команд не найдено");
    return;
  }
  
  // Обрабатываем команды
  allCommands.forEach(cmd => {
    const resultCell = cmd.sheet.getRange(cmd.row, cmd.column);
    
    // Ставим статус "бот думает"
    resultCell.setValue(`Бот №${cmd.botId} думает...`);
    SpreadsheetApp.flush();
    
    // Парсим команду
    const commandParts = cmd.originalText.split('>>').map(p => p.trim());
    let mainCommand = commandParts[0].replace(`@${cmd.botId}`, '').trim();
    let outputPart = commandParts[1] || '';
    
    // Обрабатываем ссылки в основной команде
    mainCommand = mainCommand.replace(/\{([A-Z]+\d+)\}/g, (match, ref) => {
      try {
        return cmd.sheet.getRange(ref).getValue();
      } catch (e) {
        return match;
      }
    });
    
    // Выделяем ячейку для вывода и follow-up команду
    const outputMatch = outputPart.match(/^\{([A-Z]+\d+)\}(.*)/);
    let outputCellRef = null;
    let followUpCommand = null;
    
    if (outputMatch) {
      outputCellRef = outputMatch[1];
      const rest = outputMatch[2].trim();
      
      // Выделяем follow-up команду после &
      const followUpMatch = rest.match(/^&\s*(@\d+.*)/);
      if (followUpMatch) {
        followUpCommand = followUpMatch[1];
      }
    }
    
    // Выполняем основную команду
    const chatId = "chat_" + Date.now() + "_" + Math.random().toString(36).substr(2, 5);
    const apiUrl = `https://us1.api.pro-talk.ru/api/v1.0/ask/${cmd.botToken}`;
    
    let lastResponse = "";
    let allSuccess = true;
    
    try {
      const response = UrlFetchApp.fetch(apiUrl, {
        method: "post",
        contentType: "application/json",
        payload: JSON.stringify({
          bot_id: cmd.botId,
          chat_id: chatId,
          message: mainCommand
        }),
        muteHttpExceptions: true
      });
      
      const responseData = JSON.parse(response.getContentText());
      if (responseData.done) {
        lastResponse = responseData.done;
        
        // Записываем результат в указанную ячейку
        if (outputCellRef) {
          try {
            cmd.sheet.getRange(outputCellRef).setValue(lastResponse);
          } catch (e) {
            Logger.log(`Ошибка записи в ${outputCellRef}: ${e}`);
            allSuccess = false;
          }
        }
      } else {
        lastResponse = "Ошибка: " + (responseData.error || "Неизвестная ошибка");
        allSuccess = false;
      }
    } catch(e) {
      lastResponse = "Ошибка: " + e.toString();
      allSuccess = false;
    }
    
    // Обновляем исходную ячейку
    if (allSuccess) {
      if (followUpCommand) {
        // Записываем follow-up команду
        resultCell.setValue(followUpCommand);
      } else if (!outputCellRef) {
        // Если не указана ячейка вывода, показываем результат
        resultCell.setValue(`✅ ${cmd.originalText}\n\n${lastResponse}`);
      } else {
        // Очищаем ячейку, если результат записан в другую ячейку
        resultCell.setValue("");
      }
    } else {
      resultCell.setValue(`❌ ${cmd.originalText}\n\n${lastResponse}`);
    }
  });
  
  Logger.log(`Обработано ${allCommands.length} команд`);
}