ИП Горелов Максим Николаевич 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} команд`);
}
© ProTalk 2023-2025 ИП Горелов Максим Николаевич ИНН 500104951533 ОГРН 309500106900065
Новая, 8, 9 Реутов, Московская область 143964 Россия