Gestão de projetos com Google Sheets resolve um problema direto: dar visibilidade real de prazos, dependências e progresso quando não se tem orçamento ou a necessidade para uma ferramenta dedicada, sem depender de assinatura paga, sem add-on de terceiros, sem precisar de um desenvolvedor.
O problema não é falta de opção. É que a maioria das planilhas de projeto vira uma lista de tarefas com data ao lado, sem Gantt, sem dependência entre atividades, sem notificação de prazo e sem controle de quem alterou o quê.
Ela funciona nas primeiras semanas e desanda exatamente quando o projeto fica mais complexo.
Este guia mostra como estruturar o Google Sheets como um sistema de gestão de projetos: gráfico de Gantt, cálculo automático de progresso, dependências entre tarefas, dashboard de status, automações com Google Apps Script para lembretes e relatórios e, ao final, um critério objetivo para saber quando a planilha deixou de ser suficiente e chegou a hora de migrar.
Esse artigo é para você que:
- Foi designado para “organizar o projeto no Sheets” e a planilha virou uma lista de tarefas sem visibilidade de prazo ou dependência;
- Sua equipe já perdeu tempo com versões conflitantes do mesmo arquivo, dados sobrescritos ou fórmulas que quebraram quando alguém inseriu uma linha;
- Você não sabe se deve continuar investindo tempo em estruturar a planilha ou se já passou da hora de migrar para uma ferramenta dedicada.
Por que o Google Sheets consegue (até certo ponto) substituir uma ferramenta de gestão de projetos
O Google Sheets não tem um objeto de Gantt nativo, não tem campo de “dependência entre tarefas” pronto e não notifica ninguém automaticamente.
Tudo isso é verdade e é exatamente por isso que estruturar bem a planilha faz tanta diferença: sem essa estrutura, ela fica limitada a uma lista de tarefas com data ao lado.
Só que esses limites são contornáveis com recursos que já existem dentro da conta gratuita do Google: formatação condicional resolve o Gantt, validação de dados resolve a inconsistência de preenchimento, uma coluna de referência resolve a dependência entre tarefas, e o Google Apps Script resolve notificação e relatório.
Nenhum desses recursos depende de Gemini, de add-on pago ou de qualquer assinatura do Workspace.
O que muda entre uma planilha que “quase funciona” e um sistema de gestão de verdade não é a ferramenta é a estrutura. É essa estrutura que iremos construir juntos, passo a passo, a partir de agora.
Construindo o sistema
O exemplo a seguir usa o projeto de lançamento de uma loja online para a coleção de inverno de uma marca de roupas, conduzido por uma consultoria de marketing.
O projeto tem quatro pessoas na equipe, seis semanas de duração e passa por cinco fases: Planejamento, Design, Desenvolvimento, Conteúdo e Testes, até o Lançamento.

Passo 1 — Estruture as colunas base antes de qualquer fórmula
Antes de pensar em Gantt ou automação, a planilha precisa ter cada dado no formato certo. Isso evita que fórmulas de data e formatação condicional falhem mais adiante.
Confirme que as colunas E (Início) e F (Fim) estão formatadas como Data (Formatar > Número > Data), não como texto.
A coluna G (Duração) pode ser calculada automaticamente em vez de digitada: =F3-E3+1 (arraste a fórmula até o final da tabela).
O +1 no final não é redundante: F3-E3 sozinho traria apenas a diferença bruta entre as datas, sem contar o próprio dia de início.
Uma tarefa que começa dia 01/06 e termina dia 03/06 ocupa 3 dias corridos (01, 02 e 03), mas F3-E3 resultaria em 2.
O +1 corrige essa contagem para refletir a duração real, o que importa especialmente na fórmula de % Concluído do Passo 4, que usa essa duração como base do cálculo.
Isso garante que, se alguém mudar a data de início ou fim, a duração se ajusta sozinha, sem depender de atualização manual.
Passo 2 — Construa a linha do tempo e o Gantt com formatação condicional
Como o Sheets não tem um gráfico de Gantt pronto, cada coluna à direita da tabela representa um dia do projeto, e uma regra de formatação condicional pinta a célula quando aquele dia está dentro do intervalo da tarefa.
Monte o cabeçalho de datas. A partir da célula L2, digite a primeira data do projeto (01/06, por exemplo) e arraste a alça de preenchimento para a direita até cobrir a última data do cronograma (06/07).

