Saltar para o conteúdo
Consultoria · Automação · Dados · Digital

Category Archive Uncategorized

Constrói o PC

Constroi o Computador

Constrói o Computador é um jogo educativo e interativo criado para ajudar os alunos a compreenderem melhor os principais componentes de um computador.

Ao longo do jogo, os participantes têm de colocar corretamente peças como o processador, a memória RAM, o disco SSD, a motherboard, a fonte de alimentação e a placa gráfica. Depois da montagem, são desafiados com perguntas rápidas sobre hardware, periféricos e funcionamento básico do computador.

É uma atividade ideal para aulas de TIC, introdução à informática, clubes de tecnologia ou momentos de aprendizagem autónoma. Com uma abordagem simples, visual e divertida, este jogo transforma conceitos técnicos em desafios acessíveis e motivadores.

Carrega aqui para jogar.

Carrega aqui para comprar o pack completo (15 jogos).

Jardim dos Números

Procuras uma forma divertida de ensinar números às crianças?

O Jardim dos Números é um jogo educativo interativo onde os mais pequenos aprendem a contar, reconhecer números e desenvolver o raciocínio lógico através de um sistema visual e intuitivo 🌸

✔️ Arrastar e largar (drag & drop)
✔️ Modo desafio com instruções por voz
✔️ Sistema de estrelas e recompensas ⭐
✔️ Níveis: 0–5, 0–10, pares e ímpares
✔️ Modo professor com métricas
✔️ Certificado final imprimível 🏅

Ideal para:
👩‍🏫 professores
👨‍👩‍👧 pais
🧒 crianças dos 3 aos 6 anos

💡 Perfeito para usar em casa ou na sala de aula

👉 Clica para experimentar

Jardim_Numeros_PT-683x1024 Jardim dos Números

Carrega aqui para jogar a Demo

Adquire aqui a versão completa

EuroVault360 | Gestão Financeira Inteligente

O EuroVault360 é uma aplicação inovadora de gestão financeira pessoal que te ajuda a controlar, analisar e otimizar o teu dinheiro de forma simples e inteligente.

Com funcionalidades avançadas como categorização automática de despesas, análise de padrões de consumo, definição de objetivos de poupança e alertas personalizados, o EuroVault360 transforma a forma como geres as tuas finanças no dia a dia.

Ideal para quem quer poupar mais, evitar gastos desnecessários e ter uma visão clara das suas finanças, tudo numa única plataforma segura e intuitiva.

Se procuras uma app para controlar despesas, gerir orçamento mensal, melhorar a literacia financeira ou simplesmente organizar melhor o teu dinheiro, o EuroVault360 é a solução certa.

Descobre como alcançar estabilidade financeira com tecnologia inteligente.

#financaspessoais #gestaofinanceira #poupardinheiro #controlegastos #literaciafinanceira #fintech #organizacaofinanceira #appsfinanceiras #orcamento #moneytips

Eurovault-683x1024 EuroVault360 | Gestão Financeira Inteligente

Orçamentos sob consulta, contacte-nos.

Aprender formas nunca foi tão divertido!

Clico_SmartShapes Aprender formas nunca foi tão divertido!

Carrega aqui para jogar a Demo

Adquira aqui a versão completa

Transformar formulários PDF em Powerapps

Cansado de formulários em PDF? Crie uma app simples com Power Apps

 

Muitas organizações ainda dependem de formulários em PDF enviados por email. O resultado é previsível: versões perdidas, informação incompleta, anexos espalhados e dificuldade em acompanhar o estado dos pedidos.

A boa notícia?
Com Power Apps + SharePoint + Power Automate, consegue criar uma aplicação simples de pedidos (intake app) em poucas horas — sem necessidade de programação avançada.

Este tutorial mostra-lhe o caminho mais rápido e funcional.

🎯 Objectivo da solução

Criar uma aplicação que permita:

  • Recolher dados administrativos (nome, departamento, descrição, etc.)
  • Anexar documentos de suporte
  • Guardar tudo de forma estruturada no SharePoint
  • Facilitar o acompanhamento dos pedidos

Arquitetura recomendada (simples e eficaz)

Componente

Função

SharePoint List

Guarda os dados do pedido

Power Apps

