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} команд`);
}

© ProTalk 2023-2025 ИП Горелов Максим Николаевич ИНН 500104951533 ОГРН 309500106900065 

Новая, 8, 9 Реутов, Московская область 143964 Россия