Как добиться, чтобы бот по Username находил User_id?

Пишу что-то вроде хелпдеска, работающего с ТГ Ботом + GoogleForms + AppScripts.

Удалось реализовать функцию уведомлений через ID (если писать напрямую user_id), но мне необходимо чтобы сотрудник писал свой "username" и по нему уже бот сам находил "user_id". Да, я читал что боту нужно написать первым или прожать команду /start, однако все равно при выполнении этих действий - бот не высылает уведомления по "user_id" а при тесте "Возврата ID из username" бот пишет что _"Пользователь не зарегистрирован. Попросите написать боту в личные сообщения".

Желаемое поведение: Боту написали "/start", он извлек "username", по нему нашел "user_id" и сохранил его себе в память, чтобы если пользователь мог создавать новые заявки, гарантированно получая уведомления о их статусе.

Сам код можно найти тут: https://drive.google.com/file/d/17qyXHHuV232sqR9v0efqjlJesoITwTpj/view?usp=sharing

 // ====== ОБРАБОТКА ЛИЧНЫХ СООБЩЕНИЙ ====== //
function processPrivateMessage(message) {
  try {
    console.log("Обработка личного сообщения:", JSON.stringify(message));
    
    if (!message?.from) {
      console.error("Нет данных отправителя");
      return;
    }

    const user = message.from;
    
    // Проверяем обязательные поля
    if (!user.id || !user.username) {
      console.error("Неполные данные пользователя:", user);
      sendPlainMessage("❌ Для регистрации необходим username в настройках Telegram", null, user.id);
      return;
    }

    const originalUsername = user.username;
    const normalizedUsername = originalUsername
      .toLowerCase()
      .replace(/^@/, '')
      .trim();

    // Сохраняем все варианты
    const variations = [
      `user_${normalizedUsername}`,
      `user_@${normalizedUsername}`
    ];

    variations.forEach(variation => {
      PropertiesService.getScriptProperties().setProperty(variation, user.id.toString());
      console.log(`Сохранено: ${variation} = ${user.id}`);
    });

    // Отправляем подтверждение
    sendPlainMessage(
      "✅ Регистрация успешна!\nТеперь вы будете получать уведомления о заявках.",
      null,
      user.id
    );
    
    // Уведомление админа
    sendAdminNotification(`? Зарегистрирован пользователь: 
Username: @${normalizedUsername}
ID: ${user.id}
Время: ${new Date().toLocaleString()}`);

  } catch (error) {
    console.error("Ошибка обработки ЛС:", error);
    sendAdminNotification(`⚠️ Ошибка регистрации: ${error.message}`);
  }
}

// ====== ПОИСК ПОЛЬЗОВАТЕЛЯ ====== //
function findUserIdByUsername(username) {
  try {
    if (!username || typeof username !== 'string') return null;
    
    const cleanUsername = username
      .toLowerCase()
      .replace(/^@/, '')
      .trim();

    const variations = [
      `user_${cleanUsername}`,
      `user_@${cleanUsername}`
    ];

    const scriptProperties = PropertiesService.getScriptProperties();
    
    for (const variation of variations) {
      const userId = scriptProperties.getProperty(variation);
      if (userId) {
        console.log(`Найден пользователь: ${variation} = ${userId}`);
        return userId;
      }
    }
    
    console.log("Пользователь не найден для:", cleanUsername);
    return null;

  } catch (error) {
    console.error("Ошибка поиска:", error);
    return null;
  }
}

Ответы (0 шт):