ИП Горелов Максим Николаевич 8 (915) 093-74-75
УПРАВЛЯЙТЕ БОТАМИ PRO-TALK ПРЯМО ИЗ GOOGLE ТАБЛИЦ!
Теперь вы можете автоматизировать работу с ботами ProTalk без лишних действий — просто пишите команды в Google Sheets, и боты мгновенно отвечают! Как это работает?
В любой ячейке пишете:
@НОМЕР_БОТА Ваш запрос
Например:
@12345 Напиши пост про скидки
Скрипт автоматически отправляет запрос боту ProTalk.
Ответ появляется прямо в таблице!
Зачем это нужно?
Автоматизация рутины — генерация текстов, анализ данных и многое другое прямо в таблицах.
Работа в команде — коллеги могут отправлять запросы боту без доступа к ProTalk.
Мгновенные ответы — больше не нужно переключаться между сервисами.
Скачайте один из шаблонов Google таблицы
Этот скрипт позволяет автоматически обрабатывать команды в Google Таблицах через ваших ботов ProTalk. Например, вы можете отправлять запросы к ИИ прямо из ячеек таблицы!
Вы пишете в ячейке команду для бота, начиная с его номера (например, @12345 Напиши пост про скидки
).
Скрипт находит эту команду, отправляет её вашему боту в ProTalk.
Бот обрабатывает запрос и возвращает ответ прямо в таблицу.
Создайте в вашей Google Таблице лист с названием Боты ProTalk
.
На этом листе укажите:
В столбце A — номера ваших ботов (например, 12345
).
В столбце B — API-токены этих ботов (можно взять в личном кабинете ProTalk → меню бота → "Интеграция и API").
Пример:
A (ID бота) | B (Токен) |
12345 | pt_abc123... |
67890 | pt_xyz456... |
@НОМЕР_БОТА Ваш запрос
Например:
@12345 Напиши коммерческое предложение
@67890 Придумай 5 идей для поста
✏️ Можно писать несколько команд через ##
:
@12345 Первая команда ## Вторая команда
В редакторе скриптов нажмите на иконку ⏰ "Триггеры" (в левой панели).
Выберите "Добавить триггер".
Настройте параметры:
Выберите функцию: processBotMentions
Развертывание: "Головной"
Событие: "При изменении"
Тип изменения: "При редактировании"
Сохраните триггер.
✅ Готово! Теперь скрипт будет автоматически запускаться при любом изменении в таблице и обрабатывать новые команды.
До:
@12345 Напиши пост про скидки 20%
После:
✅ @12345 Напиши пост про скидки 20% 🔥 Акция! Скидки 20% на все курсы! Успейте до конца месяца! ...
Q: Где взять токен бота?→ В Личном кабинете ProTalk → выберите бота → раздел "Интеграция и API".
Q: Можно ли вызывать бота из формул?→ Да! Используйте =A1
(если команда в ячейке A1).
Q: Почему команды не обрабатываются?→ Проверьте:
Есть ли лист Боты ProTalk
с ID и токенами.
Правильно ли написаны команды (@номер_бота текст
).
Код 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} команд`); }
ИП Горелов Максим Николаевич ИНН 500104951533 ОГРН 309500106900065