Selecione o intervalo exato onde as barras vão aparecer. Considerando as 22 tarefas do exemplo (linhas 3 a 24), selecione L3:AU24, do nosso exemplo.
Aplique a formatação condicional. Com o intervalo selecionado, vá em Formatar > Formatação condicional.

No painel lateral, em “Formatar células se”, escolha a opção Fórmula personalizada é e cole:
=E(L$2>=$E3; L$2<=$F3)
Logo abaixo, em “Estilo de formatação”, clique no ícone de preenchimento e escolha uma cor. Clique em Concluído.

Opcional: destaque os fins de semana. Se quiser marcar visualmente sábados e domingos no cronograma, útil para não contar esses dias como produtivos ao planejar prazos, crie uma segunda regra de formatação condicional, no mesmo intervalo L3:AU24, também em Fórmula personalizada é:
=DIA.DA.SEMANA(L$2;2)>5
Essa fórmula verifica o dia da semana da data no cabeçalho (L$2); com o parâmetro 2, a contagem começa na segunda-feira e vai até domingo, então qualquer valor acima de 5 é sábado (6) ou domingo (7).
Escolha uma cor de preenchimento para essa regra, diferente da usada no Gantt.

Um detalhe que só aparece na prática: quando há duas regras cobrindo a mesma área, a ordem da lista de regras importa, a que aparece primeiro no painel tem prioridade visual.
Se a regra de fim de semana ficar acima da regra do Gantt, a barra da tarefa “desaparece” atrás do cinza do sábado e domingo.
Para corrigir, abra Formatar > Formatação condicional, localize as duas regras na lista lateral e arraste a regra do Gantt (a fórmula com E(…)) para cima da regra de fim de semana, a ordem de cima para baixo é a ordem de prioridade.

Abaixo como ficou nosso gráfico de Gantt.

Passo 3 — Calcule o percentual concluído em vez de digitá-lo
Pedir que cada pessoa digite manualmente “60% concluído” é a forma mais rápida de ter um número que não reflete a realidade porque não existe critério, cada um estima do seu jeito.
Uma forma mais confiável é vincular o percentual ao status: tarefas “Concluído” valem 100%, “Em andamento” recebem uma estimativa proporcional aos dias já decorridos da duração total, e as demais ficam em 0%.
=SE(J3="Concluído";100%;SE(J3="Em andamento";MÍNIMO((HOJE()-E3)/G3;0,95);0%))
Essa fórmula calcula quantos dias já se passaram desde o início da tarefa em relação à duração total, limitando o resultado a 95% para tarefas em andamento, o campo só chega a 100% quando o status é alterado manualmente para “Concluído”.

Passo 4 — Implemente dependências entre tarefas
Sem controle de dependência, é comum uma tarefa começar antes de sua predecessora terminar como o desenvolvimento do layout (tarefa 10) começar antes do design ser aprovado (tarefa 7).
A coluna H (Depende de) referência o ID da tarefa predecessora é só isso que o gestor precisa preencher aqui, sem fórmula nenhuma nessa etapa.
Diferente do Status ou do % Concluído, verificar se uma dependência está pendente não é algo que precisa aparecer numa célula da planilha.
É o mesmo tipo de alerta automático que o Apps Script já vai gerar para prazos e atrasos, então essa checagem entra dentro do próprio script, no Passo 8.
Evitando duplicar a mesma lógica em dois lugares diferentes (uma fórmula na planilha e uma verificação no script) e evitando adicionar mais uma coluna auxiliar só para um alerta.
Por enquanto, a planilha já tem tudo que a dependência precisa: um ID único por tarefa e a coluna H apontando para o ID da predecessora.
O Passo 8 mostra como transformar essa referência em um alerta, avisando o gestor por e-mail sempre que uma tarefa aparecer com Status diferente de “Não iniciado” enquanto sua predecessora ainda não estiver “Concluído”.
Passo 5 — Monte o dashboard de status do projeto
Com status, percentual e dependência funcionando, o dashboard é apenas uma leitura agregada desses dados.
Neste exemplo, para manter tudo visível num único lugar enquanto você aprende o conceito, construa o dashboard logo abaixo da própria tabela de tarefas, na mesma aba começando o dashboard na linha 27.
Gráfico 1 — Contagem por status (células B27:C30). Digite os rótulos na coluna B e as fórmulas na coluna C, uma linha por status:
Vamos inserir um gráfico de pizza.
- Selecione o intervalo B27:C30;
- Vá em Inserir > Gráfico;
- No painel “Editor de gráficos” que abre à direita, na aba “Configuração”, confira o campo “Tipo de gráfico” — se o Sheets não sugerir automaticamente, troque para Gráfico de pizza;
- Posicione o gráfico em cima dos dados para esconder conforme a imagem.


