Seguidores

sexta-feira, 25 de abril de 2025

Do Caos ao Prompt T4E05: Desenvolvimento do App AG2P – Evento "Terminou tarefa do negócio"

INTRODUÇÃO

Post anterior: Do Caos ao Prompt T4E04: Desenvolvimento do App AG2P – Evento "Iniciou tarefa do negócio"

    Este Post é o episódio 5 da temporada 4 da série "Do Caos ao Prompt", que apresenta o desenvolvimento do Agente de Gestão de Processo Pessoal (AG2P), tendo como foco o evento "Terminou tarefa do negócio".



    Evento “Terminou tarefa do negócio”

    Link da conversa com o Gemini, na qual foi apresentado um Prompt contendo os itens Objetivo, Contexto, Ferramentas e Especificações, para geração do código para implementar o evento
    "Terminou tarefa do negócio": https://g.co/gemini/share/36a9733b3196


    Comando ao Gemini para solicitar a implementação do evento

    Objetivo

    Escreva o código em Google Apps Script, para automatizar o evento "Terminou tarefa do negócio", que pertence ao fluxo de trabalho descrito no item Contexto, que segue abaixo. 

    Contexto

    O contexto é de um fluxo de trabalho que serve para coletar e registrar dados para acompanhamento do progresso diário de um processo pessoal repetitivo, que apresenta os resultados no Relatório de Desvio de Meta (RDM) com um gráfico Burndown.

    Os dados coletados diariamente, formarão um histórico para calcular o indicador de produtividade e emitir, mensalmente, o gráfico de Controle da Produtividade e o de Pareto.                                

    O processo pessoal começa quando a pessoa decide iniciar a jornada de trabalho e abre o app (que será construído), para acessar o GRUPO DE PROCESSOS DO SERVIÇO (GPS). 

    O primeiro evento do dia, após o início do app, é "Abriu RDM", que muda o estado do app de “Após início” para "RDM inicializada".                                                                                               

    A partir do estado "RDM inicializada", o diálogo será entre a pessoa e a aba RDM, da planilha GPS, que permanece em determinado estado até receber um evento, que causa e execução de uma ação e a mudança para o próximo estado. 

    Esse ciclo se repete, até que a pessoa decida encerrar a jornada.

    O processo pessoal termina quando a pessoa decide encerrar a jornada de trabalho e fecha o app. 

    A estrutura do diálogo entre o usuário e o app pode ser explicada assim: “A pessoa iniciou o evento [Evento], para executar a ação [Ação], detalhada em [Passos], acessando os dados [Planilha Google] de acordo com as regras [Regras].

    Ferramentas

    As ferramentas usadas para automação deste processo pessoal devem ser todas do Google Workspace.

    Especificações

    Segue abaixo o post da temporada 3 desta série, que contém as especificações do evento "Terminou tarefa do negócio", que faz parte deste comando:

    Do Caos ao Prompt T3E06: Estrutura do Agente AG2P - Diálogo 4 Evento "Terminou tarefa do negócio" dispara Ação "Registrar tamanho da tarefa"

    As especificações do evento foram feitas com Finite State Machine (FSM), de tal forma que cada evento pode ser automatizado e testado de forma independente.

    Resposta do Gemini com o código e a explicação

    /**
     * @OnlyCurrentDoc
     */

    /**
     * Automação do evento "Terminou tarefa do negócio".
     *
     * Este script é acionado quando o app está no estado "RDM Ativa" e o evento
     * "Terminou tarefa do negócio" é disparado. Ele registra o tamanho da tarefa
     * concluída na aba "RDM" da planilha "GPS".
     */
    function terminouTarefaDoNegocio() {
      // Define o nome da planilha principal (GPS) e das abas relevantes.
      const nomePlanilhaGps = "GPS";
      const abaRdmNome = "RDM";
      const abaGpsNome = "GPS";

      // Obtém a planilha ativa.
      const ss = SpreadsheetApp.getActiveSpreadsheet();

      // Obtém as abas relevantes.
      const abaRdm = ss.getSheetByName(abaRdmNome);
      const abaGps = ss.getSheetByName(abaGpsNome);

      // **Pré-condição: Verificar se o app está no estado "RDM Ativa" (R36)**
      const estadoRdm = abaRdm.getRange("T1").getValue();
      if (estadoRdm !== "RDM Ativa") {
        Logger.log("O app não está no estado 'RDM Ativa'. O evento não pode ser processado.");
        return; // Aborta a execução se o estado não for o esperado.
      }

      // **Ação: Registrar tamanho da tarefa (R05)**

      // 1. Identificar a última tarefa concluída na aba GPS.
      // Assume-se que a última linha com uma "Data Hora Fim" preenchida é a tarefa mais recente.
      const colunaDataFimGps = abaGps.getColumnValues(6); // Coluna F (índice 6)
      let ultimaLinhaPreenchidaGps = -1;
      for (let i = colunaDataFimGps.length - 1; i >= 0; i--) {
        if (colunaDataFimGps[i] !== "") {
          ultimaLinhaPreenchidaGps = i + 1; // +1 para corresponder ao número da linha
          break;
        }
      }

      if (ultimaLinhaPreenchidaGps === -1) {
        Logger.log("Nenhuma tarefa concluída encontrada na aba GPS.");
        return; // Aborta se não houver tarefas concluídas.
      }

      // 2. Extrair os dados necessários da aba GPS para a última tarefa concluída.
      const faseTarefa = abaGps.getRange(`B${ultimaLinhaPreenchidaGps}`).getValue();
      const tamanhoTarefa = abaGps.getRange(`C${ultimaLinhaPreenchidaGps}`).getValue();
      const dataHoraFimTarefa = abaGps.getRange(`F${ultimaLinhaPreenchidaGps}`).getValue();

      // 3. Calcular a hora cheia de conclusão (arredondamento para cima).
      const horaFim = dataHoraFimTarefa.getHours();
      const horaCheia = horaFim + 1;

      // 4. Determinar a coluna correspondente à fase na aba RDM (intervalo D5:H14).
      // Assume-se que as colunas D a H na aba RDM correspondem às fases do negócio.
      // É necessário adaptar esta lógica com base na estrutura real da sua aba RDM.
      let colunaRdm;
      switch (faseTarefa.split(" ")[0]) { // Pega o primeiro "código" da fase (ex: S01.1)
        case "S01.1": // Exemplo de fase 1
          colunaRdm = 4; // Coluna D
          break;
        // Adicione mais casos conforme as suas fases e colunas na aba RDM
        case "S01.2": // Exemplo de fase 2
          colunaRdm = 5; // Coluna E
          break;
        case "S01.3": // Exemplo de fase 3
          colunaRdm = 6; // Coluna F
          break;
        case "S01.4": // Exemplo de fase 4
          colunaRdm = 7; // Coluna G
          break;
        case "S01.5": // Exemplo de fase 5
          colunaRdm = 8; // Coluna H
          break;
        default:
          Logger.log(`Fase "${faseTarefa}" não corresponde a nenhuma coluna na aba RDM.`);
          return; // Aborta se a fase não for encontrada.
      }

      // 5. Determinar a linha correspondente à hora cheia na aba RDM (intervalo D5:H14).
      const linhaRdm = 4 + horaCheia; // Linhas 5 a 14 correspondem às horas 0 a 9 (ajuste conforme necessário)
      if (linhaRdm < 5 || linhaRdm > 14) {
        Logger.log(`Hora cheia "${horaCheia}:00" fora do intervalo de registro na aba RDM.`);
        return; // Aborta se a hora estiver fora do intervalo.
      }

      // 6. Registrar o tamanho da tarefa na célula correspondente na aba RDM.
      abaRdm.getRange(linhaRdm, colunaRdm).setValue(tamanhoTarefa);
      Logger.log(`Tamanho da tarefa (${tamanhoTarefa}) registrado na aba RDM na célula (${abaRdm.getRange(linhaRdm, colunaRdm).getA1Notation()}) para a hora ${horaCheia}:00 da fase "${faseTarefa}".`);

      // **Ação: Manter o estado da aba RDM como "RDM Ativa" (R36)**
      abaRdm.getRange("T1").setValue("RDM Ativa");
      Logger.log("Estado da aba RDM mantido como 'RDM Ativa'.");

      Logger.log("Evento 'Terminou tarefa do negócio' concluído.");
    }

    Explicação do Código:

    1. terminouTarefaDoNegocio(): A função principal que será executada quando o evento for disparado.
    2. Definição de Nomes: As variáveis nomePlanilhaGps, abaRdmNome, e abaGpsNome armazenam os nomes da planilha e das abas para facilitar a referência.
    3. Obtenção de Planilha e Abas: O código obtém a planilha ativa e as abas "RDM" e "GPS" usando SpreadsheetApp.getActiveSpreadsheet() e getSheetByName().
    4. Verificação do Estado (Pré-condição - R36):
      • Lê o valor da célula "T1" na aba "RDM", que contém o estado do app.
      • Se o estado não for "RDM Ativa", o script registra um log e encerra a execução, pois a pré-condição não foi atendida.
    5. Registro do Tamanho da Tarefa (Ação - R05):
      • Identificação da Última Tarefa: O código percorre a coluna "F" (Data Hora Fim) da aba "GPS" de baixo para cima para encontrar a última linha preenchida, assumindo que essa é a tarefa mais recentemente concluída.
      • Extração de Dados: Obtém a fase da tarefa (coluna "B"), o tamanho em pontos (coluna "C") e a data e hora de fim (coluna "F") para a última tarefa concluída.
      • Cálculo da Hora Cheia: Extrai a hora da dataHoraFimTarefa e adiciona 1 para obter a hora cheia (arredondamento para cima).
      • Determinação da Coluna RDM: Utiliza uma estrutura switch para determinar a coluna correspondente à fase da tarefa na aba "RDM" (intervalo D5:H14). Você precisará adaptar os case dentro do switch para corresponder exatamente aos códigos de fase que você utiliza e a qual coluna eles correspondem na sua aba "RDM". O exemplo assume que as fases "S01.1", "S01.2", etc., mapeiam para as colunas D, E, etc., respectivamente.
      • Determinação da Linha RDM: Calcula a linha na aba "RDM" com base na horaCheia. O exemplo assume que as linhas 5 a 14 correspondem às horas 0 a 9. Você precisará ajustar este cálculo com base na estrutura real do seu intervalo D5:H14 na aba "RDM".
      • Registro do Tamanho: Usa abaRdm.getRange(linhaRdm, colunaRdm).setValue(tamanhoTarefa) para escrever o tamanho da tarefa na célula correta da aba "RDM".
      • Log de Registro: Registra uma mensagem informando onde o tamanho da tarefa foi registrado.
    6. Manutenção do Estado (Ação - R36):
      • Define explicitamente o valor da célula "T1" na aba "RDM" como "RDM Ativa", garantindo que o estado seja mantido após a execução do evento.
      • Registra um log informando que o estado foi mantido.
    7. Log de Conclusão: Registra uma mensagem indicando que o evento "Terminou tarefa do negócio" foi concluído.

    Como Usar:

    1. Abra sua planilha GPS no Google Sheets.
    2. Vá em "Extensões" > "Apps Script".
    3. Cole o código acima no editor de script.
    4. Salve o script (dê um nome significativo, como "AutomacaoRDM").
    5. Edite a seção de determinação da coluna RDM (o switch statement) e a determinação da linha RDM para corresponder à estrutura exata da sua aba "RDM". Certifique-se de que os códigos de fase no case correspondem aos seus dados na coluna "B" da aba "GPS" e que as colunas D a H da aba "RDM" representam as fases corretamente. Ajuste também o cálculo da linha com base em como as horas estão organizadas no intervalo D5:H14.
    6. Para automatizar a execução deste script quando o evento "Terminou tarefa do negócio" acontecer (isso dependerá de como você está construindo seu "app"):
      • Se o "app" for uma interface construída no Google Sheets: Você pode criar um botão ou usar um evento de mudança na planilha para disparar a função terminouTarefaDoNegocio().
      • Se o "app" for externo ao Google Sheets: Você precisará usar a API do Google Apps Script (como google.script.run se for um web app do Apps Script) para chamar a função terminouTarefaDoNegocio() quando o evento ocorrer no seu app.

    Observações Importantes:

    • Estrutura da Aba RDM: O código assume uma estrutura específica para a aba "RDM" (intervalo D5:H14 para registrar o tamanho das tarefas por hora e fase). Você precisará adaptar o código se a sua estrutura for diferente.
    • Mapeamento de Fases: O mapeamento entre as fases da aba "GPS" e as colunas da aba "RDM" é crucial. Certifique-se de que o switch statement esteja configurado corretamente.
    • Organização das Horas na Aba RDM: O cálculo da linha na aba "RDM" depende de como as horas estão organizadas no intervalo D5:H14. Ajuste o cálculo (4 + horaCheia) conforme necessário.
    • Disparo do Evento: Este script apenas implementa a lógica para o evento "Terminou tarefa do negócio". A forma como esse evento é "disparado" (por interação do usuário no seu "app") precisará ser implementada separadamente, dependendo da natureza do seu "app".
    • Tratamento de Erros: O código inclui alguns logs para ajudar na depuração, mas você pode adicionar tratamento de erros mais robusto, como verificar se os dados extraídos da aba "GPS" são válidos antes de tentar gravá-los na aba "RDM".

    CONCLUSÃO

    Neste episódio 5, da temporada 4 da série "Do Caos ao Prompt", foi apresentada a implementação do Evento "Terminou tarefa do negócio", realizada pelo Chatbot de IA Gemini 2.0 Flash.

    As especificações do evento foram feitas em Finite State Machine (FSM).

    Diferentemente dos episódios anteriores, fiz apenas um comando para obter o resultado esperado, que é o código Google Apps Script.

    A diferença foi a adição destes itens no comando:

    • Objetivo: definição da linguagem Google Apps Script, para automação
    • Contexto: descrição do fluxo de trabalho a ser automatizado
    • Ferramentas: definição da automação com ferramentas do Google Workspace


    Próximo post: Do Caos ao Prompt T4E06: Desenvolvimento do App AG2P – Evento "Ocorreu um incidente"

    Veja a lista de Episódios da Temporada 4 da Série "Do Caos ao Prompt", no final do Episódio T4E01.

    Nenhum comentário:

    Postar um comentário

    Entendendo a Metáfora "Home Office é Moto Boy"

    Dashboard de Produtividade Pessoal T1E14: RESOLVIDO BugCT1-5 Erro 400 no login

    INTRODUÇÃO Post anterior:  Dashboard de Produtividade Pessoal T1E13: BugCT1-5 Erro 400 no login O objetivo deste post é apresentar um prompt...