
En artículo te explico cómo realizar un Keyword Research masivo orientado a verticales con búsquedas tipo «keyword + ciudad» en español, siguiendo un proceso estructurado. Cubriremos desde la obtención de grandes listas de palabras clave locales con Ahrefs, hasta la categorización automatizada en Google Sheets mediante un script de Apps Script y el uso de técnicas avanzadas (n-grams, IA, scraping). A modo de ejemplo usaremos verticales como abogados, dentistas o cerrajeros, combinados con ciudades (Madrid, Barcelona, etc.), que son búsquedas típicas en SEO local.
1. Obtener keywords «servicio + ciudad» con Ahrefs
Para recolectar un gran volumen de keywords locales relevantes, comenzamos usando Ahrefs Keywords Explorer. Ahrefs permite encontrar todas las consultas que contienen nuestros términos de interés, incluyendo combinaciones con ciudades. Los pasos básicos son:
- Elegir vertical(es) y país: Identifica las verticales o sectores (ej. abogados, dentistas, cerrajeros) y el mercado local objetivo (ej. España). En Ahrefs Keywords Explorer, introduce como keywords semilla tus términos principales de servicio (por ejemplo: «abogado», «abogados») y selecciona el país España para obtener datos de búsqueda locales. Puedes repetir el proceso para cada vertical por separado para mayor enfoque.
- Usar el informe «Having same terms»: Una vez cargados los resultados para la palabra clave semilla, navega al informe Having same terms en Ahrefs. Este reporte listará todas las consultas de la base de datos de Ahrefs que contienen las palabras de la semilla, sin importar el orden. Por ejemplo, con la semilla «abogados», obtendrás miles de frases que incluyen «abogado» o «abogados» junto con otras palabras. Entre ellas aparecerán muchas de tipo local, como «abogados Madrid» o «abogado penalista en Barcelona».
- Aplicar filtros por ubicación (opcional): Para enfocar en combinaciones servicio + ciudad, podemos filtrar las keywords que contengan nombres de ciudades. Ahrefs permite usar el filtro Include e ingresar términos como «Madrid, Barcelona, Valencia…» para mostrar solo keywords que incluyan cualquiera de esas ciudades. Otra opción es exportar primero toda la lista y filtrar luego en la hoja de cálculo (lo cual haremos de todos modos). En cualquier caso, asegúrate de incluir tanto singular como plural de los servicios para no perder variantes (por ejemplo «abogado» y «abogados»).
- Exportar los keywords: Utiliza la función de Exportar de Ahrefs para descargar los resultados en CSV. Si la lista es muy grande, podrías exportar por partes (Ahrefs suele limitar exportaciones masivas). En nuestro caso, haz una exportación por cada vertical: una para «abogados», otra para «dentistas», etc., o combina varias semillas si prefieres. Consejo: Marca la opción de incluir métricas como volumen de búsqueda mensual, dificultad, CPC, etc., ya que nos interesará especialmente el volumen.
Al finalizar este paso, tendremos varios archivos CSV con miles de keywords locales potenciales. Por ejemplo, para la vertical abogados podríamos obtener resultados como «abogados Madrid» (4400 búsquedas/mes) o «abogado penalista Barcelona» (aprox. 1000 búsquedas/mes)
Plantillas geo-modificadas
Una estrategia avanzada es crear plantillas de keywords geo-modificadas para ampliar aún más la lista. Consiste en identificar una consulta tipo «servicio + [ciudad]» en la lista exportada, reemplazar la ciudad concreta por un placeholder (ej. {{city}}
), y luego generar combinaciones con una lista de ciudades.
Por ejemplo, de «cerrajeros 24 horas Madrid» obtener la plantilla «cerrajeros 24 horas {{city}}», y luego reemplazar {{city}}
por todas las ciudades objetivo (Madrid, Barcelona, Valencia, etc.) usando una herramienta o script, obteniendo así palabras clave para múltiples ubicaciones aunque no aparecieran explícitamente en Ahrefs. Este método ayuda a cubrir variaciones de ciudades más pequeñas que no salieron en los datos iniciales de Ahrefs. Más adelante podríamos volver a Ahrefs y obtener métricas de estas nuevas combinaciones generadas, pero por simplicidad nos centraremos en las keywords originalmente extraídas.
2. Importar y preparar los datos en Google Sheets
Con las palabras clave exportadas de Ahrefs, el siguiente paso es importarlas a Google Sheets para su manipulación y análisis. A continuación se detalla cómo hacerlo manteniendo los datos limpios y estructurados:
- Importar los CSV a Sheets: Abre Google Sheets y crea una nueva hoja. Ve al menú Archivo > Importar y sube el archivo CSV exportado de Ahrefs. En las opciones de importación, selecciona «Reemplazar hoja» (si la hoja está vacía) o «Insertar nueva hoja» para poner cada dataset en una pestaña separada (por ejemplo, una pestaña para abogados, otra para dentistas, etc.).
Importante: desmarca la casilla «Convertir texto en números, fechas y fórmulas» antes de importar para evitar que Google Sheets transforme datos (por ejemplo, que convierta códigos postales en números o interprete ciertos textos como fechas). Tras la importación, deberías ver las columnas tal cual las provee Ahrefs, típicamente: Keyword, Search Volume, KD (dificultad), CPC, etc. - Consolidar en una sola hoja (opcional): Si has importado varias listas (una por vertical), puedes combinarlas en una sola hoja maestra para analizarlas juntas. Asegúrate de que todas tienen las mismas columnas. Simplemente copia y pega debajo de la primera todos los datos, o utiliza la función ARRAYFORMULA / QUERY para fusionar rangos de varias pestañas. Después, elimina filas duplicadas si una keyword apareció en más de un dataset (en Google Sheets existe la opción Datos > Quitar duplicados).
- Limpieza de datos: Revisa rápidamente si hay caracteres extraños o espacios adicionales. Es recomendable normalizar el texto de las keywords a un formato consistente: por ejemplo, convertir todo a minúsculas (puedes usar una columna auxiliar con
=MINUSC()
para obtener la versión en minúscula de cada keyword y luego pegar valores). Esto facilitará la coincidencia con nuestro diccionario de términos en pasos posteriores. También puedes usarTRIM
(=ESPACIOS()
en español) para recortar espacios sobrantes. Otra acción de limpieza podría ser eliminar signos de interrogación, acentos si quieres uniformizar (aunque en español es mejor conservarlos ya que «año» y «ano» son distintas palabras). En general, procura que cada fila tenga: Keyword (consulta de búsqueda exacta tal cual) y sus métricas numéricas correctas. - Estructura recomendada de la tabla: Coloca la columna Keyword en A, y a su derecha el Volumen de búsqueda en B, ya que estos dos serán cruciales. Puedes conservar más métricas (CPC, dificultad) si te interesan, pero para el objetivo de categorización y agrupación no son estrictamente necesarias. Asegúrate de tener una fila de encabezados clara en la fila 1 (por ejemplo: «Keyword», «Volumen», «KD», etc.). A partir de la fila 2 estarán los datos. En esta fase también es útil añadir columnas vacías que llenaremos más adelante con las categorías (por ejemplo «Servicio», «Ubicación», «Intención»), así dejaremos preparado el espacio para cuando ejecutemos el script. La estructura final podría ser:
Keyword, Volumen, Servicio, Ubicación, Intención
abogados madrid, 4400…
abogado penalista barcelona, 1000…
dentista infantil valencia 320..
cerrajeros 24 horas madrid 590…
(Nota: Los valores de volumen son ilustrativos; provienen de Ahrefs y otras fuentes públicas) - Dividir por vertical (opcional): Si prefieres mantener separados los sectores, podrías tener varias hojas (una por vertical) con la misma estructura. En tal caso, luego ejecutarías el proceso de categorización en cada hoja por separado. Sin embargo, también es viable juntar todo y luego clasificar, ya que de todos modos indicaremos el tipo de servicio en una columna. Para propósitos masivos, suele ser más práctico trabajar en una sola tabla grande.
Llegados a este punto, tenemos nuestras miles de palabras clave locales dentro de Google Sheets, limpias y listas para analizar. Ahora necesitamos una forma eficiente de clasificarlas por categorías relevantes (servicio, ciudad, etc.), lo cual abordaremos construyendo un diccionario de términos y un script para automatizar la categorización.
3. Construir un diccionario de términos clave para categorizar
Antes de categorizar automáticamente las keywords, definiremos manualmente un diccionario de términos clave que nos sirva para identificar las categorías principales presentes en cada búsqueda. Este diccionario no es más que una serie de listas de palabras o frases relevantes, agrupadas por tipo de categoría que nos interesa marcar. Para el caso «keyword + ciudad», típicamente consideramos al menos tres dimensiones de categorización:
- Tipo de servicio: términos que indican la naturaleza del servicio o sector. Por ejemplo, para nuestro caso incluiríamos palabras como abogado, abogados, dentista, dentistas, clínica dental, cerrajero, cerrajeros, cerrajería, etc. También podríamos añadir sub-servicios o especialidades frecuentes en las búsquedas, p.ej. laboralista, penalista, divorcios, implantes, ortodoncia, 24h, etc., que ayudan a afinar el tipo de servicio buscado.
- Ubicación (ciudad): nombres de ciudades o ubicaciones geográficas de interés. Aquí conviene listar las ciudades principales del mercado objetivo. En España, podríamos tener: Madrid, Barcelona, Valencia, Sevilla, Zaragoza, Málaga, Murcia, Palma, Bilbao, Alicante, etc. Incluye variaciones si las hubiera (por ejemplo «A Coruña» vs «La Coruña»). También podrías incluir comunidades autónomas o provincias si son relevantes en búsquedas (aunque normalmente la gente busca por ciudad en servicios locales). La lista de ciudades puede ser extensa; prioriza las más pobladas o aquellas donde el negocio tiene presencia.
- Intención u otros calificadores: términos que denotan la intención de búsqueda o características específicas. En búsquedas locales de servicios, es común ver palabras como «24 horas» (urgencia/disponibilidad), «urgente», «barato / económica» (precio), «cerca de mí» (aunque este último caso Google lo interpreta por ubicación del usuario más que por la palabra), «gratis» (consulta gratuita), o calificativos como «mejor» (ej. «mejor abogado en…»). En nuestro diccionario de ejemplo podemos incluir: «24 horas», «urgencias», «urgente», «barato», «mejor», «especialista», etc.
El diccionario se puede elaborar inspeccionando visualmente las palabras clave recopiladas. Por ejemplo, notaremos que en la lista muchas contienen «24 horas» (especialmente cerrajeros), o términos de especialidad legal («laboralistas», «penalista», «divorcios»). Es importante incluir formas en singular y plural si difieren (dentista/dentistas, abogado/abogados) y acentos si aplican («psicólogo»/»psicologo»). Asimismo, hay que evitar solapamientos ambiguos; por ejemplo, «abogados» contiene la palabra «abogado», pero en nuestro caso ambos refieren a la misma categoría de servicio jurídico. Podemos manejarlo incluyendo solo uno y detectando subcadenas, o incluyendo ambos.
¿Dónde almacenar el diccionario? Para facilidad, podemos crear una hoja separada en el mismo Google Sheets llamada «Diccionario» con columnas para cada categoría. Por ejemplo:
- Columna A:
Servicio
(lista de términos de servicios) - Columna B:
Ubicación
(lista de ciudades) - Columna C:
Intención
(lista de palabras de intención)
Esto nos permite mantener y actualizar el diccionario sin tocar el código. Alternativamente, podríamos definir estas listas directamente en el script (como arrays de strings dentro del código). En proyectos grandes, una hoja de diccionario es más manejable y permite colaboración.
Por ejemplo, nuestro diccionario simplificado podría ser:
- Servicio:
abogado
,abogados
,dentista
,dentistas
,cerrajero
,cerrajeros
,clínica dental
,fontanero
,electricista
,psicólogo
, … (y cualquier otro vertical o sinónimo que estemos analizando). - Ubicación:
Madrid
,Barcelona
,Valencia
,Sevilla
,Zaragoza
,Málaga
,Murcia
,Palma
,Bilbao
,Alicante
, … (lista de ~50 principales ciudades españolas, por ejemplo). - Intención:
24 horas
,urgencias
,urgente
,barato
,baratos
,económico
,mejor
,especialista
,cerca
,abierto
(por ejemplo, «abierto domingos» podría ser otro), etc.
Una vez definido el diccionario, estaremos listos para usarlo en la categorización automática. La idea es: por cada keyword de nuestra lista, buscaremos si contiene alguna de las palabras de la lista de servicios, alguna de las ciudades, o alguna palabra de intención, y así asignarle esas etiquetas.
4. Script de Google Apps Script con n-grams para categorización automática
Para automatizar la categorización utilizaremos Google Apps Script, el entorno de scripting de Google Sheets (JavaScript). Desarrollaremos un script que recorra todas las keywords y, usando el diccionario definido, determine a qué categorías pertenece cada una.
Concepto de n-gramas: N-gram es una secuencia de n elementos (palabras, por ejemplo) dentro de un texto. En nuestro caso práctico, podemos pensar en un keyword como una secuencia de palabras (un conjunto de 1-gramas, 2-gramas, etc.). Para categorizar, nos interesa detectar la presencia de ciertos unigramas o bigramas (palabras individuales o pares de palabras) que correspondan a nuestros términos del diccionario. Por ejemplo, en «abogados penalistas madrid 24 horas», los unigrams son [«abogados»,»penalistas»,»madrid»,»24″,»horas»] y bigramas relevantes como [«24 horas»]. Nuestro script básicamente va a hacer una búsqueda de estos n-gramas clave dentro de cada frase.
Implementación paso a paso del script:
- Acceder al editor de Apps Script: En Google Sheets, ve al menú Extensiones > Apps Script. Se abrirá el editor. Crea una nueva función, por ejemplo
function categorizarKeywords() { ... }
. - Obtener la hoja y datos: Primero, necesitamos referenciar la hoja de cálculo y el rango de datos de keywords. Podemos hacerlo así (en pseudocódigo, luego pondremos el real):
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName("AllKeywords"); // usa el nombre de tu hoja con los datos
let data = sheet.getDataRange().getValues(); // obtiene todas las filas y columnas con datos
Esto cargaría toda la tabla en la matriz data
. Alternativamente, para ignorar la fila de encabezados, podemos hacer: getRange(2,1,lastRow-1,lastCol).getValues()
, empezando en fila 2. Lo importante es obtener las keywords (columna A) y dejar espacio para escribir en las columnas de categorías.
- Definir los diccionarios en el código: Podemos leer el diccionario desde la hoja «Diccionario» si la creamos. Pero para simplificar el código aquí, definiremos arrays en el script:
// Ejemplo de diccionarios dentro del script: const servicios = ["abogado","abogados","dentista","dentistas","cerrajero","cerrajeros","clínica dental","psicólogo","psicólogos"]; const ubicaciones = ["madrid","barcelona","valencia","sevilla","zaragoza","málaga","murcia","palma","bilbao","alicante"]; const intenciones = ["24 horas","urgente","urgencias","barato","baratos","económico","mejor","especialista"];
(En un caso real, estas listas pueden ser mucho más largas). Notar que hemos puesto todo en minúsculas; por eso convertiremos también cada keyword a minúsculas antes de comparar.
- Recorrer las filas de keywords y categorizar: Ahora iteramos por cada keyword y chequeamos si contiene cada término del diccionario:
for (let i = 1; i < data.length; i++) { // i=1 para saltar la fila de encabezados si data[0] es header let keyword = data[i][0].toString().toLowerCase(); // Columna 0: la keyword, en minúscula let categoriaServicio = ""; let categoriaCiudad = ""; let categoriaIntent = ""; // Buscar tipo de servicio for (let term of servicios) { if (keyword.includes(term)) { categoriaServicio = term; break; // sale al encontrar el primero que encaja } } // Buscar ubicación (ciudad) for (let city of ubicaciones) { if (keyword.includes(city)) { categoriaCiudad = city; break; } } // Buscar intención for (let intent of intenciones) { if (keyword.includes(intent)) { categoriaIntent = intent; break; } } // Escribir las categorías en el array data data[i][2] = categoriaServicio; data[i][3] = categoriaCiudad; data[i][4] = categoriaIntent; }
- En este código, usamos
String.includes()
para verificar si la keyword contiene la subcadena de cada término del diccionario. Cuando encuentra una coincidencia, asigna esa categoría. Estamos guardando los resultados directamente en la matrizdata
en las columnas 2, 3 y 4 (que corresponden a «Servicio», «Ubicación», «Intención», considerando que 0 es Keyword, 1 es Volumen). Detalles técnicos: El uso de.includes
es sencillo pero hay que tener cuidado con falsos positivos. Por ejemplo,keyword.includes("seo")
encontraría coincidencia en «poseo» injustamente.
En nuestro caso, las palabras clave suelen estar separadas por espacios, así que podemos mejorar la precisión dividiendo la frase por espacios y comparando palabras completas. Otra forma sería usar expresiones regulares con límites de palabra (\b
en regex) para evitar coincidencias parciales. Sin embargo, dado nuestro diccionario enfocado (servicios y ciudades suelen ser palabras independientes),.includes
funcionará aceptablemente. También paramos al encontrar la primera coincidencia por eficiencia; si un keyword pudiera tener múltiples servicios (poco probable), podríamos almacenar todos, pero aquí asumimos uno principal. - Escribir los resultados de vuelta en la hoja: Tras el bucle, nuestra matriz
data
ya tiene las categorías llenas. Ahora actualizamos las celdas correspondientes en la hoja. Podemos hacer uso desetValues()
para volcar un rango 2D de valores de una sola vez (esto es más eficiente que cell-by-cell).
Por ejemplo:
// Escribir columnas de categorías (asumiendo están en C, D, E que son índices 2,3,4) let numRows = data.length; let outputRange = sheet.getRange(1, 3, numRows, 3); // desde fila1 col3 (C) con numRows filas y 3 columnas outputRange.setValues(data.map(row => [row[2], row[3], row[4]]));
Aquí data.map(row => [row[2], row[3], row[4]])
Crea un nuevo array 2D solo con las columnas de categorías que nos interesan. Alternativamente, podríamos especificar getRange(2,3, numRows-1, 3)
para empezar en la fila 2 si la fila 1 son encabezados, y data.slice(1)
para omitir el header en la escritura. Lo importante es alinear bien rangos y datos. En Apps Script, setValues
requiere una matriz de dimensiones exactas al rango destino.
- Ejecutar el script: Guarda el script y ejecútalo (puedes vincularlo a un menú personalizado o botón en la hoja). La primera vez, Google te pedirá autorizaciones. Tras correr, en la hoja de cálculo aparecerán rellenadas las columnas «Servicio», «Ubicación» e «Intención» para cada fila. Cada celda tendrá el valor del término coincidente (o vacío si no hubo match).
A modo de ejemplo, supongamos que tenemos la keyword «abogados penalistas madrid 24 horas«. El script la convertirá a «abogados penalistas madrid 24 horas» (ya minúscula). Irá detectando: en servicios encontrará «abogados» (categoría Servicio = abogados), en ubicaciones encontrará «madrid» (Ubicación = madrid), en intención encontrará «24 horas» (Intención = 24 horas). Escribirá esos valores en la fila correspondiente. Para otra, «dentista infantil valencia» → Servicio = dentista, Ubicación = valencia, Intención = (vacío) (no hay término especial salvo el propio servicio y ciudad). Así, rápidamente categorizamos miles de keywords.
Verificación rápida: Conviene revisar manualmente algunas filas tras ejecutar el script para asegurarnos de que categorizó bien. Si notas categorías vacías que deberían llenarse, quizás falta ese término en el diccionario. Puedes iterar ajustando el diccionario y re-ejecutando hasta lograr una clasificación satisfactoria.
Con este método automatizado, hemos transformado una lista plana de palabras clave en datos estructurados donde cada keyword está etiquetada por tipo de servicio, ubicación e intención de búsqueda. Esto facilita enormemente el análisis posterior.
5. Crear una hoja resumen con grupos de categorías y volúmenes totales
Ahora que cada keyword está categorizada, podemos agrupar y resumir los datos para obtener insights, como cuánto volumen de búsqueda suman todas las keywords de «abogados», o cuál ciudad concentra más búsquedas en determinado sector. La forma más sencilla de hacerlo en Google Sheets es empleando tablas dinámicas (pivot tables) o la función QUERY.
Por ejemplo, para ver el volumen total por tipo de servicio podríamos crear una tabla dinámica que sume la columna Volumen para cada valor de la columna Servicio. Igualmente, se puede hacer por Ubicación o por Intención.
Usando una tabla dinámica (Pivot Table):
- Selecciona todo el rango de datos de la hoja principal (incluyendo encabezados).
- Ve al menú Datos > Tabla dinámica (en inglés Data > Pivot table). Google Sheets insertará una nueva hoja con la configuración de la tabla dinámica.
- En el editor de la tabla dinámica (normalmente al lado derecho), configura los campos:
- Filas: Añade la columna Servicio (o la que quieras agrupar). Cada categoría de servicio aparecerá como una fila.
- Valores: Añade la columna Volumen, configurada para resumir por SUMA. Esto hará la suma de las búsquedas de todas las keywords que caen bajo cada servicio.
- (Opcional) Columnas: Podrías anidar otra dimensión, aunque para simplicidad podemos solo usar filas.
- Asegúrate de que en Valores la métrica es «Suma de Volumen» y el formato es número.
- La tabla dinámica resultante mostrará algo así como:
Servicio, Suma de Volumen
abogados 12,500
cerrajeros 8,200
dentistas 6,300
(blanco) 1,000
El ejemplo es ilustrativo. «Blanco» indicaría keywords donde la categoría Servicio quedó vacía, si existieran; idealmente no debería haber ninguna si el diccionario cubrió todos los casos relevantes) - De forma similar, puedes generar otra tabla dinámica para Ubicación: filas = Ubicación, valor = SUMA de Volumen. Obtendrías, por ejemplo, el total de búsquedas locales para Madrid, Barcelona, etc., sumando todos los servicios. Esto te permitiría identificar qué ciudad tiene mayor demanda en tu conjunto de keywords.
- También podrías cruzar categorías, por ejemplo una tabla dinámica con Filas = Servicio y Columnas = Intención, Valores = suma de Volumen, para ver, dentro de cada sector, cuántas búsquedas llevan «24 horas» u otros calificadores.
Google Sheets facilita estas agregaciones sin necesidad de fórmulas complejas. Como menciona Kogneta, puedes lograr estos resúmenes tanto con tablas dinámicas como con la función QUERY de Sheets (que permite hacer algo parecido a SQL sobre el rango). Por ejemplo, una fórmula QUERY podría ser:
QUERY(A1:E1000; "select C, sum(B) where C is not null group by C"; 1)
Siendo C la columna Servicio, B la de Volumen; esto produciría una tabla resumen de volumen por servicio. No obstante, la tabla dinámica es más interactiva y fácil de actualizar conforme filtramos o cambiamos algo.
Crear la hoja resumen automáticamente: Si deseamos automatizar la generación del resumen vía Apps Script en lugar de usar la interfaz, podríamos extender nuestro script para que calcule los totales y escriba en una nueva hoja. Por ejemplo, usando objetos en JavaScript para acumular sumas:
let summary = {}; // objeto para acumular suma por servicio
for (let i = 1; i < data.length; i++) {
let service = data[i][2];
let vol = Number(data[i][1]) || 0;
if (service == "") service = "(Sin categoría)";
summary[service] = (summary[service] || 0) + vol;
}
// Escribir el objeto summary en una nueva hoja "Resumen"
let summarySheet = ss.getSheetByName("Resumen") || ss.insertSheet("Resumen");
summarySheet.clearContents();
summarySheet.appendRow(["Servicio", "Volumen Total"]);
for (let serv in summary) {
summarySheet.appendRow([serv, summary[serv]]);
}
El resultado sería similar: una tabla con cada categoría de servicio y la suma total de volumen. Este procedimiento se repetiría para Ubicación o Intención si se quieren distintos resúmenes.
De cualquier modo, el objetivo se cumple: agrupar todas las keywords por categoría y visualizar el volumen total por grupo. Esto permite responder preguntas como “¿Qué vertical tiene mayor potencial de búsqueda?” o “¿En qué ciudades hay más búsquedas para mi sector?”, información valiosa para priorizar esfuerzos SEO.
6. Ejemplos concretos de resultado y código explicado
A continuación, integrando todo lo anterior, veamos un ejemplo práctico con datos reales simplificados y el código en funcionamiento:
Supongamos que hemos recopilado keywords para tres verticales (abogados, dentistas, cerrajeros) y tres ciudades principales (Madrid, Barcelona, Valencia). Algunas palabras clave extraídas de Ahrefs podrían ser:
- «abogados madrid» – 4.400 búsquedas/mes
- «abogados barcelona» – 2.900 búsquedas/mes
- «abogado laboralista madrid» – 720 búsquedas/mes (dato hipotético)
- «dentista madrid» – 2.400 búsquedas/mes (ejemplo)
- «dentista infantil valencia» – 320 búsquedas/mes (ejemplo)
- «cerrajeros 24 horas madrid» – 590 búsquedas/mes (ejemplo)
- «cerrajero urgente barcelona» – 210 búsquedas/mes (ejemplo)
Imaginemos que cargamos estos datos en Sheets. Ahora, aplicamos nuestro script de categorización. El script identificará, por ejemplo:
- «abogados madrid» → Servicio = abogados, Ubicación = madrid, Intención = (vacío).
- «abogado laboralista madrid» → Servicio = abogado (o abogados, según diccionario; podríamos normalizar ambos como «abogados»), Ubicación = madrid, Intención = (vacío). (Aquí podríamos también haber detectado «laboralista» como sub-tipo de servicio si estuviera en el diccionario).
- «dentista infantil valencia» → Servicio = dentista, Ubicación = valencia, Intención = (vacío) (no hay palabra de la lista de intención; «infantil» podríamos añadirla como categoría de tipo de servicio, p.ej. odontopediatría).
- «cerrajeros 24 horas madrid» → Servicio = cerrajeros, Ubicación = madrid, Intención = 24 horas.
- «cerrajero urgente barcelona» → Servicio = cerrajero, Ubicación = barcelona, Intención = urgente.
Como se aprecia, el script asigna correctamente las etiquetas. Tras procesar toda la lista, podríamos obtener un fragmento de la tabla así:
Keyword | Volumen | Servicio | Ubicación | Intención |
---|---|---|---|---|
abogados madrid | 4400 | abogados | madrid | |
abogado laboralista madrid | 720 | abogado | madrid | |
abogados barcelona | 2900 | abogados | barcelona | |
dentista madrid | 2400 | dentista | madrid | |
dentista infantil valencia | 320 | dentista | valencia | |
cerrajeros 24 horas madrid | 590 | cerrajeros | madrid | 24 horas |
cerrajero urgente barcelona | 210 | cerrajero | barcelona | urgente |
(Nota: en un caso real habría muchas más filas, pero este subconjunto sirve para ilustrar.)
Luego, al crear la hoja resumen, podríamos obtener por ejemplo:
- Volumen total por Servicio: abogados = 4400+2900+720 = 8020; dentista = 2400+320 = 2720; cerrajero/cerrajeros = 590+210 = 800. Esto nos dice que, en estas ciudades, «abogados» tiene mayor demanda agregada que «dentistas» o «cerrajeros».
- Volumen total por Ubicación: madrid = 4400+720+2400+590 = 8110; barcelona = 2900+210 = 3110; valencia = 320. Madrid lidera claramente en este ejemplo.
- Volumen por Intención (ej. urgencia): 24 horas = 590, urgente = 210, (la mayoría de búsquedas no tenían calificativo urgente). Esto indica que ~800 búsquedas combinadas mensuales son específicamente de carácter urgente en nuestro set (útil para decidir crear contenido enfocado a emergencias).
Estos números inventados demuestran cómo el enfoque masivo permite obtener insights accionables. Por ejemplo, podríamos decidir priorizar la creación de páginas de servicio en Madrid dado el volumen, o asegurar que tengamos contenido para «abogados laboralistas en Madrid» ya que existe un nicho de 720 búsquedas mensuales.
function categorizarKeywords() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("AllKeywords"); // ajustar al nombre real de la hoja de datos
if (!sheet) {
SpreadsheetApp.getUi().alert("Hoja 'AllKeywords' no encontrada");
return;
}
// Obtener rango de datos (asume datos contiguos desde A1)
const data = sheet.getDataRange().getValues();
if (data.length < 2) {
SpreadsheetApp.getUi().alert("No hay datos para procesar");
return;
}
// Diccionario de términos (personalizar según el caso real)
const servicios = ["abogado","abogados","dentista","dentistas","cerrajero","cerrajeros","clínica dental","psicólogo","psicólogos"];
const ubicaciones = ["madrid","barcelona","valencia","sevilla","zaragoza","málaga","murcia","palma","bilbao","alicante"];
const intenciones = ["24 horas","urgente","urgencias","barato","baratos","económico","mejor","especialista"];
// Recorrer filas de datos (saltando encabezado asumido en fila 0)
for (let i = 1; i < data.length; i++) {
let kw = data[i][0];
if (!kw) continue;
let keyword = kw.toString().toLowerCase();
let servCat = "", cityCat = "", intentCat = "";
// Categoría Servicio
for (let term of servicios) {
if (keyword.includes(term)) { servCat = term; break; }
}
// Categoría Ubicación
for (let city of ubicaciones) {
if (keyword.includes(city)) { cityCat = city; break; }
}
// Categoría Intención
for (let intent of intenciones) {
if (keyword.includes(intent)) { intentCat = intent; break; }
}
data[i][2] = servCat;
data[i][3] = cityCat;
data[i][4] = intentCat;
}
// Escribir de vuelta las categorías en columnas C, D, E (fila 1 contiene encabezados)
const numRows = data.length;
const outputRange = sheet.getRange(1, 3, numRows, 3); // C1:E{numRows}
outputRange.setValues(data.map(row => [row[2], row[3], row[4]]));
}
En cuanto al código del script, ya presentamos la versión núcleo en el paso 4. Abajo incluimos una versión final consolidada y comentada:
Lo anterior recorrerá todas las filas y llenará las columnas C, D, E (Servicio, Ubicación, Intención) de la hoja «AllKeywords». Observa cómo usamos SpreadsheetApp.getActiveSpreadsheet()
y getSheetByName
para obtener la hoja, luego getDataRange().getValues()
para leer todos los valores, y finalmente setValues()
para escribirlos. El uso de map
nos permite extraer solo las columnas deseadas para escribir.
Ejecutando este código en nuestro ejemplo de datos, obtuvimos exactamente las categorizaciones mostradas en la tabla de arriba. A partir de ahí, creamos manualmente las tablas dinámicas de resumen para obtener los totales por categoría, pero igualmente podríamos extender el script para calcularlos automáticamente, como mencionamos anteriormente.
7. Acelerando el proceso con inteligencia artificial
El flujo descrito se puede optimizar aún más aprovechando herramientas de inteligencia artificial disponibles hoy en día. A continuación, se sugieren algunas maneras de acelerar tareas clave mediante IA:
- Generación automática de código (code generation): Herramientas como ChatGPT (especialmente con GPT-4) o GitHub Copilot pueden ayudarte a escribir el script de Apps Script con mayor rapidez. Por ejemplo, podrías describir en lenguaje natural lo que necesitas («un script que lea una columna de palabras clave y las clasifique según tal lista de términos») y obtener un borrador de código JS que luego ajustas. De hecho, muchos desarrolladores SEO usan ChatGPT para crear fórmulas de Sheets o scripts rápidamente.
Incluso el Code Interpreter de ChatGPT permite subir un CSV y ejecuta Python para analizarlo. Un caso práctico: exportar las keywords de Ahrefs, cargarlas en ChatGPT Code Interpreter y pedirle que las agrupe por temas. Ya hay guías demostrando esto. Sin escribir una sola línea, la IA puede entregar un desglose de keywords por categorías. Claro está, conviene revisar y validar sus resultados, pero agiliza la exploración inicial. - Agentes de IA para análisis de competencia: Además de usar Ahrefs, podríamos emplear un AI agent que navegue por sitios web de la competencia para extraer palabras clave o categorías relevantes. Por ejemplo, existen agentes basados en navegadores (como AutoGPT o otros frameworks) que se les puede dar la tarea: «Visita el sitio de X competidor y lista las secciones o servicios que ofrece.» De esta forma, la IA recopilaría potenciales categorías (servicios, ubicaciones mencionadas, preguntas frecuentes) directamente desde páginas web.
SurferSEO menciona que los agentes de SEO con IA pueden automatizar investigación de palabras clave y análisis de contenido de competidores. En nuestro caso, un agente podría escanear 10 sitios de despachos de abogados y descubrir términos importantes (p.ej. «herencias», «divorcios», «civil», «penal», nombres de ciudades donde operan) que podríamos añadir a nuestro diccionario para no omitir esas keywords. - Scraping automatizado con IA o complementos: La recopilación masiva de keywords se puede complementar con scraping de fuentes como Google Autocomplete, Google Trends, o sitios de directorios locales. Por ejemplo, usar un script en Python (Requests + BeautifulSoup) o una herramienta como Screaming Frog con modo lista de palabras clave, para obtener sugerencias de búsqueda relacionadas con «servicio + ciudad». La IA puede asistir generando esos scripts de scraping.
Incluso existen extensiones que integran IA para interpretar los datos obtenidos. Un ejemplo concreto: podríamos scrapear la sección de «Búsquedas relacionadas» en Google para una lista de ciudades y servicios, y luego usar un modelo de lenguaje para filtrar y unir resultados. Sin embargo, hay que respetar las políticas de los motores de búsqueda al hacer scraping. Otra fuente son las APIs oficiales: por ejemplo la API de Google Ads (Keyword Planner) que puede devolver ideas de palabras clave locales; configurar esto manualmente es complejo, pero un agente de IA podría guiar la configuración o parsear los resultados. - Clustering inteligente de keywords: Más allá de simples reglas por inclusión de términos, existen técnicas de clustering semántico donde la IA agrupa palabras clave por similitud de significado. Por ejemplo, herramientas de terceros o notebooks Python con librerías de NLP pueden vectorizar las keywords y agruparlas en clusters temáticos. Hoy en día, servicios como OpenAI pueden clasificar texto mediante prompts. Podríamos enviar a GPT una lista de 50 keywords y pedir «agrúpalas por intención de búsqueda» o «separa servicios distintos». De hecho, en la comunidad SEO se han usado prompts para clasificar listas largas (limitando por tokens, a veces en bloques). También algunos utilizan embeddings de texto para agrupar cientos de miles de keywords por similitud contextual. Estas técnicas van más allá del alcance manual, pero son potentes para descubrir patrones que un simple diccionario podría pasar por alto.
En resumen, la IA puede acelerar muchas partes: desde la escritura del código, la identificación de nuevas categorías de búsqueda, hasta el análisis final de los datos. Por ejemplo, podríamos preguntarle a ChatGPT: «¿Qué patrones ves en estas keywords y qué recomendarías?» y obtener insights estratégicos adicionales.
Ejemplo práctico con ChatGPT Code Interpreter: Una estrategia emergente es exportar todas las keywords (con sus volúmenes) y cargarlas en ChatGPT con el plugin de análisis de datos. Uno podría pedirle: «Agrupa estas keywords en categorías de servicio y calcula el volumen total por categoría. Luego, genera gráficos de barras de volumen por ciudad.» En pocos minutos, la herramienta podría devolver la respuesta con visualizaciones, ahorrando el trabajo manual de crear pivots en Sheets. Un experto reportó que simplemente subiendo un CSV y dando instrucciones generales obtuvo una segmentación útil de miles de keywords en segundos
Por supuesto, combinar la precisión del enfoque basado en diccionario + script (que garantiza control total sobre las reglas de categorización) con la creatividad de la IA (que puede sugerir nuevas categorías o detectar sinónimos contextuales) brinda lo mejor de ambos mundos. En última instancia, un SEO eficiente aprovechará todas estas técnicas para ejecutar un keyword research local masivo de manera rápida, ordenada y con un alto grado de detalle, facilitando la toma de decisiones sobre la estrategia de contenidos y posicionamiento.