Aqui, demonstrarei um exemplo não tão simples do uso do
Microsoft Flow para resolver um problema prático.
Declaração do problema
Às vezes, as tarefas para um programador surgem da vida cotidiana. Este foi um desses casos. Queria dar flores à minha esposa de vez em quando, digamos, uma vez por mês. Mas, ao mesmo tempo, não queria fazer isso em nenhuma data específica, por exemplo, no primeiro dia do mês. Então isso não seria uma surpresa. Eu queria randomização. Por exemplo, na próxima vez em que der flores, deve haver um mês após a hora anterior, mais / menos alguns dias.
Não há nada de especial nesses requisitos. É fácil o suficiente escrever um programa que me lembre desses eventos. Mas o aplicativo de desktop tem uma desvantagem significativa. Funcionará apenas em uma máquina, enquanto eu tiver várias delas (em casa, no trabalho, ...). E há um smartphone ... Não seria legal receber notificações em nenhum dos meus dispositivos?
Bem, você pode salvar as informações do evento em algum tipo de armazenamento online (como o
Mlab ). Nesse caso, todas as instâncias do meu aplicativo funcionarão com as mesmas informações, o que permitirá que elas sejam sincronizadas umas com as outras. No entanto, precisarei instalar esses aplicativos em todos os meus computadores. Além disso, eu uso o Windows em computadores e o Android no meu smartphone, então terei que escrever vários aplicativos diferentes se realmente quiser receber minhas notificações em todos os lugares. Como superar esse problema? Usando a Web, é claro.
Se eu criar um aplicativo Web, posso usá-lo em praticamente qualquer dispositivo. Ótimo! Mas ainda não é ótimo o suficiente. Deixe-me explicar meu argumento. Embora não seja tão difícil escrever um aplicativo da Web que resolva meu problema, ainda preciso cuidar de muitas coisas nesse caso. Você precisa pensar em hospedagem, armazenamento de dados, armazenamento de código, ... E por quê? Quase toda a funcionalidade necessária já está implementada em calendários modernos da Web, como o
Google Calendar . Ele pode criar eventos, torná-los recorrentes, enviar-me notificações sobre sua ocorrência etc. A única coisa que falta é a randomização exigida por mim. Não seria ótimo se eu pudesse adicionar esse recurso e usar todos os outros que já estão disponíveis?
Quando pensei sobre esse problema, me deparei com o site
IFTTT.com . A ideia deste site é simples, mas produtiva. Se algo acontecer, ele faz alguma coisa. Sei que isso parece estranho, então deixe-me dar alguns exemplos. Se eu receber um email de uma pessoa específica, envie-me um SMS. Se meu autor favorito publicou um novo artigo em seu blog, me informe no Slack. Ou se estiver na hora de um evento específico no Google Agenda, envie-me um e-mail. Espero que agora esteja claro o que estou levando. Este serviço pode monitorar certos eventos (eles são chamados de gatilhos) e executar algumas ações quando esses eventos ocorrem. O IFTTT suporta um grande número de possíveis gatilhos e ações. Eu poderia acompanhar meus eventos no Google Agenda e, quando um evento específico ocorre, eu me enviava um email, excluía o evento antigo e adicionava um novo posteriormente. Uau! Exatamente o que é necessário! Mas na verdade não.
Primeiro, o IFTTT permite apenas uma ação em um gatilho. Este não é um problema tão grande, porque Você pode criar vários applets com gatilhos idênticos (um applet é uma combinação de um gatilho e uma ação no IFTTT). Um me enviará uma carta, o outro excluirá o evento antigo, o terceiro criará um novo evento. Mas há um obstáculo mais sério. Para um novo evento, preciso criar um tempo de resposta com randomização. E não encontrei como fazer isso no IFTTT. Isso significa que este serviço não pode resolver meu problema. Mas talvez haja outros serviços semelhantes na Internet? Sim existe.
O próximo site que revi foi o
Zapier . Aqui podemos usar várias ações em um gatilho, o que é bom. Mas está disponível apenas por dinheiro, o que não é tão bom. Não brinquei com Zapier por tempo suficiente, mas tive a impressão de que ele também não oferece a oportunidade para a aleatorização que eu preciso. Embora aqui eu possa estar errado. De qualquer forma, mudei para o próximo candidato.
Foi o
Microsoft Flow . Este serviço me permite rastrear 750 gatilhos por mês gratuitamente. Isso é mais do que suficiente para minhas necessidades. Além disso, ele suporta expressões, incluindo a função
rand () ! É exatamente isso que você precisa. Agora, deixe-me mostrar como resolver o problema descrito usando o Microsoft Flow.
Solução
Primeiro, você precisa criar um novo fluxo. Um fluxo é uma combinação de gatilho e ação. Para fazer isso, registre-se no site e no menu principal, clique em
Meus fluxos e, em seguida, em
Criar do espaço em branco :

