Como comparar uma célula a várias no docs

Esta solução mostra como comparar dados entre dois arquivos Excel para encontrar discrepâncias. Ele usa Office scripts para analisar dados e Power Automate para se comunicar entre as guias de trabalho.

Cenário de exemplo

Você é um coordenador de eventos que está agendando palestrantes para próximas conferências. Você mantém os dados do evento em uma planilha e os registros do alto-falante em outra. Para garantir que as duas guias de trabalho sejam mantidas em sincronia, use um fluxo com Office Scripts para realçar quaisquer possíveis problemas.

Exemplo Excel arquivos

Baixe os arquivos a seguir para obter pastas de trabalho prontas para uso para o exemplo.

  1. event-data.xlsx
  2. speaker-registrations.xlsx

Adicione os scripts a seguir para experimentar o exemplo você mesmo!

Código de exemplo: Obter dados de evento

function main(workbook: ExcelScript.Workbook): string { // Get the first table in the "Keys" worksheet. let table = workbook.getWorksheet('Keys').getTables()[0]; // Get the rows in the event table. let range = table.getRangeBetweenHeaderAndTotal(); let rows = range.getValues(); // Save each row as an EventData object. This lets them be passed through Power Automate. let records: EventData[] = []; for (let row of rows) { let [eventId, date, location, capacity] = row; records.push({ eventId: eventId as string, date: date as number, location: location as string, capacity: capacity as number }) } // Log the event data to the console and return it for a flow. let stringResult = JSON.stringify(records); console.log(stringResult); return stringResult; } // An interface representing a row of event data. interface EventData { eventId: string date: number location: string capacity: number } function main(workbook: ExcelScript.Workbook, keys: string): string { // Get the first table in the "Transactions" worksheet. let table = workbook.getWorksheet('Transactions').getTables()[0]; // Clear the existing formatting in the table. let range = table.getRangeBetweenHeaderAndTotal(); range.clear(ExcelScript.ClearApplyTo.formats); // Compare the data in the table to the keys passed into the script. let keysObject = JSON.parse(keys) as EventData[]; let speakerSlotsRemaining = keysObject.map(value => value.capacity); let overallMatch = true; // Iterate over every row looking for differences from the other worksheet. let rows = range.getValues(); for (let i = 0; i < rows.length; i++) { let row = rows[i]; let [eventId, date, location, capacity] = row; let match = false; // Look at each key provided for a matching Event ID. for (let keyIndex = 0; keyIndex < keysObject.length; keyIndex++) { let event = keysObject[keyIndex]; if (event.eventId === eventId) { match = true; speakerSlotsRemaining[keyIndex]--; // If there's a match on the event ID, look for things that don't match and highlight them. if (event.date !== date) { overallMatch = false; range.getCell(i, 1).getFormat() .getFill() .setColor("FFFF00"); } if (event.location !== location) { overallMatch = false; range.getCell(i, 2).getFormat() .getFill() .setColor("FFFF00"); } break; } } // If no matching Event ID is found, highlight the Event ID's cell. if (!match) { overallMatch = false; range.getCell(i, 0).getFormat() .getFill() .setColor("FFFF00"); } } // Choose a message to send to the user. let returnString = "All the data is in the right order."; if (overallMatch === false) { returnString = "Mismatch found. Data requires your review."; } else if (speakerSlotsRemaining.find(remaining => remaining < 0)){ returnString = "Event potentially overbooked. Please review." } console.log("Returning: " + returnString); return returnString; } // An interface representing a row of event data. interface EventData { eventId: string date: number location: string capacity: number }

Power Automate fluxo: Verifique se há inconsistências nas guias de trabalho

Esse fluxo extrai as informações de evento da primeira workbook e usa esses dados para validar a segunda workbook.

  1. Entre Power Automate e crie um novo fluxo de nuvem instantâneo.

  2. Escolha Disparar manualmente um fluxo e selecione Criar.

  3. Adicione uma nova etapa que usa o conector Excel Online (Business) com a ação Executar script. Use os seguintes valores para a ação.

    Como comparar uma célula a várias no docs

  4. Adicione uma segunda nova etapa que usa o conector Excel Online (Business) com a ação Executar script. Use os seguintes valores para a ação.

    • Localização: OneDrive for Business
    • Biblioteca de Documentos: OneDrive
    • Arquivo: speaker-registration.xlsx (selecionado com o seledor de arquivos)
    • Script: Validar o registro de alto-falante

    Como comparar uma célula a várias no docs

  5. Este exemplo usa Outlook como cliente de email. Você pode usar qualquer conector de email Power Automate suporte. Adicione uma nova etapa que usa o conector Office 365 Outlook e a ação Enviar e email (V2). Use os seguintes valores para a ação.

    • Para: sua conta de email de teste (ou email pessoal)
    • Assunto: Resultados da validação de eventos
    • Corpo: resultado (conteúdo dinâmico do script Executar 2)

    Como comparar uma célula a várias no docs

  6. Salve o fluxo. Use o botão Testar na página do editor de fluxo ou execute o fluxo através da guia Meus fluxos . Certifique-se de permitir o acesso quando solicitado.

  7. Você deve receber um email dizendo "Incompatibilidade encontrada. Os dados exigem sua revisão." Isso indica que há diferenças entre linhas emspeaker-registrations.xlsxe linhas em event-data.xlsx. Abra speaker-registrations.xlsx para ver várias células realçadas onde há possíveis problemas com as listagem de registro do alto-falante.

Ao longo do curso já utilizamos a função SE (IF). Que é usada para comparar informações e no caso da operação resultar verdadeiro  executamos uma ação, caso falso executamos outra função. Vamos ver agora, quais são as diferenças para as novas funções IFS() e SWITCH() que veremos nessa seção.

E em que diferem estas funções? – Na prática, os seus argumentos são similares. No entanto, a sintaxe é diferente e vai simplificado de função para função. Então, e qual será a mais eficiente? Em primeiro lugar, qual é a utilidade destas três funções?

Em termos práticos, a clássica função SE() analisa condição a condição. Sendo que, quando esta é verdadeira, devolve um certo valor, quando é falsa devolve outro. Para além disso, quando analisamos várias condições, é necessário encadear vários SE(). Algo que pode tornar a expressão extensa e complexa.

Para contornar este caso, e torná-lo mais simples, surgiram duas novas funções IFS(), que avalia uma ou várias condições, possibilitando passar para a próxima condição, quando o resultado não é válido e SWITCH(), onde cada expressão corresponde a um valor, devolvendo um certo resultado e, quando este não corresponde, passa ao próximo. Aqui trabalhamos com um valor pré-definido quando a condição não se verifica.

Então, a pergunta que devemos fazer é, qual será a forma mais simples e curta de resolver a nossa necessidade? Isso é o que deverá nortear a escolha entre estas funções, vamos agora a elas.

Funções

A função SE() é expressa da seguinte forma: SE(expressao_logica; valor_se_verdadeiro; valor_se_falso). Que retorna um valor se uma expressão lógica for verdadeira e outro se for falsa. Verifique se valor_se_verdadeiro e valor_se_falso foram fornecidos para a função na ordem correta. Essa é a origem de problemas mais comum com SE. Sendo que:

expressao_logica: uma expressão ou referência a uma célula que contém uma expressão que representa um valor lógico (ou seja, VERDADEIRO ou FALSO).

valor_se_verdadeiro: o valor que a função retorna se expressao_logica for VERDADEIRO.

valor_se_falso: [OPCIONAL, em branco por padrão] o valor que a função retorna se expressao_logica for FALSO.

Vejamos no vídeo abaixo alguns exemplos de uso do SE:

A função IFS() é expressa da seguinte forma: IFS(condição1, valor1, [condição2, valor2], …). Que avalia várias condições e retorna um valor correspondente à primeira condição verdadeira. Se todas as condições forem FALSO, #NÃO.DISP será retornado. Sendo que:

condição: a primeira condição a ser avaliada. Pode ser um booliano, um número, uma matriz ou uma referência a qualquer um desses itens.

valor1: o valor retornado se condição1 for TRUE.

condicao2, valor2, …: condições e valores adicionais se a primeira condição avaliada for falsa.

Vejamos no vídeo abaixo alguns exemplos de uso do IFS:

A função SWITCH() é expressa da seguinte forma: SWITCH(expressão; caso1; valor1; [caso2; valor2; …]; [padrão]). Que compara uma expressão com uma lista de casos e retorna o valor do primeiro caso correspondente, com um valor padrão opcional caso não existam correspondências. Sendo que:

condição: a primeira condição a ser avaliada. Pode ser um booliano, um número, uma matriz ou uma referência a qualquer um desses itens.

expressão: qualquer valor válido.

caso1: o primeiro caso a ser verificado em relação à expressão.

valor1: o valor correspondente a ser retornado se caso1 corresponder à expressão.

caso2; valor2;… [opcional]: outros casos e valores se o primeiro não corresponder à expressão.

padrão [opcional]: um valor opcional, especificado como o último parâmetro, que será retornado se nenhum dos casos corresponder à expressão.

Vejamos no vídeo abaixo alguns exemplos de uso do SWITCH: