Automatización de scripts usando mail merge de Word 2007

Spread the love

Introducción

Antes de comenzar, quisiera recordarles que voy a volver a escribir más seguido, he tenido mi blog abandonado durante los últimos dos años pero ahora estoy en un nuevo empleo y tengo muchas experiencias que compartir, espero poder cumplir para volver al generoso Page Rank de 3 que solía tener y poder escribir como si tuviera (de nuevo) lectores habituales 🙂 Lo que voy a describir es útil para cualquier persona que haga textos repetitivos en los cuales sólo cambien algunas cosas, la técnica está diseñada para crear cartas en las cuales sólo cambien los nombres, géneros o alguna otra información pero el resto del contenido sea igual. El caso es especialmente importante para los ingenieros de redes y telecomunicaciones quienes usualmente configuramos o creamos guiones de configuración para desplegar un montón de dispositivos por un territorio cualquiera (o por todo el país). Como ingenieros de redes, casi que hablamos el lenguaje de línea de comandos de nuestra línea de producto, incluso algunas veces reemplazando expresiones o conceptos del lenguaje u obviamos las propias expresiones técnicas en favor de alguna palabra reservada de nuestro producto. Esto se debe a que estamos tan acostumbrados a aplicar configuraciones manualmente que olvidamos los propios conceptos o se nos hace más fácil hablar usando siglas o comandos. Por la misma razón, no solemos cuestionarnos cuando ejecutamos tareas repetitivas, especialmente cuando no son suficientemente grandes para preocuparnos, incluso podemos alardear de cuán rápidos somos para “tipear” comandos, sin embargo, cuando la tarea es realmente grande tenemos que buscar alguna alternativa más eficiente (por rápidos que seamos).

Escenario

Un escenario hipotético que sirve de ejemplo podría ser el despliegue de una red de LTE, uno muy particular en el cual a cada nodo de la red se le asigna un pequeño enrutador. Una red LTE para cubrir una gran ciudad o varias ciudades podría tener unos 500 nodos (eNodesB), y si a cada uno se le debe configurar un enrutador habría que escribir 500 guiones. En nuestro escenario, cada uno de éstos va a tener dos interfaces, una hacia una red de transporte que lleva el tráfico hacia el núcleo de la red y otra hacia los dispositivos que componen el nodo como tal, ésta última subdividida a su vez en tres subinterfaces, dependiendo de los servicios que vaya a manejar, por ejemplo

  1.  Tráfico de servicio
  2.  Tráfico de operación y mantenimiento
  3.  Tráfico de otro operador.

Así las cosas, cada enrutador tendría las siguientes direcciones IP:

  • IP para la interfaz de Loopback, en caso de que sea necesario establecer sesiones de OSPF, BGP u otro protocolo de enrutamiento.
  • Una IP para la interfaz de transporte, asociada a una VLAN que depende del anillo de transmisión al cual esté pegado el nodo.
  • Tres IPs para las subinterfaces del eNodeB.

Según lo anterior, para un solo enrutador necesitamos 5 IPs. El siguiente ejemplo es una versión simplificada, por objetivos puramente pedagógicos, del escenario descrito. Las IPs tienen patrones fáciles de calcular, derivables de una de las IPs pero no asuman que esto pasa en la realidad, sólo es para facilitar el ejemplo. En el proyecto en el cual tuve que aplicar ésta técnica existen algunos patrones que calculo con la hoja de cálculo, pero no todos se pueden derivar de otros números. La siguiente imagen ilustra la topología de los dispositivos y en ella se ve más claramente lo descrito en párrafos anteriores:

Topología ATN LTE
Topología ATN LTE

El guión debe incluir, entre otras cosas, comandos adicionales por ejemplo creación de sesiones de protocolos de enrutamiento, creación de VRFs, etc. El siguiente es un ejemplo de lo que sería el guión para un enrutador particular (en ésta caso un Huawei ATN910i):