Gráfico 2 — Progresso médio geral. Um único indicador, sem tabela:
=MÉDIA(I3:I24)
Indicador em destaque (progresso geral). Não é gráfico, é formatação — mas dá para transformar num “card” visual, em vez de deixar só um número solto:
- Selecione um pequeno bloco de células ao redor do indicador (por exemplo, V26:Z35) e mescle-as em Formatar > Mesclar células
- Aumente bastante o tamanho da fonte (Formatar > Tamanho do texto) e centralize o número, tanto na horizontal quanto na vertical
- Adicione uma borda em volta do bloco (ícone de bordas na barra de ferramentas) para que ele se destaque como um cartão separado do restante da planilha
- Para o card mudar de cor sozinho conforme o projeto avança, aplique uma regra de formatação condicional em escala de cor nessa mesma célula: Formatar > Formatação condicional > Escala de cor, definindo vermelho para valores próximos de 0%, amarelo no meio e verde perto de 100%.


O resultado é um indicador que já entrega duas informações de uma vez: o número exato do progresso e, pela cor, se esse número está numa faixa preocupante ou tranquila sem precisar interpretar gráfico nenhum.
Gráfico 3 — Progresso por fase (células K26:L31). Repita o MÉDIASE – =MÉDIASE(C3:C24;”Planejamento”;I3:I24)- uma vez por fase, trocando o critério:
Gráfico de barras por fase.
- Selecione o intervalo K26:L31 (as seis fases com o progresso médio de cada uma)
- Vá em Inserir > Gráfico
- Na aba “Configuração” do editor, troque o “Tipo de gráfico” para Gráfico de colunas (ou “Gráfico de barras”, se preferir as barras na horizontal)


Gráfico 4 — Tarefas pendentes por responsável (células G27:H30). Mesma lógica, usando CONT.SES – =CONT.SES($D$3:$D$24;”Marina”;$J$3:$J$24;”<>Concluído”) – para contar apenas o que ainda não foi concluído:
Gráfico de barras por responsável.
- Selecione o intervalo A44:B47 (os quatro responsáveis com a contagem de tarefas pendentes de cada um)
- Vá em Inserir > Gráfico
- Na aba “Configuração” do editor, troque o “Tipo de gráfico” para Gráfico de colunas