Interface para o utilizador preencher o formulário

Anexos do SharePoint

Guarda os documentos associados

(Opcional) Power Automate

Notificações, aprovações, automações

Se precisa apenas de substituir o PDF rapidamente, usar anexos da lista é a opção mais rápida e suficiente na maioria dos casos.

Passo 1 — Criar a lista no SharePoint

Crie uma nova Lista do SharePoint com colunas como:

  • Nome do requerente (Texto)
  • Email (Texto)
  • Departamento (Escolha)
  • Tipo de pedido (Escolha)
  • Prioridade (Baixa / Média / Alta)
  • Descrição (Texto multilinha)
  • Data pretendida (Data)
  • Estado (Novo / Em análise / Aprovado / Rejeitado)

👉 Não precisa criar coluna para anexos — o SharePoint já permite anexos automaticamente.

Passo 2 — Gerar a app automaticamente com Power Apps

Na própria lista do SharePoint:

  1. Clique em Integrar → Power Apps → Criar uma aplicação
  2. Dê um nome à app
  3. Aguarde a geração automática

O Power Apps cria automaticamente:

  • Ecrã de listagem
  • Ecrã de detalhe
  • Formulário de criação/edição

Neste ponto, já tem uma app funcional.

Passo 3 — Activar upload de documentos (anexos)

No ecrã de formulário:

  1. Seleccione o formulário
  2. No painel direito, clique em Editar campos
  3. Adicione o campo Attachments (Anexos)
  4. Reorganize o formulário conforme necessário

Resultado:
O utilizador pode agora anexar ficheiros directamente no pedido, tal como faria num formulário moderno.

Passo 4 — Melhorias rápidas que aumentam muito a qualidade

Com pequenos ajustes, a app passa de “funcional” para “profissional”:

✔️ Tornar campos obrigatórios

Selecione um campo → Advanced → Required = true

✔️ Mostrar mensagens de erro

Já vem integrado nos formulários padrão do Power Apps.

✔️ Mostrar apenas pedidos do próprio utilizador

Na galeria de listagem:

Filter(ListaPedidos, CreatedBy.Email = User().Email)

✔️ Mensagem de confirmação após submissão

Após o botão de Submeter:

Notify(“Pedido submetido com sucesso.”, NotificationType.Success)

Quando usar Document Library em vez de anexos?

Use biblioteca de documentos + Power Automate se:

  • Precisa de controlo documental formal
  • Precisa de permissões por ficheiro
  • Os documentos são reutilizados por outros processos
  • Existe auditoria ou compliance envolvido

Caso contrário, para 80% dos cenários administrativos, anexos na lista são mais do que suficientes e muito mais rápidos de implementar.

Resultado final

Passa de isto:

❌ PDF por email
❌ Ficheiros perdidos
❌ Versões erradas
❌ Falta de rastreabilidade

Para isto:

✅ App moderna
✅ Dados estruturados
✅ Anexos organizados
✅ Histórico completo
✅ Fácil evolução futura

Conclusão

Não é necessário um grande projecto para eliminar formulários em PDF.
Com Power Apps e SharePoint é possível criar uma solução profissional, segura e escalável em poucas horas.

Se já trabalha com Microsoft 365, as ferramentas já estão incluídas no seu ecossistema.

 

pdf_powerapps Cansado de formulários em PDF? Crie uma app simples com Power Apps

Comparar dois ficheiros HTML no Power Automate

Se já tentaste “comparar HTML” no Power Automate, já deves ter percebido rapidamente o problema:
HTML não é texto simples.

Pequenas diferenças invisíveis — espaços extra, quebras de linha, atributos em ordem diferente, IDs dinâmicos, timestamps escondidos em comentários — fazem dois ficheiros visualmente idênticos parecerem completamente diferentes para o motor de comparação.

A boa notícia?
👉 Dá para fazer isto bem, desde que escolhas a abordagem certa.

Primeiro passo: o que queres realmente comparar?

Antes de começares a construir o fluxo, define claramente o objetivo. Parece óbvio, mas é aqui que muitos projetos falham.

Pergunta-te:

  • Quero saber se o HTML é exatamente igual (byte a byte)?
  • Quero saber se o conteúdo é o mesmo, ignorando formatação?
  • Quero identificar o que mudou (diff) para registar ou enviar alertas?

