Aquí demostraré un ejemplo no tan simple del uso de
Microsoft Flow para resolver un problema práctico.
Declaración del problema.
A veces, las tareas para un programador surgen de la vida cotidiana. Este fue uno de esos casos. Quería darle flores a mi esposa de vez en cuando, digamos una vez al mes. Pero al mismo tiempo, no quería hacer esto en ninguna fecha específica, por ejemplo, el primer día del mes. Entonces esto no sería una sorpresa. Quería aleatorización. Por ejemplo, la próxima vez que dé flores, debería haber un mes después de la hora anterior, más / menos un par de días.
No hay nada especial sobre tales requisitos. Es bastante fácil escribir un programa que me recuerde estos eventos. Pero la aplicación de escritorio tiene un inconveniente significativo. Funcionará solo en una máquina, mientras que tengo varias de ellas (en casa, en el trabajo, ...). Y hay un teléfono inteligente ... ¿No sería bueno recibir notificaciones en cualquiera de mis dispositivos?
Bueno, puede guardar la información del evento en algún tipo de almacenamiento en línea (como
Mlab ). En este caso, todas las instancias de mi aplicación funcionarán con la misma información, lo que les permitirá sincronizarse entre sí. Sin embargo, necesitaré instalar estas aplicaciones en todas mis computadoras. Además, utilizo Windows en computadoras y Android en mi teléfono inteligente, por lo que tendré que escribir varias aplicaciones diferentes si realmente quiero recibir mis notificaciones en todas partes. ¿Cómo superar este problema? Usando la Web, por supuesto.
Si creo una aplicación web, puedo usarla en casi cualquier dispositivo. Genial Pero aún no es lo suficientemente bueno. Déjame explicarte mi punto. Aunque no es tan difícil escribir una aplicación web que resuelva mi problema, en este caso, sin embargo, tendré que ocuparme de muchas cosas. Debe pensar en el alojamiento, el almacenamiento de datos, el almacenamiento de código, ... ¿Y por qué? Casi toda la funcionalidad requerida ya está implementada en calendarios web modernos como
Google Calendar . Puede crear eventos, hacerlos recurrentes, enviarme notificaciones sobre su ocurrencia, etc. Lo único que falta es la aleatorización requerida por mí. ¿No sería genial si pudiera agregar esta función y usar todas las demás funciones que ya están disponibles?
Cuando pensé en este problema, me encontré con el
sitio web
IFTTT.com . La idea de este sitio es simple pero productiva. Si algo sucede, él hace algo. Sé que esto suena extraño, así que déjame darte algunos ejemplos. Si recibí un correo electrónico de una persona específica, envíeme un SMS. Si mi autor favorito ha publicado un nuevo artículo en su blog, hágamelo saber en Slack. O si es hora de un evento específico en Google Calendar, envíeme un correo electrónico. Espero que ahora esté claro a qué estoy conduciendo. Este servicio puede monitorear ciertos eventos (se llaman disparadores) y realizar algunas acciones cuando ocurren estos eventos. IFTTT admite una gran cantidad de posibles desencadenantes y acciones. Podía rastrear mis eventos en Google Calendar, y cuando ocurriera un evento específico, me enviaría un correo electrónico, eliminaría el evento anterior y agregaría uno nuevo más adelante. Wow! ¡Exactamente lo que se requiere! Pero en realidad no.
En primer lugar, IFTTT solo permite una acción en un disparador. Este no es un gran problema, porque Puede crear múltiples applets con disparadores idénticos (un applet es una combinación de un disparador y una acción en IFTTT). Uno me enviará una carta, el otro eliminará el evento anterior, el tercero creará un evento nuevo. Pero hay un obstáculo más serio. Para un nuevo evento, necesito crear un tiempo de respuesta con aleatorización. Y no encontré cómo hacer esto en IFTTT. Esto significa que este servicio no puede resolver mi problema. ¿Pero tal vez hay otros servicios similares en Internet? Si lo hay
El siguiente sitio que revisé fue
Zapier . Aquí podemos usar varias acciones en un disparador, lo cual es bueno. Pero solo está disponible por dinero, lo que no es tan bueno. No he jugado con Zapier el tiempo suficiente, pero tuve la impresión de que tampoco brinda la oportunidad de la aleatorización que necesito. Aunque aquí puedo estar equivocado. En cualquier caso, pasé al siguiente candidato.
Fue
Microsoft Flow . Este servicio me permite rastrear 750 disparadores por mes de forma gratuita. Esto es más que suficiente para mis necesidades. Además, tiene soporte para expresiones, ¡incluida la función
rand () ! Esto es exactamente lo que necesitas. Ahora déjame mostrarte cómo resolver el problema descrito usando Microsoft Flow.
Solución
Primero necesitas crear un nuevo flujo. Una secuencia es una combinación de disparador y acción. Para hacer esto, regístrese en el sitio y en el menú principal, haga clic en
Mis flujos y luego en
Crear en blanco :