Clique no botão Criar em branco:

Você será solicitado a selecionar um gatilho. Digite "calendário" no campo de pesquisa e selecione
Google Agenda :

Na lista de gatilhos disponíveis para o Google Agenda, selecione
Quando um evento iniciar :

Aqui, você pode ser solicitado a permitir o acesso do Microsoft Flow ao Google Calendar em seu nome.
Agora o gatilho está pronto. Seu único parâmetro é o calendário:

Sim, você pode criar várias agendas no Google Agenda. Cada evento pertence a um dos calendários e você precisa selecionar um calendário cujos eventos acionarão suas ações.
Não há nada errado em criar um novo calendário e incluir nele todos os eventos para os quais suas ações devem ser acionadas. Mas se nem todos os eventos no calendário precisarem ser processados, você poderá usar a filtragem. Clique em
Nova etapa e, em seguida,
adicione uma condição :

Isso criará um filtro para você. Agora você precisa decidir exatamente como queremos filtrar os eventos. Por exemplo, desejo processar apenas os eventos que contêm o texto "[ALEATÓRIO]" no campo "local". Para fazer isso, clique no campo
Escolher valor . O Microsoft Flow mostrará uma lista de valores possíveis com os quais você pode trabalhar:

Clique em
Lista de Eventos Local do Evento . E preencha os campos restantes com os valores apropriados:

Preste atenção ao link
Editar no modo avançado . Ela é muito prestativa. Se você clicar nela, obtém uma representação da mesma condição que uma expressão de texto:

Isso ajudará muito quando chegar a hora de escrever suas próprias expressões.
Agora você pode adicionar ações para nossos eventos. Na seção
Se sim do seu filtro, clique no link
Adicionar uma ação . Aqui, criarei uma ação que me enviará uma notificação de evento no Gmail:

Como você pode ver, você pode usar os dados do seu evento para preencher o Assunto, Corpo e outras propriedades desta ação.
Agora temos notificações. É hora de excluir o evento antigo do calendário e criar um novo mais tarde. Use o link
Adicionar uma ação para criar a ação
Excluir um evento para o Google Agenda:

Deve-se dizer que é perfeitamente possível alterar o evento no calendário em vez de excluir o antigo e criar um novo. Mas aqui, no entanto, continuarei com a última opção para mostrar outro recurso do Microsoft Flow. Suponha que eu queira que a criação de um novo evento no calendário ocorra não após a exclusão do antigo, mas em paralelo com isso. Passe o mouse sobre as ações
Enviar email e
Excluir um evento . Um sinal de adição aparecerá na tela. Clique nele e selecione
Adicionar um ramo paralelo → Adicionar uma ação no menu de contexto:

Agora podemos adicionar a ação paralela
Criar uma ação do
Google Agenda . Para esta ação, pegaremos o título, a descrição e a localização do nosso evento de origem. A única coisa a fazer é definir os horários de início e término do novo evento:

Agora chegamos à parte realmente interessante. De alguma forma, precisamos adicionar um número aleatório de dias ao início do evento atual. Usaremos essa nova data como o início do evento criado. Por exemplo, quero adicionar 30 dias mais / menos 2 dias. A documentação dos recursos disponíveis pode ser encontrada
aqui . Eu admito, essa não é uma leitura muito simples. Eu tinha muitas perguntas, especialmente sobre como extrair o horário de início do evento de origem para que ele possa ser usado em funções. Alguma ajuda pode ser obtida em nosso filtro. Lembre-se do link
Editar no modo avançado :

Clicar nele mostra a expressão correspondente:

Isso me deu alguma pista para escrever minhas expressões. Agora clique no campo
Hora de início do
evento Criar um evento e selecione a guia
Expressão :

No campo de entrada, escreva a seguinte expressão:
addDays(triggerBody()?['start'], add(30, rand(mul(2, -1), add(2, 1))))
e clique em
Ok . Essa expressão resolve exatamente o nosso problema: adiciona 30 dias mais / menos 2 dias ao horário de início do evento inicial. Mas e se eu precisar de alguma flexibilidade? E se eu quiser ter vários tipos de eventos? Para eventos do primeiro tipo, aumentarei a hora de início em 30 dias, mais / menos 2 dias, para eventos do segundo tipo - em 14 dias, mais / menos 3 dias, etc. Como isso é possível?
Aqui está uma maneira. Lembra que armazenamos a string “[RANDOM]” no campo “location” dos nossos eventos? Agora vamos escrever informações adicionais neste campo. Seu conteúdo será texto no formato "[ALEATÓRIO], NN, MM", onde NN tem dois dígitos e MM também tem dois dígitos. Aumentaremos o tempo de ocorrência do evento em NN dias mais / menos MM dias. Usando esse formato, posso ter certeza de que os caracteres nas posições 9 e 10 (começando em 0) da sequência representarão NN e os caracteres nas posições 12 e 13 serão MM. E aqui está uma expressão que usa esse novo formato de armazenamento de informações para aumentar a hora de início de um 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))))
Ele usa a função
substring para selecionar as partes necessárias da string e a função
int para convertê-las em número inteiro.
Uau! Quase alcançamos nosso objetivo. Resta apenas definir o horário de término do novo evento. E aqui encontramos o nosso último obstáculo. É necessário que o horário do final do evento seja igual ao horário de início mais 15 minutos. O Microsoft Flow suporta a função
addMinutes e você pode escrever uma expressão como:
addMinutes(< >, 15)
No entanto, pela natureza da função
rand , acabamos com um valor que nada tem a ver com o valor do tempo em que o evento foi iniciado. Em vez disso, seria bom ter a variável 'nextStart' que conteria o valor da nossa expressão. Em seguida, poderíamos usar seu valor para o horário em que o evento começou e usar
addMinutes(< 'nextStart'>, 15)
para o tempo que termina. E você sabe o que? O Microsoft Flow suporta variáveis. Primeiro, precisamos inicializá-lo. Passe o mouse sobre a seta entre o gatilho e o filtro. Clique no sinal de adição e selecione
Adicionar ação :

Digite "Variáveis" no campo de pesquisa e selecione
Inicializar variável :

Defina o nome da variável como 'nextStart' e digite 'String'. O Microsoft Flow não possui um tipo separado para datas e horas; usa cadeias de caracteres em todos os lugares.

Agora você precisa definir o valor para essa variável. Isso não pode ser feito aqui, pois ainda não se sabe se esse evento está correto. Somente após o filtro podemos ter certeza disso. Portanto, adicionamos outra ação do tipo de
variável Set após o envio da notificação por email:

Aqui, definimos o valor da variável criada como nossa expressão longa. Resta apenas reutilizar essa variável nas expressões para o horário de início e término do evento. Você pode se referir a uma variável em uma expressão como esta:
variables('nextStart')
Portanto, a expressão para o horário de término do evento será semelhante a:
addMinutes(variables('nextStart'), 15)

Conclusão
Este é o fim da história. Você só precisa salvar o fluxo e o Microsoft Flow o lançará para nós.
Espero que este artigo seja útil para você. Para mim, o Microsoft Flow tem sido uma ótima ferramenta de automação de tarefas.