Seguidores

sábado, 26 de abril de 2025

Do Caos ao Prompt T4E10: Desenvolvimento do App AG2P - Evento "Selecionou totais para produtividade"

INTRODUÇÃO

Post anterior: Do Caos ao Prompt T4E09: Desenvolvimento do App AG2P – Evento "Liberou RDM"

Este Post é o episódio 10 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 "Selecionou totais para produtividade".


Evento “Selecionou totais para produtividade”

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
"Selecionou totais para produtividade": https://g.co/gemini/share/e85ae46b8fe2


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

Objetivo, Contexto e Ferramentas

Clique aqui para  ver os itens Objetivo, Contexto e Ferramentas do Comando.

Especificações

Segue abaixo o post da temporada 3 desta série, que contém as especificações do evento "Selecionou totais para produtividade", que faz parte deste comando:

Do Caos ao Prompt T3E11: Estrutura do Agente AG2P - Diálogo 9 Evento "Selecionou totais para produtividade" dispara Ação "Atualizar aba XmR P"

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


/**
 * @OnlyCurrentDoc
 */

function onSelecionouTotaisParaProdutividade() {
  // 1. Verifica o estado atual da RDM (conforme R39)
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const abaRDM = ss.getSheetByName("RDM"); // Assumindo que a aba RDM se chama "RDM"
  if (!abaRDM) {
    SpreadsheetApp.getUi().alert("A aba 'RDM' não foi encontrada.");
    return;
  }

  // Para simplificar, vamos assumir que o estado da RDM é armazenado em alguma célula da aba RDM.
  // Você precisará adaptar isso para a sua implementação real.
  const estadoRDMCelula = abaRDM.getRange("A1"); // Exemplo: célula A1 armazena o estado
  const estadoRDM = estadoRDMCelula.getValue();

  if (estadoRDM !== "RDM Antes do fim") {
    SpreadsheetApp.getUi().alert("O app não está no estado 'RDM Antes do fim'. Estado atual: " + estadoRDM);
    return;
  }

  // 2. Executa a ação "Atualizar aba XmR P"

  // 2.1. Apresenta as opções de escolha para formatação da coluna A (R12 e R13)
  const ui = SpreadsheetApp.getUi();
  const resposta = ui.prompt(
    "Formatação da coluna A (linha horizontal do gráfico):",
    "Escolha uma opção:",
    ui.ButtonSet.OK_CANCEL,
    ui.CheckboxSet.newBuilder()
      .setTitle("Opções:")
      .addItem("Coluna B (Grupo de Processos do Serviço)", false)
      .addItem("Coluna F (Data Hora Fim) + Coluna B (Grupo de Processos do Serviço)", false)
      .addItem("Coluna F (Data Hora Fim)", false)
      .build()
  );

  if (resposta.getSelectedCheckboxItems().length !== 1) {
    ui.alert("Selecione apenas uma opção de formatação.");
    return;
  }

  const opcaoEscolhida = resposta.getSelectedCheckboxItems()[0].getValue();
  const abaGPS = ss.getSheetByName("GPS");
  const abaXmRP = ss.getSheetByName("XmR P");

  if (!abaGPS || !abaXmRP) {
    ui.alert("As abas 'GPS' ou 'XmR P' não foram encontradas.");
    return;
  }

  // 2.2. Copia a coluna Q (INDICADOR DE PRODUTIVIDADE) da aba GPS para a coluna B da aba XmR P
  const colunaQ_GPS = abaGPS.getRange("Q:Q").getValues().filter(String); // Obtém valores não vazios
  if (colunaQ_GPS.length > 0) {
    const linhaInicial_XmRP = 1; // Começa na primeira linha para os dados
    const numLinhasCopiar = colunaQ_GPS.length;
    abaXmRP.getRange(linhaInicial_XmRP, 2, numLinhasCopiar, 1).setValues(colunaQ_GPS.map(item => [item[0]]));
  } else {
    ui.alert("A coluna 'INDICADOR DE PRODUTIVIDADE' na aba 'GPS' está vazia.");
    return;
  }

  // 2.3. Formata a coluna A da aba XmR P (atenção especial - R13)
  let valoresColunaA = [];
  const dadosGPS = abaGPS.getDataRange().getValues();
  const cabecalhoGPS = dadosGPS[0];
  const indiceColunaB_GPS = cabecalhoGPS.indexOf("Grupo de Processos do Serviço");
  const indiceColunaF_GPS = cabecalhoGPS.indexOf("Data Hora Fim");

  if (indiceColunaB_GPS === -1 || indiceColunaF_GPS === -1) {
    ui.alert("As colunas 'Grupo de Processos do Serviço' ou 'Data Hora Fim' não foram encontradas na aba 'GPS'.");
    return;
  }

  // Obtém os dados relevantes da aba GPS (onde Tamanho em Pontos > 0)
  const dadosFiltradosGPS = dadosGPS.slice(1).filter(linha => linha[cabecalhoGPS.indexOf("Tamanho em Pontos")] > 0);

  switch (opcaoEscolhida) {
    case "Coluna B (Grupo de Processos do Serviço)":
      valoresColunaA = dadosFiltradosGPS.map(linha => [linha[indiceColunaB_GPS]]);
      break;
    case "Coluna F (Data Hora Fim) + Coluna B (Grupo de Processos do Serviço)":
      valoresColunaA = dadosFiltradosGPS.map(linha => [Utilities.formatDate(new Date(linha[indiceColunaF_GPS]), Session.getTimeZone(), "yyyy-MM-dd HH:mm:ss") + " - " + linha[indiceColunaB_GPS]]);
      break;
    case "Coluna F (Data Hora Fim)":
      valoresColunaA = dadosFiltradosGPS.map(linha => [Utilities.formatDate(new Date(linha[indiceColunaF_GPS]), Session.getTimeZone(), "yyyy-MM-dd HH:mm:ss")]);
      break;
  }

  if (valoresColunaA.length > 0) {
    abaXmRP.getRange(linhaInicial_XmRP, 1, valoresColunaA.length, 1).setValues(valoresColunaA);
  } else {
    ui.alert("Não há dados válidos na aba 'GPS' para formatar a coluna A.");
    return;
  }

  // 2.4. Apresenta em uma nova janela o gráfico XmR P
  const chart = abaXmRP.newChart()
      .setChartType(Charts.ChartType.LINE) // Escolha o tipo de gráfico apropriado (XmR provavelmente envolve gráficos de controle)
      .addRange(abaXmRP.getDataRange()) // Considerar ajustar o range para os dados relevantes
      .setPosition(5, 5, 600, 300) // Posição e tamanho do gráfico (ajuste conforme necessário)
      .setTitle("Gráfico XmR P")
      .build();

  abaXmRP.insertChart(chart);

  // 2.5. Atualiza o Estado da aba RDM (mantém como "RDM Antes do fim" - R39)
  estadoRDMCelula.setValue("RDM Antes do fim");
  SpreadsheetApp.getUi().alert("A aba 'XmR P' foi atualizada e o gráfico foi gerado. O estado da RDM permanece 'RDM Antes do fim'.");

  // 3. O app agora aguarda outro evento (implícito, pois a função terminou)
}