Haga clic en el botón Crear desde en blanco:

Se le pedirá que seleccione un disparador. Ingrese "calendario" en el campo de búsqueda y seleccione
Google Calendar :

En la lista de activadores disponibles para Google Calendar, seleccione
Cuando comienza un evento :

Aquí se le puede solicitar que permita el acceso de Microsoft Flow a Google Calendar en su nombre.
Ahora el gatillo está listo. Su único parámetro es el calendario:

Sí, puedes crear varios calendarios en Google Calendar. Cada evento pertenece a uno de los calendarios, y debe seleccionar un calendario cuyos eventos activarán sus acciones.
No hay nada de malo en crear un nuevo calendario y poner en él todos los eventos para los que se deben activar sus acciones. Pero si no es necesario procesar todos los eventos del calendario, puede usar el filtrado. Haga clic en
Nuevo paso y luego en
Agregar una condición :

Esto creará un filtro para ti. Ahora debe decidir exactamente cómo queremos filtrar los eventos. Por ejemplo, quiero procesar solo aquellos eventos que contienen el texto "[ALEATORIO]" en el campo "ubicación". Para hacer esto, haga clic en el campo
Elegir entrada de
valor . Microsoft Flow le mostrará una lista de posibles valores con los que puede trabajar:

Haga clic en
Lista de eventos Ubicación del evento . Y complete los campos restantes con los valores apropiados:

Presta atención al enlace
Editar en modo avanzado . Ella es muy útil Si hace clic en él, obtendrá una representación de la misma condición que una expresión de texto:

Esto ayudará mucho cuando llegue el momento de escribir sus propias expresiones.
Ahora puede agregar acciones para nuestros eventos. En la
sección Si sí de su filtro, haga clic en el enlace
Agregar una acción . Aquí crearé una acción que me enviará una notificación de evento en Gmail:

Como puede ver, puede usar los datos de su evento para completar el Asunto, el Cuerpo y otras propiedades de esta acción.
Ahora tenemos notificaciones. Es hora de eliminar el evento anterior en el calendario y crear uno nuevo más adelante. Use el enlace
Agregar una acción para crear la acción
Eliminar un evento para Google Calendar:

Debe decirse que es muy posible simplemente cambiar el evento en el calendario en lugar de eliminar el antiguo y crear uno nuevo. Pero aquí, sin embargo, me atendré a la última opción para mostrarle otra característica de Microsoft Flow. Supongamos que quiero que se cree un nuevo evento en el calendario, no después de eliminar el viejo, sino en paralelo con esto. Desplácese sobre las acciones
Enviar correo electrónico y
Eliminar un evento . Aparecerá un signo más en la pantalla. Haga clic en él y seleccione
Agregar una rama paralela → Agregar una acción en el menú contextual:

Ahora podemos agregar la acción paralela
Crear un evento desde
Google Calendar . Para esta acción, tomaremos el título, la descripción y la ubicación de nuestro evento fuente. Lo único que queda por hacer es establecer las horas de inicio y finalización del nuevo evento:

Ahora llegamos a la parte realmente interesante. Necesitamos agregar de alguna manera un número aleatorio de días al inicio del evento actual. Utilizaremos esta nueva fecha como el comienzo del evento creado. Por ejemplo, quiero agregar 30 días más / menos 2 días. La documentación de las funciones disponibles se puede encontrar
aquí . Lo admito, esta no es una lectura muy simple. Tenía muchas preguntas, especialmente sobre cómo extraer la hora de inicio del evento fuente para que pueda usarse en las funciones. Se puede obtener ayuda de nuestro filtro. Recuerde el enlace
Editar en modo avanzado :

Al hacer clic en él, se muestra la expresión correspondiente:

Esto me dio alguna pista al escribir mis expresiones. Ahora haga clic en el campo
Hora de inicio del
evento Crear un evento y seleccione la pestaña
Expresión :

En el campo de entrada, escriba la siguiente expresión:
addDays(triggerBody()?['start'], add(30, rand(mul(2, -1), add(2, 1))))
y haga clic en
Ok . Esta expresión resuelve exactamente nuestro problema: agrega 30 días más / menos 2 días a la hora de inicio del evento inicial. Pero, ¿y si necesito algo de flexibilidad? ¿Qué pasa si quiero tener varios tipos de eventos? Para los eventos del primer tipo, aumentaré el tiempo de inicio en 30 días más / menos 2 días, para los eventos del segundo tipo, en 14 días más / menos 3 días, etc. ¿Cómo es esto posible de lograr?
Aquí hay un camino. ¿Recuerda que almacenamos la cadena "[ALEATORIO]" en el campo "ubicación" de nuestros eventos? Ahora escribiremos información adicional en este campo. Su contenido será texto en el formato "[ALEATORIO], NN, MM", donde NN tiene dos dígitos y MM también tiene dos dígitos. Aumentaremos el tiempo de ocurrencia del evento en NN días más / menos días MM. Usando este formato, puedo estar seguro de que los caracteres en las posiciones 9 y 10 (comenzando desde 0) de la cadena representarán NN, y los caracteres en las posiciones 12 y 13 serán MM. Y aquí hay una expresión que usa este nuevo formato de almacenamiento de información para aumentar la hora de inicio de un evento:
addDays(triggerBody()?['start'], add(int(substring(triggerBody()?['location'], 9, 2)), rand(mul(int(substring(triggerBody()?['location'], 12, 2)), -1), add(int(substring(triggerBody()?['location'], 12, 2)), 1))))
Utiliza la función de
subcadena para seleccionar las partes necesarias de la cadena y la función
int para convertirlas en enteros.
Wow! Casi hemos alcanzado nuestra meta. Solo queda establecer la hora de finalización del nuevo evento. Y aquí nos encontramos con nuestro último obstáculo. Es necesario que la hora de finalización de un evento sea igual a la hora de inicio más 15 minutos. Microsoft Flow admite la función
addMinutes , y podría escribir una expresión como:
addMinutes(< >, 15)
Sin embargo, por la naturaleza de la función
rand , terminamos con un valor que no tiene nada que ver con el valor para el momento en que comenzó el evento. En cambio, sería bueno tener la variable 'nextStart' que contendría el valor de nuestra expresión. Entonces podríamos usar su valor para el momento en que comenzó el evento, y usar
addMinutes(< 'nextStart'>, 15)
por el tiempo que termina. ¿Y sabes que? Microsoft Flow admite variables. Primero necesitamos inicializarlo. Desplácese sobre la flecha entre el gatillo y el filtro. Haga clic en el signo más y seleccione
Agregar acción :

Ingrese "Variables" en el campo de búsqueda y seleccione
Inicializar variable :

Establezca el nombre de la variable en 'nextStart' y escriba 'String'. Microsoft Flow no tiene un tipo separado para fechas y horas; utiliza cadenas en todas partes.

Ahora necesita establecer el valor para esta variable. Esto no se puede hacer aquí, ya que aún no se sabe si este evento es correcto. Solo después del filtro podemos estar seguros de esto. Por lo tanto, agregamos otra acción del tipo de
variable Establecer después de enviar la notificación por correo:

Aquí establecemos el valor de la variable creada en nuestra expresión larga. Solo queda reutilizar esta variable en las expresiones para la hora de inicio y finalización del evento. Puede hacer referencia a una variable en una expresión como esta:
variables('nextStart')
Por lo tanto, la expresión para la hora de finalización del evento se verá así:
addMinutes(variables('nextStart'), 15)

Conclusión
Este es el final de la historia. Solo necesita guardar la transmisión, y Microsoft Flow la lanzará por nosotros.
Espero que este artículo te sea útil. Para mí, Microsoft Flow ha sido una gran herramienta de automatización de tareas.