Esse conjunto de indicadores e gráficos, já entrega uma visão executiva do projeto sem precisar abrir a planilha de tarefas linha por linha.
À medida que o número de tarefas crescer, porém, vale mover esse dashboard para uma aba própria (por exemplo, renomeando a aba de dados para “Tarefas” e criando uma aba “Dashboard” ao lado), isso evita que o painel fique disputando espaço com a tabela operacional, que tende a crescer conforme o projeto avança.
Nesse caso, as fórmulas passam a referenciar a aba de origem, como por exemplo =CONT.SE(Tarefas!J3:J24;”Concluído”).
Passo 7 — Proteja a planilha-mestre e libere apenas o essencial para a equipe
Quando várias pessoas editam o mesmo arquivo, o risco não é só sobrescrever um dado é sobrescrever uma fórmula sem perceber, quebrando o Gantt ou o dashboard para todo mundo.
Na estrutura deste artigo, a única coluna que a equipe precisa editar no dia a dia é o Status (J) todo o resto (datas, duração, dependência, percentual) deveria ficar protegido, editável só pelo gestor do projeto.
Proteja o bloco de dados e fórmulas (colunas A a I).
- Selecione o intervalo A3:I24 — do ID até o % Concluído, cobrindo todas as linhas de tarefa, mas sem incluir a coluna J (Status)
- Vá em Dados > Proteger páginas e intervalos
- No painel lateral que abre, adicione uma descrição (por exemplo, “Dados e fórmulas do projeto”) e clique em Definir permissões
- Na janela seguinte, escolha Restringir quem pode editar este intervalo, selecione Personalizado e mantenha marcado apenas o seu próprio e-mail (o do gestor do projeto), removendo qualquer outro editor da lista
- Clique em Concluído


Com isso, a coluna J (Status) continua liberada para toda a equipe editar, enquanto as demais colunas ficam bloqueadas para qualquer pessoa que não seja o gestor.
Se preferir apenas avisar, em vez de bloquear você pode, ao invés de “Restringir quem pode editar”, escolha Mostrar um aviso ao editar este intervalo.
Isso não impede a edição, mas exibe um alerta antes de qualquer alteração, uma opção mais flexível para equipes menores, onde bloquear totalmente pode ser desnecessário, mas ainda vale reduzir edições acidentais.
Passo 8 — Automatize lembretes de prazo, atraso e dependências pendentes com Apps Script
Até aqui, alguém ainda precisa abrir a planilha todos os dias para descobrir se um prazo está vencendo, se uma tarefa passou do prazo sem ser concluída, se uma tarefa já deveria ter começado, segundo o cronograma, ou se uma tarefa está avançando mesmo com a predecessora ainda pendente.
O Apps Script resolve isso enviando os quatro alertas automaticamente, sem depender de ninguém lembrar de checar e sem exigir nenhuma fórmula extra na planilha, já que toda a comparação acontece dentro do próprio script.
O que é o Google Apps Script: é a ferramenta de automação e programação que já vem integrada, de graça, em qualquer conta Google, não é um add-on nem exige assinatura.
Ele permite escrever pequenos programas (em JavaScript) que enxergam e manipulam a própria planilha: ler valores de células, enviar e-mails, criar eventos na agenda, entre outras ações.
Diferente de uma fórmula, que só existe dentro de uma célula, o script roda por conta própria e pode ser agendado para disparar automaticamente todos os dias, sem que ninguém precise abrir a planilha ou clicar em nada.
Abra Extensões > Apps Script.

Na barra lateral renomeie para melhor visualização e entendimento.