Explicação do Código:

  1. @OnlyCurrentDoc: Esta anotação garante que o script só pode acessar o arquivo do Google Sheets ao qual está vinculado.
  2. onSelecionouTotaisParaProdutividade(): Esta é a função que será executada quando o evento "Selecionou totais para produtividade" for disparado. Em um cenário real, você precisará vincular essa função a um botão, item de menu personalizado ou outro gatilho na sua interface do app.
  3. Verificação do Estado da RDM (R39):
    • O script primeiro obtém a planilha ativa e tenta acessar a aba chamada "RDM".
    • Importante: Assume-se que o estado da RDM está armazenado em alguma célula da aba "RDM" (no exemplo, a célula "A1"). Você precisará adaptar essa parte do código para corresponder à forma como o estado é realmente gerenciado no seu sistema.
    • Se o estado atual não for "RDM Antes do fim", uma mensagem de alerta é exibida e a função é interrompida.
  4. Ação "Atualizar aba XmR P":
    • Apresentação de Opções (R12 e R13): Um diálogo de prompt é exibido ao usuário com as três opções para formatação da coluna A, conforme especificado na regra R13.
    • Cópia da Coluna Q (GPS para XmR P): A coluna "Q" (INDICADOR DE PRODUTIVIDADE) da aba "GPS" é copiada para a coluna "B" da aba "XmR P".
    • Formatação da Coluna A (XmR P) (R13):
      • O script identifica as colunas "Grupo de Processos do Serviço" (B) e "Data Hora Fim" (F) na aba "GPS".
      • Ele filtra os dados da aba "GPS" para incluir apenas as linhas onde a coluna "Tamanho em Pontos" (C) é maior que zero.
      • Com base na opção escolhida pelo usuário, a coluna "A" da aba "XmR P" é preenchida com os dados formatados. A função Utilities.formatDate() é usada para formatar a data e hora.
    • Geração do Gráfico XmR P: Um gráfico de linha simples é criado com base nos dados da aba "XmR P" e inserido na mesma aba. Você pode precisar ajustar o tipo de gráfico (Charts.ChartType.LINE), o intervalo de dados (addRange), e outras opções de acordo com a natureza do seu gráfico XmR P.
    • Atualização do Estado da Aba RDM (R39): O estado da RDM (na célula "A1" da aba "RDM" no exemplo) é mantido como "RDM Antes do fim".
  5. Espera por Outro Evento: Após a execução da função, o script termina e o app aguarda o próximo evento disparado pelo usuário.