sysname CITY1_0153_ATN910i
FTP server enable
#
router id 10.99.10.11
#
mpls lsr-id 10.99.10.11
mpls
#
mpls ldp
#
aaa
local-user root service-type ftp telnet ssh
local-user root ftp-directory cfcard:/
local-user customadmin password cipher YYYYYY
local-user customadmin service-type ftp telnet ssh
local-user customadmin level 3
local-user customadmin ftp-directory cfcard:/
#
ntp-service unicast-server 10.199.2.200 source-interface LoopBack0
#
interface GigabitEthernet0/0/1
undo shutdown
trust upstream default
#
interface GigabitEthernet0/0/1.1
vlan-type dot1q 10
description TO_SERVICE
ip address 10.11.10.11 255.255.255.240
statistic enable
trust upstream default
#
interface GigabitEthernet0/0/1.2
vlan-type dot1q 20
description TO_O&M
ip address 10.12.10.11 255.255.255.240
statistic enable
trust upstream default
#
interface GigabitEthernet0/0/1.3
vlan-type dot1q 30
description TO_3RD_PARTY
ip address 10.13.10.11 255.255.255.240
statistic enable
trust upstream default
#
interface GigabitEthernet0/0/2
undo shutdown
trust upstream default
#
interface GigabitEthernet0/0/2.100
vlan-type dot1q 100
ip address 10.100.10.11 255.255.255.240
mpls
mpls ldp
statistic enable
trust upstream default
#
interface LoopBack0
ip address 10.99.10.11 255.255.255.255
#
bgp 65011
router-id
peer 10.99.0.33 as-number 65011
peer 10.99.0.33 connect-interface LoopBack0
#
ipv4-family unicast
undo synchronization
peer 10.99.0.33 enable
#
ipv4-family vpnv4
policy vpn-target
peer 10.99.0.33 enable
#
#
ospf 1
spf-schedule-interval intelligent-timer 5000 50 50
lsa-originate-interval intelligent-timer 5000 0 20
bandwidth-reference 10000
area 10.100.10.0
network 10.100.10.0 0.0.0.15 description TX_NETWORK
network 10.99.10.11 0.0.0.0 description LOOPBACK_0
stub
#
snmp-agent
snmp-agent community read Unknown-345
snmp-agent community write Known-678
snmp-agent sys-info location BOGOTA – COLOMBIA
snmp-agent sys-info version all
snmp-agent target-host inform address udp-domain 10.199.2.200 params securityname Unknown-345 v2c
snmp-agent trap source LoopBack0
snmp-agent inform timeout 60
snmp-agent inform resend-times 10
snmp-agent inform pending 100
#
user-interface maximum-vty 15
user-interface vty 0 14
authentication-mode aaa
protocol inbound all
user-interface vty 16 20
authentication-mode aaa
protocol inbound all
return
clock timezone BOGOTA minus 5

Como se observa en el ejemplo, algunas IPs (p. ej.: la loopback) se usa en varias ocasiones y hay información adicional que depende de la ciudad en la cual se va a instalar el dispositivo o de alguna otra condición que habrá que especificar en la hoja de cálculo que hace las veces de base de datos. La información que debe cambiar está en color rojo, es decir, ésta es la información que cambia de un dispositivo a otro y por ende la que debe componer las columnas de la hoja de cálculo.

Un ejemplo de la hoja de cálculo (sobresimplificada) es la siguiente, en la cual hay 6 supuestos ATNs con sus respectivas IPs (cada ATN en una fila diferente):

Tabla Mail Merge
Tabla Mail Merge

Aprovechando la potencia de la hoja de cálculo, se pueden derivar datos complejos a partir de formulas muy versátiles, por ejemplo la última columna (TX_NET) es el resultado de la siguiente fórmula:

=G4-MOD(G4;16)

Que significa que de la porción de host de la IP (TXD) extraiga el número de la red (asumiendo una máscara 255.255.255.240 o /28). Dicho en palabras sería: reste, del número original, su residuo cuando se divide por 16. Éste es un cálculo común entre programadores.

La técnica

Usualmente no dudamos en comenzar a tipear guiones por demanda, pero si el proyecto es suficientemente largo necesitamos encontrar una técnica más eficiente. La combinación de correspondencia (mail merge) nos permite escribir un texto una vez y tomar datos de una fuente en forma de hoja de cálculo para generar versiones del mismo texto con base en los datos de cada fila de la fuente. Como ya expliqué en párrafos anteriores, en nuestro caso es la información que en el guión de ejemplo está en rojo.

Los pasos que describo a continuación fueron ejecutados en Word 2007 (lamentablemente sólo lo tengo en inglés así que uds. encuentren el equivalente en español), pero ésta funcionalidad también está presente en otros procesadores de texto como Open Office.

Arrancamos Word de manera convencional, copiamos y pegamos un guión hecho manualmente (ya comprobado), luego, bajo el tab de Correspondencia oprimir el botón Iniciar combinación de correspondencia y en el menú emergente elegir cartas, con ésto aparecen controles visuales que permiten navegar las filas de la fuente como si fuera una base de datos. Después necesitamos seleccionar destinatarios (elegir la fuente de información), existen tres posibilidades (Escribir nueva lista, Usar lista existente, Seleccionar de los contactos de Outlook) pero la única útil para nuestro propósito es Usar lista existente, aunque el programa permite crear allí mismo la base de datos o utilizar otras fuentes como una base de datos real de Access. Tras haber elegido utilizar archivo existente, buscamos el archivo en el cual se encuentra la información relevante, hay una pequeña casilla en la esquina inferior izquierda de la ventana de diálogo que permite seleccionar la primera fila como nombre de los campos, lo cual es muy recomendable dado que los campos no tendrán nombres intuitivos cuando los vayamos a insertar en el documento, ni siquiera los nombres de las columnas de la hoja de cálculo (ensayen). Adicionalmente, cuando seleccionamos la hoja de cálculo, el programa nos solicita cuál de las hojas de cálculo del archivo se debe usar.