Cole a função abaixo, ajustando o nome da aba e o e-mail de destino:
function verificarPrazos() {
// Lê todos os dados da aba "Tarefas", incluindo a linha de título e a linha de cabeçalho
const planilha = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tarefas");
const dados = planilha.getDataRange().getValues();
const hoje = new Date();
// Um arraí separado para cada tipo de alerta, em vez de uma lista única —
// isso permite agrupar e ordenar por gravidade na hora de montar o e-mail
let atrasadas = [];
let dependenciasPendentes = [];
let deveriamTerComecado = [];
let prazosProximos = [];
// Percorre cada linha de tarefa (linha 3 a 24 na planilha, índice 2 a 23 no arraí)
for (let i = 2; i < 24; i++) {
// Separa os valores da linha em variáveis, na mesma ordem das colunas da planilha (A a J)
const [id, tarefa, fase, responsavel, inicio, fim, duracao, dependeDe, percentual, status] = dados[i];
// Tarefa já concluída não precisa de nenhum alerta — pula para a próxima linha
if (status === "Concluído") continue;
// Calcula quantos dias faltam até o prazo final (número negativo se já passou)
const diasRestantes = Math.ceil((fim - hoje) / (1000 * 60 * 60 * 24));
// Alerta 1: a tarefa já passou do prazo e ainda não foi concluída
if (hoje > fim) {
atrasadas.push(`"${tarefa}" (responsável: ${responsavel}) venceu em ${fim.toLocaleDateString()} e o status ainda é "${status}".`);
} else if (diasRestantes <= 2) {
// Alerta 2: o prazo está próximo (2 dias ou menos), mas ainda não venceu
prazosProximos.push(`"${tarefa}" (responsável: ${responsavel}) vence em ${diasRestantes} dia(s).`);
}
// Alerta 3: a data de início já chegou, mas ninguém marcou a tarefa como iniciada
if (status === "Não iniciado" && hoje >= inicio) {
deveriamTerComecado.push(`"${tarefa}" (responsável: ${responsavel}) tinha início previsto em ${inicio.toLocaleDateString()}.`);
}
// Alerta 4: a tarefa depende de outra (coluna H) que ainda não foi concluída
if (dependeDe && dependeDe !== "-" && status !== "Não iniciado") {
// Procura, dentro dos mesmos dados já lidos, a linha da tarefa predecessora pelo ID
const predecessora = dados.find(linha => linha[0] == dependeDe);
if (predecessora && predecessora[9] !== "Concluído") {
dependenciasPendentes.push(`"${tarefa}" (responsável: ${responsavel}) está com status "${status}", mas depende da tarefa ${dependeDe} ("${predecessora[1]}"), que ainda não foi concluída.`);
}
}
}
const totalAlertas = atrasadas.length + dependenciasPendentes.length + deveriamTerComecado.length + prazosProximos.length;
// Só monta e envia o e-mail se pelo menos um alerta foi gerado — evita mensagens vazias todo dia
if (totalAlertas > 0) {
// Resumo no topo, com a contagem de cada tipo de alerta.
// Usar <br> em vez de \n evita que o cliente de e-mail quebre a linha no meio
// do texto de forma aleatória — cada <br> força uma quebra exatamente onde você definiu.
let corpo = `Resumo: ${atrasadas.length} atrasada(s), ${dependenciasPendentes.length} dependência(s) pendente(s), ${deveriamTerComecado.length} tarefa(s) que deveriam ter começado, ${prazosProximos.length} prazo(s) próximo(s).<br><br>`;
// Os blocos são montados na ordem de gravidade: atrasada é o alerta mais urgente,
// seguido de dependência pendente, depois "deveria ter começado" e por fim prazo próximo.
// Cada bloco só aparece no e-mail se tiver pelo menos um item, com o título em negrito (<b>).
if (atrasadas.length > 0) {
corpo += "<b>⚠ ATRASADAS</b><br>" + atrasadas.join("<br>") + "<br><br>";
}
if (dependenciasPendentes.length > 0) {
corpo += "<b>⚠ DEPENDÊNCIAS PENDENTES</b><br>" + dependenciasPendentes.join("<br>") + "<br><br>";
}
if (deveriamTerComecado.length > 0) {
corpo += "<b>⚠ DEVERIAM TER COMEÇADO</b><br>" + deveriamTerComecado.join("<br>") + "<br><br>";
}
if (prazosProximos.length > 0) {
corpo += "<b>PRAZOS PRÓXIMOS</b><br>" + prazosProximos.join("<br>");
}
// htmlBody, em vez do corpo de texto simples, é o que faz o Gmail interpretar
// as tags <br> e <b> como formatação, em vez de exibi-las como texto literal
MailApp.sendEmail({
to: "gerente@mail.com.br",
subject: "Prazos, atrasos e dependências no projeto",
htmlBody: corpo
});
}
}

