Sobre este projeto
it-programming / others-5
Aberto
let
// 0) Helpers (versão compatível, sem List.Accumulate)
NormalizeName = (n as text) as text =>
Text.Trim(Text.Replace(n, Character.FromNumber(160), " ")),
MakeUniqueNames = (names as list) as list =>
let
Fn = (lst as list, seen as list) as list =>
if List.IsEmpty(lst) then
{}
else
let
current = lst{0},
base = NormalizeName(current),
countBase = List.Count(List.Select(seen, each _ = base)),
unique = if countBase = 0 then base else base & " (" & Text.From(countBase + 1) & ")"
in
{unique} & @Fn(List.Skip(lst, 1), seen & {base})
in
Fn(names, {}),
RenameAllSafely = (tbl as table) as table =>
let
oldNames = Table.ColumnNames(tbl),
newNames = MakeUniqueNames(oldNames),
pairs = List.Zip({oldNames, newNames})
in
Table.RenameColumns(tbl, pairs, MissingField.Ignore),
RemoveIfExists = (tbl as table, cols as list) as table =>
List.Accumulate(
cols, tbl,
(t, c) => if List.Contains(Table.ColumnNames(t), c) then Table.RemoveColumns(t, {c}) else t
),
// ======================================================================
// 1) CONEXÃO – tenta OData (traz tudo); se falhar, usa SharePoint.Tables
// ======================================================================
SiteURL = "https://anheuserbuschinbev.sharepoint.com/sites/SEGURANAZBSSAZ",
ListaId = "ee7a0445-1d55-448c-b467-d5b9325c5540",
// Tenta via OData (normalmente não sofre corte de 2.000)
TryOData =
try
OData.Feed(
SiteURL & "/_api/web/lists(guid'" & ListaId & "')/items?$top=5000",
null,
[Implementation="2.0"]
)
otherwise null,
// Fallback: SharePoint.Tables (o seu original)
Origen =
if TryOData <> null and Value.Is(TryOData, type table) and Table.RowCount(TryOData) > 0
then null
else
SharePoint.Tables(
SiteURL,
[Implementation = "2.0", ViewMode = "All"]
),
FonteListaBase =
if TryOData <> null and Value.Is(TryOData, type table) and Table.RowCount(TryOData) > 0
then TryOData
else Origen{[Id = ListaId]}[Items],
// Ajuste de nomes vindos do OData (se vierem codificados) p/ manter compatibilidade
FixNames =
let
cols = Table.ColumnNames(FonteListaBase),
pairs = List.RemoveNulls({
if List.Contains(cols, "Hora_x0020_de_x0020_inicio") then {"Hora_x0020_de_x0020_inicio", "Hora de inicio"} else null,
if List.Contains(cols, "Hora_x0020_de_x0020_la_x0020__x00fa_ltima_x0020_modifica_x00e7__x00e3_o") then {"Hora_x0020_de_x0020_la_x0020__x00fa_ltima_x0020_modifica_x00e7__x00e3_o","Hora de la última modificación"} else null,
if List.Contains(cols, "M_x00ea_s_x0020_de_x0020_reporte_x003a_") then {"M_x00ea_s_x0020_de_x0020_reporte_x003a_","Mês de reporte:"} else null
})
in
if List.Count(pairs) > 0
then Table.RenameColumns(FonteListaBase, pairs, MissingField.Ignore)
else FonteListaBase,
// Esta tabela alimenta o restante do seu fluxo
FonteLista = FixNames,
// ======================================================================
// 2) Normalização de nomes de colunas
// ======================================================================
#"Colunas normalizadas" = RenameAllSafely(FonteLista),
// 3) Remover colunas indesejadas
#"Columnas quitadas" =
RemoveIfExists(
#"Colunas normalizadas",
{
"Mês de reporte:", "App Created By", "App Modified By", "Created By", "Modified By",
"Content Type", "Label applied by", "Color Tag", "Compliance Asset Id",
"Created", "Version", "Attachments", "Edit", "Type",
"Item Child Count", "Folder Child Count", "Label setting",
"Retention label", "Retention label Applied", "Item is a Record",
"Modified", "Nombre", "ID"
}
),
// 4) Duplicações condicionais (apenas duplicando colunas, não linhas)
#"Dup_Language" =
if List.Contains(Table.ColumnNames(#"Columnas quitadas"), "Language")
then Table.DuplicateColumn(#"Columnas quitadas", "Language", "Language - Copia")
else #"Columnas quitadas",
#"Dup_HoraInicio_1" =
if List.Contains(Table.ColumnNames(#"Dup_Language"), "Hora de inicio")
then Table.DuplicateColumn(#"Dup_Language", "Hora de inicio", "Hora de inicio - Copia")
else #"Dup_Language",
#"Dup_HoraInicio_2" =
if List.Contains(Table.ColumnNames(#"Dup_HoraInicio_1"), "Hora de inicio")
then Table.DuplicateColumn(#"Dup_HoraInicio_1", "Hora de inicio", "Hora de inicio - Copia.1")
else #"Dup_HoraInicio_1",
// 5) Renomes principais
#"Title_to_ID" =
if List.Contains(Table.ColumnNames(#"Dup_HoraInicio_2"), "Title")
then Table.RenameColumns(#"Dup_HoraInicio_2", {{"Title", "ID"}}, MissingField.Ignore)
else #"Dup_HoraInicio_2",
#"Ren_HoraFin" =
if List.Contains(Table.ColumnNames(#"Title_to_ID"), "Hora de la última modificación")
then Table.RenameColumns(#"Title_to_ID", {{"Hora de la última modificación", "Hora de finalización"}}, MissingField.Ignore)
else #"Title_to_ID",
#"Ren_Horas" = Table.RenameColumns(#"Ren_HoraFin", {
{"Hora de inicio - Copia", "Fecha inicio"},
{"Hora de inicio - Copia.1", "Mês de reporte:"}
}, MissingField.Ignore),
colNamesAfter = Table.ColumnNames(#"Ren_Horas"),
NomeTS_Candidate =
if List.Contains(colNamesAfter, "Nome do Território Seguro") then "Nome do Território Seguro"
else if List.Contains(colNamesAfter, "Nome do Território Seguro (2)") then "Nome do Território Seguro (2)"
else if List.Contains(colNamesAfter, "Nome do Território Seguro (3)") then "Nome do Território Seguro (3)"
else null,
#"Ren_NomeTS" =
if NomeTS_Candidate <> null and not List.Contains(colNamesAfter, "Nome TS")
then Table.RenameColumns(#"Ren_Horas", {{NomeTS_Candidate, "Nome TS"}}, MissingField.Ignore)
else #"Ren_Horas",
#"Ren_Idioma" = Table.RenameColumns(#"Ren_NomeTS", {{"Language - Copia", "Idioma"}}, MissingField.Ignore),
// 6) Coluna auxiliar
#"Personalizada agregada" = Table.AddColumn(#"Ren_Idioma", "Nombre", each ""),
// 7) Tratar "Mês de reporte:" (split opcional)
HasMesReporte = List.Contains(Table.ColumnNames(#"Personalizada agregada"), "Mês de reporte:"),
#"Dividir columna por delimitador" =
if HasMesReporte then
Table.SplitColumn(
#"Personalizada agregada",
"Mês de reporte:",
Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv),
{"Mês de reporte:.1", "Mês de reporte:.2", "Mês de reporte:.3"}
)
else #"Personalizada agregada",
#"Tipo cambiado" =
if HasMesReporte then
Table.TransformColumnTypes(#"Dividir columna por delimitador", {
{"Mês de reporte:.1", type date},
{"Mês de reporte:.2", type time},
{"Mês de reporte:.3", type text}
})
else #"Dividir columna por delimitador",
#"Columnas quitadas1" =
if HasMesReporte then
RemoveIfExists(#"Tipo cambiado", {"Mês de reporte:.2", "Mês de reporte:.3"})
else #"Tipo cambiado",
// 8) Join com calendário (protegido)
CalendarioJoin =
try
Table.NestedJoin(
#"Columnas quitadas1",
{"Mês de reporte:.1"},
#"Calendario Q",
{"Date"},
"Calendario Q",
JoinKind.LeftOuter
)
otherwise #"Columnas quitadas1",
#"Se expandió Calendario Q" =
if (try Table.HasColumns(CalendarioJoin, "Calendario Q") otherwise false) then
Table.ExpandTableColumn(
CalendarioJoin,
"Calendario Q",
{"Mês/Ano de reporte"},
{"Calendario Q.Mês/Ano de reporte"}
)
else CalendarioJoin,
#"Columnas quitadas2" = RemoveIfExists(#"Se expandió Calendario Q", {"Mês de reporte:.1"}),
#"Tipo cambiado1" =
if List.Contains(Table.ColumnNames(#"Columnas quitadas2"), "Calendario Q.Mês/Ano de reporte") then
Table.TransformColumnTypes(#"Columnas quitadas2", {{"Calendario Q.Mês/Ano de reporte", type date}})
else #"Columnas quitadas2",
#"Columnas con nombre cambiado1" =
if List.Contains(Table.ColumnNames(#"Tipo cambiado1"), "Calendario Q.Mês/Ano de reporte") then
Table.RenameColumns(#"Tipo cambiado1", {{"Calendario Q.Mês/Ano de reporte", "Mês de reporte:"}})
else #"Tipo cambiado1",
// 9.1 Garantir tipo datetime em "Hora de inicio" (se existir)
#"Tipo cambiado2" =
let
prev = #"Columnas con nombre cambiado1",
cols = Table.ColumnNames(prev)
in
if List.Contains(cols, "Hora de inicio")
then Table.TransformColumnTypes(prev, {{"Hora de inicio", type datetime}})
else prev,
#"Add_MesRef" =
if List.Contains(Table.ColumnNames(#"Tipo cambiado2"), "Mês de reporte:")
then
Table.AddColumn(
#"Tipo cambiado2", "MesRef",
each let v = Record.Field(_, "Mês de reporte:")
in if v = null then null else Date.StartOfMonth(Date.From(v)),
type date
)
else #"Tipo cambiado2",
// 9.2 Ordenação (mantém TODAS as linhas)
#"Filas ordenadas" =
Table.Buffer(
let
colsToSort =
List.Intersect({
{"MesRef", "Mês de reporte:", "Unidade", "Área", "Subárea", "Nome TS", "Turno", "Hora de inicio"},
Table.ColumnNames(#"Add_MesRef")
})
in
if List.Count(colsToSort) > 0 then
Table.Sort(
#"Add_MesRef",
List.Transform(colsToSort, (col) =>
if col = "Hora de inicio" then {col, Order.Descending} else {col, Order.Ascending}
)
)
else
#"Add_MesRef"
),
// ***** IMPORTANTE: sem dedupe *****
#"Sem_dedupe" = #"Filas ordenadas",
// 9.3 Ordenação por ID (se existir)
#"Filas ordenadas1" =
if List.Contains(Table.ColumnNames(#"Sem_dedupe"), "ID")
then Table.Sort(#"Sem_dedupe", {{"ID", Order.Descending}})
else #"Sem_dedupe",
// 10) Tratar "Fecha inicio" (opcional)
HasFechaInicio = List.Contains(Table.ColumnNames(#"Filas ordenadas1"), "Fecha inicio"),
#"Dividir columna por delimitador1" =
if HasFechaInicio then
Table.SplitColumn(
#"Filas ordenadas1",
"Fecha inicio",
Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, false),
{"Fecha inicio.1", "Fecha inicio.2"}
)
else #"Filas ordenadas1",
#"Tipo cambiado3" =
if HasFechaInicio then
Table.TransformColumnTypes(#"Dividir columna por delimitador1", {
{"Fecha inicio.1", type date},
{"Fecha inicio.2", type time}
})
else #"Dividir columna por delimitador1",
#"Columnas con nombre cambiado2" =
if HasFechaInicio then
Table.RenameColumns(#"Tipo cambiado3", {{"Fecha inicio.1", "Fecha inicio"}})
else #"Tipo cambiado3",
#"Columnas quitadas3" =
if List.Contains(Table.ColumnNames(#"Columnas con nombre cambiado2"), "Fecha inicio.2")
then Table.RemoveColumns(#"Columnas con nombre cambiado2", {"Fecha inicio.2"})
else #"Columnas con nombre cambiado2",
#"Linhas Filtradas" = Table.SelectRows(#"Columnas quitadas3", each true)
in
#"Linhas Filtradas"
Contexto Geral do Projeto
Preciso reativar um Bi que parou de atualizar e funcionar por conta disso
Categoria TI e Programação
Subcategoria Outros
Tamanho do projeto Médio
Isso é um projeto ou uma posição de trabalho? Um projeto
Tenho, atualmente Não se aplica
Disponibilidade requerida Conforme necessário
Integrações de API Outros (Outras APIs)
Prazo de Entrega: 16 de Outubro de 2025
Habilidades necessárias