Cada objetivo exige uma estratégia diferente.

Opção A — Igualdade “exata” (rápida e simples)

Quando usar

Quando os ficheiros são gerados de forma controlada:

  • Mesmo sistema de origem
  • Mesmo template
  • Sem elementos dinâmicos
  • Sem timestamps automáticos

Lógica do processo (alto nível)

  1. Obter o conteúdo dos dois ficheiros
    (SharePoint, OneDrive, email, HTTP request, etc.)
  2. Converter para texto (caso venha em binário)
  3. Comparar diretamente as duas strings

Exemplo de condição no Power Automate

TextoHTML_1 é igual a TextoHTML_2

Problema comum

Basta existir:

  • Um espaço extra
  • Uma quebra de linha diferente
  • Um comentário com timestamp
  • Um atributo em ordem diferente

… e a comparação falha, mesmo que visualmente os ficheiros sejam iguais.

Conclusão: útil apenas em cenários muito controlados.

Opção B — Normalizar antes de comparar (a mais útil no mundo real)

Esta é, de longe, a abordagem mais prática no dia a dia.

A ideia é simples:
👉 limpar o “ruído” do HTML antes da comparação.

Ou seja, transformar os dois ficheiros numa versão mais previsível e estável.

Técnicas de normalização que funcionam bem

Estas técnicas resolvem a maioria dos casos práticos:

  • Remover quebras de linha (\r, \n)
  • Remover tabs (\t)
  • Reduzir múltiplos espaços para um só
  • Converter tudo para lowercase (em certos cenários)
  • Remover partes dinâmicas:
    • IDs gerados automaticamente
    • Tokens
    • Timestamps
    • GUIDs

Exemplos práticos de expressões no Power Automate

Assumindo que já tens duas variáveis de texto:

  • html1
  • html2

Remover quebras de linha e tabs

replace(

  replace(

    replace(variables(‘html1’), ‘\r’, ”),

    ‘\n’, ”

  ),

  ‘\t’, ”

)

Repete o mesmo para html2.

Reduzir espaços duplos

Infelizmente, o Power Automate não tem regex nativa, por isso por vezes é necessário aplicar o replace várias vezes:

replace(<texto>, ‘  ‘, ‘ ‘)

Em casos mais problemáticos, aplicas esta operação 2 ou 3 vezes em sequência.

Converter para lowercase (opcional)

toLower(<texto_normalizado>)

Útil quando não te interessa distinguir entre maiúsculas e minúsculas nos elementos HTML.

Comparação final

Depois de normalizares ambos os textos:

  • html1_normalizado
  • html2_normalizado

A comparação torna-se muito mais fiável:

html1_normalizado é igual a html2_normalizado

E de repente, aquilo que antes parecia impossível começa a funcionar com consistência.

Conclusão

Comparar HTML no Power Automate não é um problema técnico — é um problema de abordagem.

Se comparares HTML “em bruto”, vai haver falsos positivos constantemente.
Se normalizares primeiro, consegues construir fluxos robustos e confiáveis.

A regra prática é simples:
Nunca compares HTML antes de o tornares previsível.

 

Html_Compare-1024x683 Comparar dois ficheiros HTML no Power Automate
Birthday Email Flow - Power Automate

Como Criar E-mails Automáticos de Aniversário no Power Automate

Quantas vezes a sua empresa esquece-se de felicitar colaboradores ou clientes no dia do aniversário?
Com o Power Automate, é possível criar um fluxo totalmente automático que envia e-mails personalizados de parabéns — sem esforço e sem falhas.

Neste artigo, mostramos passo a passo como implementar esta automação e como ela pode reforçar o relacionamento humano numa era digital.O que é o Power Automate

O Power Automate, parte do Microsoft 365, permite criar fluxos automáticos entre aplicações como Outlook, Excel, Teams e SharePoint.
Com ele, qualquer utilizador pode automatizar tarefas repetitivas, sem necessidade de programar.

A ideia: felicitar automaticamente

O objetivo é simples:

  • Ter uma base de dados (Excel ou SharePoint) com nomes, e-mails e datas de nascimento;

  • Criar um fluxo diário que verifica quem faz anos;

  • Enviar automaticamente um e-mail personalizado de felicitações.

