Hola comunidad,
Estoy desarrollando una integración con Google Chat a través de un Webhook desde Google Apps Script. Mi objetivo es simple:
- Enviar una notificación inicial a un espacio de Chat cuando se crea un nuevo registro en mi CRM. Esta notificación debe crear una nueva conversación (hilo).
- Enviar notificaciones de comentarios subsecuentes que se aniden como respuestas dentro de esa conversación original.
El Problema: La notificación inicial se envía correctamente y crea un hilo. Sin embargo, cuando envío un comentario usando el mismo threadKey, en lugar de anidarse como respuesta, siempre se crea una conversación nueva y separada, saturando el chat.
Resumen de las Pruebas Realizadas (Sin Éxito)Hemos probado exhaustivamente todos los métodos documentados y hemos llegado a un punto muerto.
1. Método Básico: threadKey Consistente
- Acción: Enviamos el mismo threadKey (un UUID único por cada registro del CRM) tanto en el payload del mensaje inicial como en el de los comentarios.
- Resultado: Se crean dos hilos separados.
- Acción: Modificamos el script para que, al enviar el mensaje inicial, capture la respuesta del webhook para obtener el ID oficial del hilo (thread.name, ej: spaces/AAAA.../threads/...). Luego, al enviar un comentario, usamos ese thread.name en el payload ("thread": { "name": "spaces/..." }).
- Resultado: Los registros de ejecución (logs) demuestran que el script envía el thread.name correcto, pero la API del webhook lo ignora por completo y aun así crea un nuevo hilo con un thread.name diferente.
3. Método de la Documentación: messageReplyOption en la URL
- Acción: Siguiendo la documentación oficial para webhooks, modificamos la URL del webhook para añadir el parámetro &messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD al enviar un comentario, manteniendo el threadKey consistente.
- Resultado: El comportamiento fue idéntico. El comentario se siguió publicando en un hilo nuevo.
También hemos intentado creando un webhook completamente nuevo desde cero y el resultado es el mismo. Todo esto se está ejecutando desde una cuenta corporativa de Google Workspace.
Código y EvidenciaEste es el código final que estamos usando, el cual sigue el método de la documentación (messageReplyOption en la URL):
function enviarNotificacionAGoogleChat(recordId, sucursal, messageText, isReply = false) {
try {
// ... (aquí se obtiene la URL del webhook de la configuración) ...
let webhookUrl = "URL_DE_MI_WEBHOOK";
if (isReply) {
if (webhookUrl.includes('?')) {
webhookUrl += "&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD";
} else {
webhookUrl += "?messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD";
}
}
const payload = {
"text": messageText,
"thread": {
"threadKey": recordId
}
};
const options = {
method: 'post',
contentType: 'application/json; charset=UTF-8',
payload: JSON.stringify(payload)
};
UrlFetchApp.fetch(webhookUrl, options);
} catch (e) {
Logger.log(`ERROR: ${e.toString()}`);
}
}
Estos son los registros de ejecución de la prueba donde intentamos usar el
thread.name, que demuestran la inconsistencia:
// El script intenta responder al hilo correcto: Respondiendo con thread.name: spaces/AAAA1/threads/gm_W86O // Google ignora la instrucción y crea un hilo nuevo en su respuesta: Respuesta del webhook de Google Chat: { "name": "spaces/AAAA1/messages/7MHZOln.7MHZOln", "thread": { "name": "spaces/AAAA1/threads/7MHZOln" }, ... }
Nótese la discrepancia entre el ID del hilo al que intentamos responder (.../gm_W86O) y el ID del hilo que Google creó (.../7MHZOln).
Pregunta FinalDado que hemos probado todos los métodos documentados (threadKey consistente y messageReplyOption en la URL) y los registros demuestran que la API del webhook parece ignorar las instrucciones de anidado, mi pregunta es:
¿Existe alguna limitación conocida, un bug, o una configuración especial en los webhooks de Google Chat (especialmente en entornos corporativos de Google Workspace) que impida el anidado de mensajes de esta forma? ¿Hay algún otro método que no hayamos considerado para lograr esto exclusivamente a través de webhooks?
Agradezco de antemano cualquier ayuda u orientación que puedan proporcionar.
No podemos usar APIS Avanzadas de Chat por bloqueo de la organización.