
Condición del IF
¿Es un audio?
{{ $json.message?.voice?.file_id || $json.message?.audio?.file_id || '' }}
String -> Is not empty
FILE ID - Descargar audio
{{ $json.message.voice?.file_id || $json.message.audio?.file_id }}
JavaScript Code
const transcriptionNode = $('Transcribir audio').first().json;
const transcription =
transcriptionNode.text ||
transcriptionNode.transcription ||
transcriptionNode.output ||
'';
const expectedFields = [
'OT',
'Empresa',
'Responsable',
'Estado',
'Trabajo',
'Materiales',
'M. Obra',
'Elevador',
'Permisos',
'Subcontrata1',
'Subcontrata2',
];
function findStructuredData(value, depth = 0) {
if (value === null || value === undefined || depth > 10) return null;
if (typeof value === 'string') {
const cleaned = value
.replace(/^\s*```(?:json)?/i, '')
.replace(/```\s*$/i, '')
.trim();
try {
return findStructuredData(JSON.parse(cleaned), depth + 1);
} catch {
return null;
}
}
if (Array.isArray(value)) {
for (const element of value) {
const result = findStructuredData(element, depth + 1);
if (result) return result;
}
return null;
}
if (typeof value === 'object') {
if (expectedFields.some((field) =>
Object.prototype.hasOwnProperty.call(value, field)
)) {
return value;
}
const preferredKeys = [
'output_text',
'output',
'content',
'text',
'response',
'result',
'data',
'message',
];
for (const key of preferredKeys) {
if (value[key] !== undefined) {
const result = findStructuredData(value[key], depth + 1);
if (result) return result;
}
}
for (const nestedValue of Object.values(value)) {
const result = findStructuredData(nestedValue, depth + 1);
if (result) return result;
}
}
return null;
}
const parsed = findStructuredData($input.first().json) || {};
const text = (...values) => {
const value = values.find(
(item) =>
item !== undefined &&
item !== null &&
String(item).trim() !== ''
);
return value === undefined ? '' : String(value).trim();
};
const ot = text(parsed.OT, parsed.ot)
.replace(/^OT\s*(?:n(?:ú|u)mero)?\s*[-:#]?\s*/i, '')
.trim();
// Si el audio no contiene una OT explícita, el workflow termina aquí.
if (!ot) {
return [];
}
const estados = {
pendiente: 'Pendiente',
ofertado: 'Ofertado',
aceptado: 'Aceptado',
acabado: 'Acabado',
};
const estado =
estados[text(parsed.Estado, parsed.estado).toLowerCase()] ||
'Pendiente';
return [{
json: {
OT: ot,
Empresa: text(parsed.Empresa, parsed.empresa),
Responsable: text(parsed.Responsable, parsed.responsable),
Estado: estado,
Trabajo: text(parsed.Trabajo, parsed.trabajo),
Materiales: text(parsed.Materiales, parsed.materiales),
'M. Obra': text(
parsed['M. Obra'],
parsed.mano_obra,
parsed.manoObra
),
Elevador: text(parsed.Elevador, parsed.elevador),
Permisos: text(parsed.Permisos, parsed.permisos),
Subcontrata1: text(parsed.Subcontrata1, parsed.subcontrata1),
Subcontrata2: text(parsed.Subcontrata2, parsed.subcontrata2),
transcripcion: text(transcription),
},
}];
Adjunto el JSON para que podáis importarlo directamente a n8n.
Aprende a crear tu primera automatización con inteligencia artificial usando n8n, aunque no tengas experiencia previa.
En este curso breve y práctico construirás paso a paso una automatización real capaz de recibir una nota de voz por Telegram, transcribirla con OpenAI, extraer información estructurada y guardarla automáticamente en Google Sheets.
Durante el curso aprenderás los conceptos fundamentales de n8n: workflows, nodos, triggers, condiciones, procesamiento de datos e integración con inteligencia artificial.
El objetivo no es aprender todas las funciones de n8n, sino entender su funcionamiento creando un proyecto completo desde cero.
Al finalizar el curso sabrás cómo:
Crear y conectar nodos dentro de un workflow de n8n.
Recibir y procesar notas de voz desde Telegram.
Utilizar OpenAI para transcribir audio y extraer datos.
Guardar automáticamente información estructurada en Google Sheets.
Utilizar condiciones para que una automatización tome decisiones.
Entender la estructura básica de cualquier automatización: entrada → procesamiento → IA → datos → acción.
No necesitas saber programar ni tener experiencia previa con automatizaciones.
Este curso está pensado como una introducción rápida, clara y práctica a n8n y la automatización con IA.
Gracias por confiar en este curso. Espero que sea el primer paso para crear automatizaciones útiles, prácticas y cada vez más avanzadas.