Como Usar:

  1. Abra o seu Google Sheets (a planilha GPS).

  2. Vá em "Ferramentas" > "Editor de script".

  3. Cole o código acima no editor.

  4. Adapte o código:

    • Modifique os nomes das abas ("RDM", "GPS", "XmR P") se forem diferentes na sua planilha.
    • Crucial: Ajuste a forma como o estado da RDM é armazenado e acessado (estadoRDMCelula e as linhas relacionadas).
  5. Crie um gatilho (opcional, para teste): Para testar a função, você pode criar um menu personalizado ou um botão na sua planilha que execute a função onSelecionouTotaisParaProdutividade().

    • Para criar um menu, adicione a seguinte função ao seu script:
    JavaScript
    function onOpen() {
      SpreadsheetApp.getUi()
          .createMenu('Automação RDM')
          .addItem('Selecionar Totais para Produtividade', 'onSelecionouTotaisParaProdutividade')
          .addToUi();
    }
    
    • Salve o script e recarregue a planilha. Um menu chamado "Automação RDM" aparecerá, com a opção de executar a função.

Observações Importantes:

  • Gerenciamento de Estado: A forma como o estado da RDM é gerenciado é crucial. No exemplo, assumi que está em uma célula. Em um app mais complexo, você pode usar propriedades do usuário, um serviço de armazenamento de dados ou outra abordagem.
  • Interface do Usuário: Este script implementa a lógica de back-end. Para um app completo, você precisará criar uma interface de usuário (usando HTML Service no Google Apps Script ou o próprio Google Sheets com botões e caixas de diálogo) para que o usuário possa interagir e disparar o evento "Selecionou totais para produtividade".
  • Tratamento de Erros: O script inclui alguns alertas básicos para erros (abas não encontradas, estado incorreto). Em um ambiente de produção, você precisará implementar um tratamento de erros mais robusto.
  • Gráfico XmR P: O tipo e as configurações do gráfico XmR P podem ser mais complexos do que um simples gráfico de linha. Você precisará ajustar as opções do Charts.ChartType e outras configurações do gráfico para atender aos seus requisitos específicos.
  • Regra R12: A regra R12 menciona que a planilha GPS deve estar em uma pasta padrão. Embora o script não implemente explicitamente essa regra, é importante garantir que a planilha esteja acessível ao script quando ele for executado.

Lembre-se de adaptar o código para corresponder à estrutura real da sua planilha e à forma como você pretende interagir com o seu app.

CONCLUSÃO

Neste episódio 10, da temporada 4 da série "Do Caos ao Prompt", foi apresentada a implementação do Evento "Selecionou totais para produtividade", realizada pelo Chatbot de IA Gemini 2.0 Flash.

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

Próximo post: Do Caos ao Prompt T4E11: Desenvolvimento do App AG2P - Evento "Selecionou incidentes por origem"

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...