Como funciona o fluxo

  1. Ação Recorrente (Recurrence): verifica todos os dias às 08:00;

  2. Ligação ao Excel: lê a tabela “Aniversarios”;

  3. Cálculo da data atual: usa formatDateTime(utcNow(),'MM-dd');

  4. Filtro: compara as datas de nascimento com o dia atual;

  5. Envio do e-mail: o Power Automate envia a mensagem personalizada com o nome da pessoa.

Benefícios para a empresa

  • 1f553 Como Criar E-mails Automáticos de Aniversário no Power Automate Poupança de tempo — elimina tarefas manuais de RH/marketing;

  • 1f389 Como Criar E-mails Automáticos de Aniversário no Power Automate Melhora o clima interno — cada colaborador sente-se valorizado;

  • 1f9e0 Como Criar E-mails Automáticos de Aniversário no Power Automate Zero esquecimentos — o sistema nunca falha;

  • 1f512 Como Criar E-mails Automáticos de Aniversário no Power Automate Conformidade com RGPD — apenas usa dados necessários, com opção de opt-out.

Como começar

O fluxo pode ser criado do zero em minutos ou adquirido já configurado e pronto a usar — basta atualizar os contactos no Excel.

1f449 Como Criar E-mails Automáticos de Aniversário no Power Automate Quer poupar tempo e surpreender a sua equipa?
Entre em contacto ou adquira já o modelo pronto de “Envio Automático de Aniversários com Power Automate”.

flow_aniversario_eng Como Criar E-mails Automáticos de Aniversário no Power Automate
Espelhar listas de Sharepoint com Power Automate

Guia Prático: Espelhar Todas as Listas do SharePoint com Power Automate

Espelhar Listas SharePoint com Power Automate (Multi-Ambiente)

Espelhar Listas SharePoint com Power Automate (Multi-Ambiente)

Quer espelhar listas SharePoint e manter todas as listas dos seus sites de destino com o mesmo esquema (colunas) que as listas de um site de origem? Neste guia mostro o flow que uso para:

  • Percorrer todas as listas e bibliotecas do site de origem;
  • Criar a lista/biblioteca no destino se ainda não existir;
  • Comparar campos (por InternalName) e criar automaticamente os que faltam;
  • Lidar com vários destinos (ambientes diferentes) para espelhar listas SharePoint com consistência;
  • Tratar Lookups com mapeamento por ambiente.

Sem conectores premium, apenas Send an HTTP request to SharePoint e ações standard. 👇

Quando usar (e quando não)

Use quando precisa de espelhar listas SharePoint para manter consistência de esquema entre ambientes (Dev/Test/Prod) sem trabalho manual.

Não use para migrar dados (linhas) nem para tipos muito específicos como Managed Metadata complexos — podem ficar para uma fase 2.

Arquitetura do Flow para espelhar listas SharePoint

  • Trigger: Recurrence (ex.: de hora a hora).
  • Origem: 1 site SharePoint.
  • Destino(s): 1..N sites SharePoint.
  • Estratégia:
    1. Listar todas as listas/bibliotecas visíveis na origem;
    2. Para cada destino:
      • Garantir que a lista/biblioteca existe (cria se faltar);
      • Obter campos da origem (apenas custom);
      • Obter campos do destino;
      • MissingFields = origem − destino;
      • Criar MissingFields com POST à API (sem XML) — e XML/ajustes só quando necessário (Lookup, etc.).

Pré-requisitos

  • Conta de serviço com permissões para ler e alterar esquema nos sites de origem e destino(s).
  • Conector Send an HTTP request to SharePoint configurado nos tenants necessários.
  • Naming consistente de listas (ou use o caminho server-relative).

Variáveis base (Initialize)

  • SourceSiteUrl (String) → URL do site origem
    Ex.: https://<tenant>.sharepoint.com/sites/Origem
  • TargetSites (Array) → destinos + (opcional) mapas por ambiente:
[
  {
    "siteUrl": "https://<tenantA>.sharepoint.com/sites/DestinoA",
    "lookupMap": {
      "ClienteId": { "TargetListServerRelativeUrl": "/sites/DestinoA/Lists/Clientes" }
    }
  },
  {
    "siteUrl": "https://<tenantB>.sharepoint.com/sites/DestinoB",
    "lookupMap": { }
  }
]
  • CurrentSiteUrl (String) = ""
  • CurrentListTitle (String) = ""
  • CurrentLookupMap (Object) = {}
  • TargetInternalNames (Array) = []

Dica: pode guardar TargetSites num ficheiro JSON numa biblioteca e lê-lo com “Get file content”.

Passo 1 — Listar listas/bibliotecas na origem

HTTP (GET) – Get_All_Lists

  • Site Address: @{variables('SourceSiteUrl')}
  • Headers: Accept: application/json;odata=nometadata
  • URI:
_api/web/lists?$select=Title,BaseTemplate,Hidden,RootFolder/ServerRelativeUrl,Id
&$expand=RootFolder
&$filter=(Hidden eq false) and ((BaseTemplate eq 100) or (BaseTemplate eq 101))
&$top=5000

Apply to each – ForEach_SourceLists
From@{body('Get_All_Lists')?['value']}

  • Compose – SourceListTitle@{items('ForEach_SourceLists')?['Title']}
  • Compose – SourceListUrl@{items('ForEach_SourceLists')?['RootFolder']?['ServerRelativeUrl']}

BaseTemplate 100 = Lista; 101 = Biblioteca. Adicione outros se precisar.

Passo 2 — Para cada destino

Apply to each – ForEach_TargetSites
From@{variables('TargetSites')}

  • Set var – CurrentSiteUrl@{items('ForEach_TargetSites')?['siteUrl']}
  • Set var – CurrentLookupMap@{items('ForEach_TargetSites')?['lookupMap']}
  • Set var – CurrentListTitle@{outputs('SourceListTitle')}

2.1 Garantir que a lista existe

HTTP (GET) – Get_Target_List_By_Title

  • Site: @{variables('CurrentSiteUrl')}
  • Headers: Accept: application/json;odata=nometadata
  • URI:
_api/web/lists?$filter=Title eq '@{replace(variables('CurrentListTitle'),'''','''''')}'
&$select=Id,Title,BaseTemplate&$top=1

Condition – ListExists@greater(length(body('Get_Target_List_By_Title')?['value']), 0)

If NO → HTTP (POST) – Create_List

  • Site: @{variables('CurrentSiteUrl')}
  • Headers: Accept: application/json;odata=verbose + Content-Type: application/json;odata=verbose
  • URI: _api/web/lists
  • Body (Expression):
@json(
  concat(
    '{"__metadata":{"type":"SP.List"},"Title":"',
    replace(variables('CurrentListTitle'),'"','\"'),
    '","BaseTemplate":',
    string(items('ForEach_SourceLists')?['BaseTemplate']),
    ',"AllowContentTypes":true,"ContentTypesEnabled":true}'
  )
)

Se preferir criar por caminho (para bibliotecas com nomes localizados), também pode usar _api/web/folders + RootFolder (extra opcional).

Passo 3 — Obter campos da origem (custom)

HTTP (GET) – Get_Source_Fields

  • Site: @{variables('SourceSiteUrl')}
  • Headers: Accept: application/json;odata=nometadata
  • URI:
_api/web/GetList(@listUrl)/Fields
?$select=Title,InternalName,TypeAsString,SchemaXml,Hidden,ReadOnlyField,Sealed,FromBaseType,CanBeDeleted,Required
&@listUrl='@{outputs('SourceListUrl')}'

Filter array – Keep_Custom_Fields
From: @{body('Get_Source_Fields')?['value']}

@and(
  equals(item()?['Hidden'], false),
  equals(item()?['FromBaseType'], false),
  equals(item()?['Sealed'], false),
  equals(item()?['ReadOnlyField'], false)
)

Select – Project_Source_Fields
From: @{body('Keep_Custom_Fields')}
Map: InternalName, Title, TypeAsString, Required, SchemaXml.

Passo 4 — Obter campos do destino & calcular “MissingFields”

  • Set var – TargetInternalNames[] (limpar)

HTTP (GET) – Get_Target_Fields

  • Site: @{variables('CurrentSiteUrl')}
  • Headers: Accept: application/json;odata=nometadata
  • URI:
_api/web/lists/getbytitle('@{replace(variables('CurrentListTitle'),'''','''''')}')
/Fields?$select=InternalName

Apply to each – ForEach_TargetFields
From: @{body('Get_Target_Fields')?['value']}
Append to array – TargetInternalNames = @{item()?['InternalName']}

Filter array – MissingFields
From: @{body('Project_Source_Fields')}

@not(contains(variables('TargetInternalNames'), item()?['InternalName']))

Este passo assegura que consegue espelhar listas SharePoint criando apenas os campos em falta.

Passo 5 — Criar MissingFields

Apply to each – CreateMissingFields
From: @{body('MissingFields')}

Switch – On@{items('CreateMissingFields')?['TypeAsString']}

Cabeçalhos e Endpoint (iguais em todos os cases)

  • Site Address: @{variables('CurrentSiteUrl')}
  • URI: _api/web/lists/getbytitle('@{replace(variables('CurrentListTitle'),'''','''''')}')/Fields
  • Headers:
    • Accept: application/json;odata=verbose
    • Content-Type: application/json;odata=verbose

Bodies como Expression (@json(concat(...)))

Text

@json(concat('{"__metadata":{"type":"SP.FieldText"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":2,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"MaxLength":255}'))

Note (multilinha)

@json(concat('{"__metadata":{"type":"SP.FieldMultiLineText"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":3,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"NumberOfLines":6,"RichText":false,"AppendOnly":false}'))

Number

@json(concat('{"__metadata":{"type":"SP.FieldNumber"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":9,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),'}'))

DateTime

@json(concat('{"__metadata":{"type":"SP.FieldDateTime"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":4,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"DisplayFormat":0}'))

Boolean

@json(concat('{"__metadata":{"type":"SP.FieldBoolean"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":8,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"DefaultValue":"0"}'))

User

@json(concat('{"__metadata":{"type":"SP.FieldUser"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":20,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"AllowMultipleValues":false,"SelectionMode":0}'))

URL

@json(concat('{"__metadata":{"type":"SP.FieldUrl"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":11,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"DisplayFormat":0}'))

Choice (ajuste as opções)

@json(concat('{"__metadata":{"type":"SP.FieldChoice"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":6,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"Choices":{"results":["Opção 1","Opção 2","Opção 3"]},"EditFormat":0}'))

MultiChoice

@json(concat('{"__metadata":{"type":"SP.FieldMultiChoice"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":15,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"Choices":{"results":["A","B","C"]},"FillInChoice":false}'))
Precisa de ajuda

Lookup / LookupMulti

  1. HTTP (GET) – GetRefListId
    Site: @{variables('CurrentSiteUrl')}  |  Headers: Accept: application/json;odata=nometadata
    URI (por caminho, usando CurrentLookupMap):
_api/web/GetList(@listUrl)?$select=Id
&@listUrl='@{variables('CurrentLookupMap')?[items('CreateMissingFields')?['InternalName']]?['TargetListServerRelativeUrl']}'

Compose – RefListId@{body('GetRefListId')?['Id']}

Lookup (simples)

@json(concat('{"__metadata":{"type":"SP.FieldLookup"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":7,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"LookupList":"{',outputs('RefListId'),'}","LookupField":"Title","AllowMultipleValues":false}'))

LookupMulti

@json(concat('{"__metadata":{"type":"SP.FieldLookup"},"Title":"',replace(items('CreateMissingFields')?['Title'],'"','\"'),'","StaticName":"',items('CreateMissingFields')?['InternalName'],'","FieldTypeKind":7,"Required":',if(items('CreateMissingFields')?['Required'],'true','false'),',"LookupList":"{',outputs('RefListId'),'}","LookupField":"Title","AllowMultipleValues":true}'))

Se não existir entrada no CurrentLookupMap para aquele campo → não substitua (crie como simples) ou salte com log.

Boas práticas (o que funciona melhor)

  • Compare por InternalName, não por Title.
  • Faça escape de apóstrofos em getbytitle: replace(..., '''', '''''').
  • Prefira GetList(@listUrl) para bibliotecas/nomes localizados.
  • Controle de concorrência no loop de criação (1–3) para evitar throttling.
  • Crie logs (site/lista/campo/resultado) numa lista “AdminLogs”.
  • Use guard-rails: Conditions para só tratar Lookup quando houver lookupMap.
  • Faça um teste “seco”: primeiro calcule os MissingFields e escreva log; depois ative a criação para realmente espelhar listas SharePoint nos destinos.

Limitações & extensões

  • Managed Metadata (Taxonomia) e Calculated complexos: recomendo criar via SchemaXml (ou PnP/CLI) numa segunda fase.
  • Renomeações (Title): para sincronizar títulos, adicione um PATCH/MERGE para .../Fields/getbyinternalnameortitle('INTERNAL') com "Title":"Novo Título".
  • Content Types: em ambientes com content types partilhados, pode ser preferível publicar/associar content types em vez de mexer diretamente em cada lista.

Conclusão

Com este flow passa a espelhar listas SharePoint e garantir governança de esquema: qualquer lista nova/alterada na origem é replicada para todos os destinos, sem cliques manuais. A peça-chave é usar a API do SharePoint para listar, comparar e criar campos de forma segura, com variações para Lookups e bibliotecas.

PowerBI vs Excel

Power BI vs Excel: Quando Usar Cada Ferramenta?

📊 O Excel é, há décadas, uma das ferramentas mais utilizadas para análise e gestão de dados. No entanto, com o crescimento do volume de informação e a necessidade de visualizações mais interativas, o Power BI ganhou destaque como solução moderna para Business Intelligence. Neste artigo vamos comparar as duas ferramentas e responder à pergunta: quando usar cada uma?


🟢 O que é o Excel?

O Excel é uma ferramenta de folha de cálculo desenvolvida pela Microsoft, muito utilizada em empresas, escolas e no dia a dia. Permite cálculos simples e complexos, criação de tabelas dinâmicas, gráficos básicos e organização de dados de forma acessível.

✅ Pontos fortes do Excel:

  • 🖥️ Interface familiar e intuitiva
  • 🔢 Flexibilidade para cálculos e pequenas análises
  • 📑 Bom para relatórios rápidos e listas simples

⚠️ Limitações:

  • 📉 Difícil de gerir grandes volumes de dados
  • 📊 Visualizações limitadas
  • ✍️ Propenso a erros manuais

🟡 O que é o Power BI?

O Power BI é uma plataforma de Business Intelligence também criada pela Microsoft. Permite importar dados de múltiplas fontes, criar dashboards interativos, aplicar modelos de dados e utilizar linguagem DAX para análises avançadas.

✅ Pontos fortes do Power BI:

  • 📊 Dashboards visuais e interativos
  • ⚡ Capacidade de trabalhar com milhões de linhas de dados
  • 🔄 Atualizações automáticas com ligação a várias fontes
  • 🌍 Excelente colaboração em ambiente cloud

⚠️ Limitações:

  • 📘 Requer curva de aprendizagem maior
  • 📝 Não é tão prático para cálculos simples e rápidos
  • 💰 Algumas funcionalidades avançadas requerem licença Pro

📌 Comparação lado a lado

CritérioExcelPower BI
Facilidade de uso✅ Intuitivo, conhecido📘 Requer aprendizagem
Volume de dados📉 Limitado⚡ Escala com milhões
Visualização📊 Gráficos básicos📈 Dashboards avançados
Colaboração👥 Bom no Office 365🌍 Excelente na cloud
Custo💼 Incluído no Office💰 Versão gratuita + Pro

📒 Quando usar Excel

O Excel continua a ser imbatível quando se trata de análises rápidas e individuais. É ideal para:

  • 📑 Relatórios pequenos
  • ⚡ Análises rápidas e listas
  • 🔢 Cálculos diretos e tabelas simples

📊 Quando usar Power BI

O Power BI é a escolha certa quando a análise de dados precisa de escala, automação e partilha. É ideal para:

  • 📈 Grandes volumes de dados
  • 👥 Dashboards interativos para equipas
  • 🔄 Necessidade de atualizações automáticas

🤝 Usar em conjunto

O melhor dos dois mundos pode ser alcançado ao usar Excel e Power BI em conjunto. Por exemplo, podes preparar os dados e cálculos iniciais no Excel e depois importar para o Power BI para criar dashboards dinâmicos e interativos.


✅ Conclusão

O Excel continua a ser uma ferramenta poderosa para tarefas rápidas e análises individuais, enquanto o Power BI destaca-se em análises complexas, interativas e colaborativas. A verdadeira resposta não é escolher apenas um, mas sim perceber quando usar cada ferramenta ou até combiná-las para tirar o máximo proveito dos dados.

Power Automate: A Forma Mais Rápida de Automatizar Tarefas e aumentar a Produtividade

Power Automate: Automatiza Tarefas e Aumenta a Produtividade

Imagina que começas o teu dia com uma pilha de tarefas repetitivas e aborrecidas. E se pudesses automatizá-las com apenas alguns cliques? É aqui que entra o Power Automate, a ferramenta da Microsoft que está a transformar a forma como trabalhamos.

🧰 O que é o Power Automate?

O Power Automate é uma plataforma de automação low-code que permite ligar aplicações e serviços como Outlook, Excel, Teams, SharePoint, Gmail e muitos outros. Através de “fluxos” automáticos, podes configurar acções como enviar um e-mail, mover ficheiros, actualizar listas ou enviar notificações sem tocar numa linha de código.

Porque é que está a ganhar assim tanta popularidade?

  • Acessível a todos: mesmo sem conhecimentos técnicos, qualquer pessoa pode criar fluxos.

  • Resultados imediatos: pequenas automatizações poupam horas por semana.

  • Copilot com IA: cria fluxos com linguagem natural (ex: “enviar e-mail quando novo ficheiro é adicionado”).

  • Mais de 500 conectores: liga-te facilmente a centenas de apps populares.

Exemplo prático: um restaurante que automatizou tudo

Durante um evento da Microsoft, um pequeno empresário de restauração partilhou o seguinte:

“Uso o Power Automate para recolher dados inseridos numa lista no Microsoft Lists e passá-los automaticamente para um Excel. Depois, envio e-mails aos clientes com o resumo do pedido, notifico a equipa interna, e reinicio a lista todas as segundas-feiras com um simples clique.”

Com este fluxo, ele automatizou a produção, comunicação interna e gestão de dados. Tudo sem um programador. Resultado? Horas poupadas e uma equipa mais eficiente.

10 Situações onde o Power Automate faz magia

SituaçãoBenefício
Receber e-mails com anexosGuardar ficheiros automaticamente
Registar formuláriosPreencher listas ou bases de dados
Processar pedidos de fériasAprovação automática com alertas
Gerar relatórios diáriosEnviar Excel com dados do dia anterior
Sincronizar contactos ou tarefasEvitar duplicados entre sistemas
Alertas para mensagens importantesNotifica-te via Teams ou SMS
Criação de ficheiros PDFGera documentos com base em formulários
Pedidos ao suporteAbre ticket automaticamente
Fluxos de vendas ou leadsAutomatiza follow-up com os clientes
Limpeza de ficheiros repetidosElimina duplicados num só passo

 

Novidades em 2025: ainda mais poder com IA

Com a nova versão do Power Automate, estas são algumas funcionalidades que estão a impressionar:

  • Fluxos gerados por IA: descreve o que queres em linguagem natural, e o Copilot cria o fluxo.

  • Automatização de desktop inteligente: o sistema aprende com os teus cliques e replica.

  • Process mining integrado: identifica processos ineficazes e sugere melhorias.

  • Reutilização de componentes: cria “peças” reutilizáveis para os teus fluxos.

Começar é mais simples do que se pensa

  1. Entra em Power Automate

  2. Escolhe um modelo pronto ou cria um do zero

  3. Define o gatilho (por exemplo: “quando um e-mail chega”)

  4. Escolhe as acções que queres (enviar resposta, guardar ficheiro, etc.)

  5. Testa, ajusta e activa o teu fluxo

Dica extra: partilha e torna-te um herói da produtividade

Mostra os teus fluxos à equipa. Partilha prints, resultados e poupanças reais. Usa hashtags como #PowerAutomate #Produtividade no LinkedIn. Mostra que com criatividade, qualquer pessoa pode automatizar o trabalho.

PowerAutomate-1024x1024 Power Automate: A Forma Mais Rápida de Automatizar Tarefas e aumentar a Produtividade
Show Buttons
Hide Buttons