Selección de hoja
Selección de hoja

Ahora sí podemos Insertar campos combinados en los lugares del guión en los cuales los necesitamos. Los campos aparecen con una notación especial:  <<FIELD_NAME>>, para poder ver la información insertada hay que usar el botón Vista previa de resultados.
Luego de dominar la técnica, podemos simplificar la tarea usando la propia hoja de cálculo para hacer cosas más interesantes, por ejemplo concatenando los octetos de las IP en un solo campo en vez de tener cuatro campos distintos. Lo que sí es muy recomendable es que toda esta optimización se haga en una etapa de planificación cuidadosa, dado que los cambios en los nombres o posiciones de los campos implican que el documento debe ser rediseñado para introducir los nuevos campos, de hecho el propio aplicativo pregunta para reemplazar los campos en el documento maestro pero ese proceso es un poco aburridor y confuso. Cada vez que se abre el documento, se solicita permiso para extraer la información de la hoja de cálculo y a veces pregunta de cuál de las hojas del archivo sacar la información.

Cuando el documento maestro, esta especie de plantilla, está creada, podemos usar el botón Vista previa que aparece al lado de los controles de avance para mirar los documentos con la información tal como se van a usar, tomada de la hoja de cálculo, incluso se puede buscar el documento con base en la información de alguno de los campos.

Buscar documento Mailmerge
Buscar documento Mailmerge

Para finalizar, se generan los documentos específicos; podemos generar un gran documento con todos los guiones o generar un rango de documentos individuales.

Ejemplo paso a paso

Ahora hagamos uno paso a paso, los primeros pasos no necesitan ninguna explicación.
1. Consolide la información y optimice la hoja de cálculo (agregando campos concatenados, cálculos, etc.)
2. Cree un documento base (guion verificado hecho a mano)
3. Inicie la combinación de correspondencia:

4. Seleccione la fuente de información:

5. Inserte los campos en el document maestro

Así debería lucir el guion después de insertarle los campos (solo un fragmento):

sysname CITY1_«NAME»_ATN910i
#
FTP server enable
#
router id «Lo0_A».«Lo0_B».«Lo0_C».«Lo0_D»
#
mpls lsr-id «Lo0_A».«Lo0_B».«Lo0_C».«Lo0_D»
mpls
#
.
.
.
interface GigabitEthernet0/0/1
undo shutdown
trust upstream default
#
interface GigabitEthernet0/0/1.1
vlan-type dot1q 10
description TO_SERVICE
ip address «SERV_A».«SERV_B».«SERV_C».«SERV_D» 255.255.255.240
statistic enable
trust upstream default
#
interface GigabitEthernet0/0/1.2
vlan-type dot1q 20
description TO_O&M
ip address «OM_A».«OM_B».«OM_C».«OM_D» 255.255.255.240
statistic enable
trust upstream default
#
interface GigabitEthernet0/0/1.3
vlan-type dot1q 30
description TO_3RD_PARTY
ip address «M_3RD_A».«M_3RD_B».«M_3RD_C».«M_3RD_D» 255.255.255.240
statistic enable
trust upstream default
#
interface GigabitEthernet0/0/2
undo shutdown
trust upstream default
#
interface GigabitEthernet0/0/2.«TX_V»
vlan-type dot1q «TX_V»
ip address «TXA».«TXB».«TXC».«TXD» 255.255.255.240
mpls
mpls ldp
statistic enable
trust upstream default

Finalmente, para generar los documentos (guiones), seleccionamos Terminar:

Generar documento Mailmerge
Generar documento Mailmerge

Después de haber generado los documentos, puede ser necesario continuar agregando más información a la hoja de cálculo y generar nuevos documentos. No hay ningún problema con ésto, cuando agregamos nuevas filas a la hoja de cálculo, guardamos y abrimos luego el documento maestro, debemos volver a la pestaña de Correspondencia para continuar desde el último campo navegado (previa confirmación de que se va a extraer información de una fuente externa).

Conclusiones





Hay muchas maneras de automatizar tareas, algunas más fáciles que otras. Esta es una forma suficientemente fácil para que cualquiera, sin necesidad de ser ingeniero, automatice documentos repetitivos, así que yo creo que es una de las más fáciles si no la más fácil de todas.

Automatizando tareas podemos evitar errores de diferentes orígenes, por ejemplo por cansancio del ingeniero, si hemos pasado mucho tiempo haciendo una tarea repetitiva o resolviendo algún problema complejo.

Usando ésta técnica, también podemos hacer cambios rápidamente, dado que cuando modificamos el documento maestro automáticamente estamos cambiando todos los documentos (lo cual puede ser una arma de doble filo). Una forma de evitar afectar todos los documentos es hacer los cambios particulares en los documentos generados y no en el documento maestro.

2 comentarios en “Automatización de scripts usando mail merge de Word 2007”

  1. Pingback: Automatización en redes

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.