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

Category Archive Ms Office

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.

Modelo Powerpoint

Template de Powerpoint Natureza

Office: milhares de utilizadores vão ficar sem o Word, Outlook e PowerPoint!

A maioria dos utilizadores não dispensa o Office. Isto é perfeitamente normal. Afinal é o melhor pacote de produtividade sobretudo devido ao Word, Excel, Powerpoint e claro o Outlook. No entanto, o final deste mês pode trazer uma grande surpresa sobretudo para quem não dispensa o Office 365 e não quer ficar sem nada. É que a Microsoft fez uma alteração nos requisitos necessários e os milhares de pessoas que ainda utilizam o browser anterior da Microsoft não vão conseguir aceder. Isto não seria problema se a taxa de utilização do Internet Explorer 11 não fosse ainda tão alta. Sobretudo entre classes etárias mais elevadas.

Office: milhares vão ficar sem o Word, Outlook e PowerPoint!

A Microsoft já deu bastante tempo às pessoas para trocarem o Internet Explorer 11 pelo Edge. No entanto, várias teimam em não passarem para o novo browser. Curiosamente coincide com as muitas pessoas que não têm feito as atualizações. Como resultado disto e a partir do dia 17 de Agosto a Microsoft vai impedir totalmente o acesso ao Office. Pelo menos, a partir do IE.

offcie365users Office: milhares de utilizadores vão ficar sem o Word, Outlook e PowerPoint!

Num post colocado no seu blog a Microsoft afirma que todas as apps e serviços do Microsoft 365 vão deixar de funcionar.

Claro que tudo isto é muito fácil de resolver e para tirarem o máximo partido basta passarem do IE para o Edge. É que vale mesmo a pena. O mais recente browser da Microsoft está muito melhor. A versão baseada no Chromium foi lançada em 2020 e desde aí tem vindo a ganhar muitos utilizadores.

Deve mesmo atualizar o sistema operativo e o browser

A Microsoft está a ficar preocupada com a quantidade de pessoas que não fazem as atualizações e isto levou a algumas medidas drásticas. Lembro que em dezembro de 2020, a Microsoft começou a forçar a atualização de alguns computadores para o Windows 10 versão 1909 ou versão 2004. Isto foi revelado depois da Microsoft ter acabado com o suporte para o Windows 10 versão 1903, incluindo o Windows 10 Home e o Windows 10 Pro.

Office Docs

Navegando no Office Online: o que você precisa saber…

Atualmente existem vários pacotes de office online, que podem ser usados de forma gratuita, evitando assim  de instalar o Microsoft Office no computador.

Vejamos aqui alguns exemplos mais conhecidos:

google_docs Navegando no Office Online: o que você precisa saber...

Google Docs:

https://docs.google.com/document/u/0/

Para utilizar este pacote, é necessário ter uma conta Gmail.

Neste pacote pode-se criar Documentos, folhas de Excel, Apresentações e Formulários.

Uma conta Google gratuita dá 15GB (Drive) de espaço em disco de forma gratuita, e pode-se partilhar os ficheiros com outros utilizadores.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

office_docs Navegando no Office Online: o que você precisa saber...

Office Online:

https://www.office.com/?auth=1

Para usar este pacote é necessário uma conta Microsoft (hotmail ou outlook). Como no Google Docs, pode-se criar todo o tipo de documentos e pode-se partilhar os documentos com outros utilizadores.

Ao contrario do Google, a Microsoft só dá 5GB (OneDrive) de espaço em disco nas contas gratuitas.

 

Microsoft Powerpoint 2016 Básico

O Microsoft PowerPoint 2016 com uma subscrição do Office 365 é a versão mais recente do PowerPoint. Munido de um vasto conjunto de ferramentas, o PowerPoint permite ao utilizador produzir apresentações dinâmicas e profissionais.

Se pretender, pode adquirir este manual aqui:

Powerpoint 2016

 

Registo/Mapa Deslocações

Registo/Mapa de Despesas de Deslocações com relatório no final.

Se pretender por logótipo ou outra informação na base de dados e/ou relatório, contacte-nos: clico@clico.pt

Se não tiver o Access instalado na máquina, corra o Microsoft Access Runtime do site da Microsoft.

Faça download aqui:

UPDATE 29-06-2017 : Limpa a base de dados para não ter dados de exemplo, criando uma limpa para o utilizador.

Ecran-300x156 Registo/Mapa Deslocações
Update-300x149 Registo/Mapa Deslocações

Relatorio-297x300 Registo/Mapa Deslocações

Mapa Assiduidade Simples Automatizado Excel 2026

Como Automatizar o Mapa de Assiduidade no Excel e Poupar Tempo no RH

Num contexto empresarial em que a gestão de pessoal e o controlo de presença dos colaboradores é cada vez mais exigente, ter ferramentas que simplificam processos administrativos faz toda a diferença. Um mapa de assiduidade automatizado em Excel é uma solução acessível, eficiente e que pode ser adaptada a qualquer organização — desde pequenas equipas até departamentos de recursos humanos mais estruturados.

O que é um Mapa de Assiduidade Automatizado

O mapa de assiduidade automatizado em Excel é uma folha de cálculo pré-formatada que permite registar, consultar e analisar as presenças e ausências dos colaboradores ao longo do ano. Este tipo de mapa inclui:

  • Datas e dias úteis automaticamente preenchidos, com feriados nacionais já inseridos (ou que podem ser atualizados conforme o ano).

  • Registo diário de presenças ou faltas por colaborador.

  • Cálculo automático de totais mensais e anuais, eliminando grande parte do esforço manual de contagem.

  • Visualização rápida de padrões de assiduidade, útil tanto para gestores como para equipas de RH.

Ao automatizar o mapa de assiduidade, perdes menos tempo com tarefas repetitivas e concentras-te no que realmente importa: a análise e otimização da gestão do tempo de trabalho.

 


 

Porquê Usar um Mapa Automatizado no Excel

Existem várias razões pelas quais este mapa se torna indispensável:

  • Redução de erros humanos: as fórmulas e automatismos do Excel reduzem a necessidade de inserção manual e, consequentemente, os erros frequentes de registo.

  • Mais tempo para decisões estratégicas: menos tempo gasto a contar presenças significa mais tempo para melhorar a produtividade e gerir equipas.

  • Flexibilidade: podes adaptar o mapa consoante as necessidades da tua empresa (por exemplo, adicionar colunas para horas extras, turnos, ou comentários).

  • Transparência e conformidade: ter um registo digital atualizado ajuda na conformidade com políticas internas e com exigências legais.

Conclusão

Um mapa de assiduidade automatizado em Excel é uma ferramenta prática que pode transformar a forma como controlas a presença dos teus colaboradores. Não só reduz trabalho administrativo repetitivo, como também fornece dados fiáveis para análise. Se ainda usas folhas de papel ou registos manuais, automatizar o processo com o Excel é um excelente ponto de partida para uma gestão mais eficiente.

Para mais informações: Tudo em Conta – Loja Comércio Online

Show Buttons
Hide Buttons