Após colocar o código e inserir o seu e-mail salve o projeto no ícone de disquete.
Repare que os quatro alertas partem da mesma lógica: comparar a data de hoje, o Status reportado e, no caso da dependência, o Status da tarefa predecessora.
O script nunca presume que uma tarefa está em andamento ou liberada só porque a data já chegou, ele só avisa quando existe uma contradição real entre o cronograma, o que foi informado na planilha e o que as demais tarefas indicam.
O índice i = 2 no laço for pula a linha de título e a linha de cabeçalho antes de chegar à primeira tarefa (linha 3 na planilha, posição 2 no arraí, já que a contagem começa em zero) ajuste esse número se sua planilha não tiver linha de título.
Por padrão, o MailApp.sendEmail está configurado para enviar a um único destinatário. Para notificar mais de uma pessoa o gestor e a equipe, por exemplo, separe os e-mails por vírgula dentro da mesma string:
MailApp.sendEmail(“gerente@mail.com.br,marina@ mail.com.br,diego@ mail.com.br “, “Prazos, atrasos e dependências no projeto”, alertas.join(“\n”));.
Todos os endereços da lista recebem exatamente o mesmo e-mail, com todos os alertas juntos, não é possível, com essa sintaxe simples, separar automaticamente “os alertas da Marina” para a Marina e “os alertas do Diego” para o Diego.
Vale notar também que cada endereço na lista consome uma unidade da cota diária de envio de e-mail do Apps Script mencionada no próximo passo quanto mais destinatários, mais rápido essa cota se esgota.
Em seguida, configure um acionador, clique no ícone de relógio na barra lateral Acionadores > Adicionar acionador baseado em tempo, executando essa função diariamente, por exemplo entre 7h e 8h da manhã.

Antes de agendar o gatilho, execute a função manualmente (clique em Executar), isso garante que as permissões de envio de e-mail já foram concedidas e evita que a automação falhe silenciosamente na primeira execução agendada.

Passo 9 — Gere relatórios semanais automáticos
Além do lembrete diário, um resumo semanal por e-mail evita que o gerente do projeto precise abrir o dashboard toda segunda-feira para montar esse retrato manualmente.
function relatorioSemanal() {
const planilha = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tarefas");
const dados = planilha.getDataRange().getValues();
let concluidas = 0, andamento = 0, bloqueadas = 0, naoIniciadas = 0;
for (let i = 2; i < dados.length; i++) {
const status = dados[i][9];
if (status === "Concluído") concluidas++;
else if (status === "Em andamento") andamento++;
else if (status === "Bloqueado") bloqueadas++;
else naoIniciadas++;
}
const corpo = `Resumo semanal do projeto:
Concluídas: ${concluidas}
Em andamento: ${andamento}
Bloqueadas: ${bloqueadas}
Não iniciadas: ${naoIniciadas}`;
MailApp.sendEmail("gerente@mail.com.br", "Relatório semanal do projeto", corpo);
}


Configure um segundo acionador baseado em tempo, rodando semanalmente às segundas-feiras pela manhã.
Ao planejar essa automação para uma equipe maior ou para rodar com alta frequência, vale considerar que contas gratuitas têm um limite diário menor de envios de e-mail via Apps Script do que contas Google Workspace o script funciona igual, mas pode parar de enviar sem aviso se o limite for atingido no meio do dia.
Quando faz sentido migrar do Google Sheets para uma ferramenta dedicada
- Auditoria e compliance: se o seu contexto exige saber com certeza quem alterou um dado e quando por exigência regulatória, contratual ou de faturamento.
- Integrações externas: se o projeto depende de sincronização constante com outras ferramentas (CRM, sistema de tickets, calendário compartilhado com terceiros), a manutenção manual dessas pontes no Sheets tende a consumir mais tempo do que economiza.
Conclusão
O que muda entre uma planilha que vira lista de tarefas e um sistema de gestão real é a estrutura por trás dela, não a ferramenta em si.
Com o que foi montado neste guia, você sai de uma planilha reativa que só mostra o que já aconteceu para uma planilha que avisa, calcula e sinaliza sozinha onde o projeto está travando.
O próximo passo natural depois de estruturar esse sistema é aprofundar as fórmulas de automação que sustentam os lembretes e relatórios entender acionadores, tratamento de erro e limites de execução do Apps Script com mais profundidade.
Baixe AQUI o exemplo que realizamos juntos e modificá-lo conforme a sua necessidade.
Sobre o Autor
0 Comentários