Para não perder o prazo de aviso de rescisão, a renovação automática ou a data de reajuste de um contrato, a combinação que funciona em pequena empresa é simples: a IA lê os PDFs do Drive e devolve as datas e cláusulas num formato fixo (JSON), essas informações vão para uma planilha, uma pessoa confere cada data contra o contrato e só então um Apps Script cria os eventos no Google Agenda, com alertas antecipados de 60, 30 e 7 dias e, se quiser, um e-mail.
A IA poupa a leitura, não decide prazo: a data que vai para a agenda é sempre a conferida por alguém, com o trecho do contrato ao lado.
Resumo rápido
- Extraia de cada contrato: fim da vigência, renovação automática, aviso prévio (em dias e se são corridos ou úteis), índice e data de reajuste, sempre com o trecho e a página de origem.
- Peça saída estruturada com JSON Schema e permita o valor nulo: “não encontrado” é uma resposta válida e muito melhor que uma data inventada.
- Nenhuma linha vira evento sem a coluna “conferido” marcada por uma pessoa.
- Lembretes de um evento do Google Agenda vão de 5 minutos a 4 semanas de antecedência; para avisar com 60 dias, crie eventos de alerta separados.
- Um gatilho diário do Apps Script processa só as linhas novas e grava o ID dos eventos para não duplicar.
Por que contrato esquecido custa caro
O risco está menos na data de término e mais na data em que você ainda podia agir. Um contrato de software com renovação automática anual e aviso prévio de 90 dias, por exemplo, exige que a notificação saia três meses antes do fim da vigência. Quem anota só o vencimento descobre o problema quando a renovação já aconteceu.
O mesmo vale para reajuste: saber o mês e o índice permite renegociar antes da cobrança chegar.
O Código Civil ajuda a entender a mecânica. O art. 473 diz que a resilição unilateral, quando a lei permite, “opera mediante denúncia notificada à outra parte”. Ou seja, encerrar depende de uma notificação, e o contrato costuma fixar com quanta antecedência ela deve ser feita. O art. 132 traz a regra geral de contagem: exclui-se o dia do começo e inclui-se o do vencimento; se o vencimento cair em feriado, prorroga-se até o dia útil seguinte; prazos em meses e anos expiram no dia de igual número do início. São regras gerais, que o contrato ou lei específica podem alterar; na dúvida, consulte um advogado.
O que extrair de cada contrato
Defina os campos antes de abrir qualquer ferramenta. A tabela serve para prestação de serviço, locação e software.
| Campo | Exemplo de valor | O que a pessoa confere |
|---|---|---|
| Contraparte | Nome do fornecedor ou locador | Se bate com a primeira página e com a assinatura |
| Início e fim da vigência | 2026-03-01 a 2027-02-28 | Se há aditivo que mudou o prazo |
| Renovação automática | sim / não / não encontrado | Se a cláusula fala em renovação tácita, por igual período, ou só por aditivo |
| Aviso prévio para não renovar ou rescindir | 90 dias | Se são dias corridos ou úteis e a partir de que data contam |
| Data-limite do aviso | Calculada a partir dos campos acima | Cálculo manual, de preferência por duas pessoas na primeira vez |
| Índice e data de reajuste | IPCA, a cada 12 meses do início | Se há índice substituto e se a data é aniversário do contrato ou outra |
| Trecho e página | “Cláusula 12.1, p. 4” | Se o trecho citado existe e diz o que a IA resumiu |
Dias corridos versus úteis é a fonte de erro mais traiçoeira. Antes de confiar em cálculo automático, aplique o teste do nosso guia sobre interpretação de prazos em dias úteis e corridos. Se você contar dias úteis, também vai precisar de uma tabela de feriados, inclusive municipais, como explicamos em calendários de feriados para automações.
Extração com IA e saída estruturada
A API do Gemini lê PDF diretamente. Pela documentação do Google, cada página é processada como imagem e o limite é de 50 MB ou 1.000 páginas por arquivo, com cerca de 258 tokens por página. Isso cobre com folga contratos de pequena empresa, inclusive escaneados, desde que a digitalização esteja legível e na orientação correta. Veja o panorama de ferramentas em nossa página de integrações do Google Gemini.
O ponto central é pedir saída estruturada: você envia um JSON Schema e o modelo responde num JSON que segue esse formato. A documentação de structured output do Gemini aceita tipos como string, integer e boolean, listas de valores permitidos (enum), o formato date para textos de data e campos que podem ser nulos (incluindo "null" no tipo). Um esquema enxuto para este caso:
{
"type": "object",
"properties": {
"contraparte": {"type": "string"},
"fim_vigencia": {"type": ["string", "null"], "format": "date"},
"renovacao_automatica": {"type": "string", "enum": ["sim", "nao", "nao_encontrado"]},
"aviso_previo_dias": {"type": ["integer", "null"]},
"tipo_dias_aviso": {"type": "string", "enum": ["corridos", "uteis", "nao_especificado"]},
"indice_reajuste": {"type": ["string", "null"]},
"trechos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"campo": {"type": "string"},
"pagina": {"type": ["integer", "null"]},
"texto_literal": {"type": "string"}
}
}
}
},
"required": ["contraparte", "fim_vigencia", "renovacao_automatica",
"aviso_previo_dias", "tipo_dias_aviso", "trechos"]
}
No prompt, peça: “se a informação não estiver no documento, responda null; não deduza”, “copie o trecho literal e a página de cada campo” e “não calcule a data-limite do aviso” (esse cálculo fica na planilha, onde é auditável).
A própria documentação do Google avisa que o JSON sai sintaticamente correto, mas os valores precisam ser validados pela aplicação. Um esquema garante o formato, não a verdade.
Cuidado com os dados enviados
Contratos têm nomes, CPFs e valores. Nos termos da API do Gemini, o conteúdo enviado aos serviços não pagos pode ser usado para melhorar produtos do Google e lido por revisores humanos, e os termos pedem que não se envie informação pessoal ou confidencial a eles. Nos serviços pagos, o Google afirma não usar prompts e respostas para melhorar produtos. Para contratos reais, use conta com faturamento ativo e registre a escolha na sua avaliação de LGPD.
A planilha de conferência
O resultado de cada extração vira uma linha numa planilha Google com o nome “Contratos”. Sugestão de colunas, na ordem que o script abaixo espera:
- A: arquivo (link do PDF no Drive)
- B: contraparte
- C: fim da vigência
- D: renovação automática
- E: aviso prévio (dias)
- F: data-limite do aviso (preenchida ou confirmada pela pessoa)
- G: índice de reajuste
- H: data do próximo reajuste
- I: trecho e página
- J: conferido (SIM quando a pessoa validar)
- K: eventos criados (preenchida pelo script)
A coluna F é a que importa. Em dias corridos, =C2-E2 dá um primeiro valor, mas alguns contratos contam o aviso a partir do recebimento da notificação. Confira o campo F com o PDF aberto ao lado.
Se você também quer revisar o que entra nos contratos com fornecedores de tecnologia, o guia de cláusulas essenciais em contratos com fornecedores de IA complementa este processo.
Lembretes do Google Agenda: o limite de 4 semanas
Aqui está o detalhe que derruba muitos desenhos. Na referência do Apps Script, os métodos addPopupReminder e addEmailReminder aceitam antecedência mínima de 5 minutos e máxima de 4 semanas (40.320 minutos). A documentação de addEmailReminder também indica erro quando o evento passa de 5 lembretes. Um lembrete de 60 dias no próprio evento, portanto, não existe.
| Forma de alertar | Antecedência possível | Quando usar |
|---|---|---|
| Lembrete no evento da data-limite | De 5 minutos a 4 semanas | Alerta final, de 7 ou 14 dias |
| Eventos de alerta separados (D-60, D-30, D-7) | Qualquer uma, pois cada alerta é um evento próprio | Avisos longos, visíveis na agenda compartilhada da equipe |
| E-mail pelo Apps Script (MailApp) | Definida pelo seu script | Resumo semanal para o responsável, com links dos contratos |
O desenho recomendado combina os três: um evento de dia inteiro na data-limite do aviso, com lembrete de 7 dias; eventos separados 60 e 30 dias antes; e, opcionalmente, um e-mail. Use uma agenda própria (“Prazos de contratos”) compartilhada com quem decide.
O Apps Script passo a passo
Na planilha, abra Extensões > Apps Script e cole o código. Troque ID_AGENDA pelo ID da agenda de prazos (fica nas configurações da agenda, em “Integrar agenda”).
const ID_AGENDA = 'COLE_AQUI_O_ID_DA_AGENDA';
const ALERTAS_DIAS = [60, 30, 7];
const FUSO = 'America/Sao_Paulo';
function criarAlertas() {
const aba = SpreadsheetApp.getActive().getSheetByName('Contratos');
const dados = aba.getDataRange().getValues();
const agenda = CalendarApp.getCalendarById(ID_AGENDA);
const hoje = new Date();
for (let i = 1; i < dados.length; i++) {
const [arquivo, parte, fim, renova, aviso, limite, indice, reajuste, trecho, conferido, criados] = dados[i];
if (conferido !== 'SIM' || criados) continue;
if (!(limite instanceof Date)) continue;
const dataLimite = Utilities.formatDate(limite, FUSO, 'dd/MM/yyyy');
const descricao = 'Contrato: ' + arquivo +
'nLimite para enviar aviso: ' + dataLimite +
'nRenovação automática: ' + renova +
'nTrecho: ' + trecho;
const ids = [];
ALERTAS_DIAS.forEach(function (d) {
const dia = new Date(limite.getTime());
dia.setDate(dia.getDate() - d);
if (dia < hoje) return;
const ev = agenda.createAllDayEvent(
'Faltam ' + d + ' dias: aviso do contrato ' + parte, dia, {description: descricao});
ev.setTag('contrato', String(arquivo));
ids.push(ev.getId());
});
// Para o reajuste (coluna H), repita o bloco abaixo com a data de reajuste.
const final = agenda.createAllDayEvent(
'PRAZO FINAL do aviso: ' + parte, limite, {description: descricao});
final.addPopupReminder(7 * 24 * 60);
final.setTag('contrato', String(arquivo));
ids.push(final.getId());
aba.getRange(i + 1, 11).setValue(ids.join(','));
}
}
function instalarGatilho() {
ScriptApp.newTrigger('criarAlertas')
.timeBased().everyDays(1).atHour(7).inTimezone(FUSO).create();
}
Rode instalarGatilho uma única vez; o Google pedirá autorização para acessar planilha e agenda. A partir daí, o script roda todo dia por volta das 7h. A documentação explica que o horário de gatilhos de tempo é levemente aleatorizado dentro da hora escolhida, então não conte com o minuto exato.
O controle de duplicidade está na coluna K: linha com IDs gravados é ignorada. Se a data mudar por aditivo, apague os eventos antigos (o ID está na planilha, e CalendarApp.getEventById recupera cada um), limpe a coluna K, corrija a data e marque de novo como conferido. A tag contrato gravada em cada evento ajuda a localizar o que pertence a qual arquivo.
Cotas que valem para pequena empresa
A página de cotas do Apps Script informa, para contas pessoais (gmail.com) e Google Workspace respectivamente: 5.000 e 10.000 eventos de agenda criados por dia, 100 e 1.500 destinatários de e-mail por dia, 90 minutos e 6 horas de execução total de gatilhos por dia, e 6 minutos por execução. Para algumas dezenas de contratos, nada disso aperta; numa conta pessoal, prefira um resumo semanal único a um e-mail por contrato.
Exemplo: distribuidora em Belo Horizonte
Uma distribuidora de produtos de limpeza em Belo Horizonte guarda no Drive os contratos de aluguel do galpão, sistema de gestão, locação de empilhadeira e manutenção. A sócia responsável pelo financeiro quer saber, com antecedência, quando precisa decidir se renova cada um.
O auxiliar administrativo envia os PDFs para extração com o esquema acima e cola os resultados na planilha “Contratos”. O contrato do sistema de gestão volta com renovação automática “sim”, aviso prévio de 60 dias e “tipo_dias_aviso” igual a “corridos”, com o trecho da cláusula. O da empilhadeira volta com aviso prévio nulo: a IA não encontrou a cláusula, e o auxiliar descobre que o prazo está num aditivo separado, que não estava na pasta. Esse é o caso em que a saída nula salvou a conferência: com uma data inventada, ninguém teria procurado o aditivo.
A sócia confere a coluna F de cada linha com o PDF aberto e marca SIM. No dia seguinte, a agenda “Prazos de contratos” mostra os alertas de 60, 30 e 7 dias, com o trecho da cláusula na descrição.
Erros comuns
- Criar eventos direto da saída da IA. A conferência humana não é etapa opcional. Sem a coluna “conferido”, um erro de leitura vira compromisso na agenda com aparência de verdade.
- Anotar o fim da vigência em vez da data-limite do aviso. O alerta útil é o da última data em que você ainda pode notificar.
- Tentar um lembrete de 60 dias no evento. O limite é de 4 semanas; use eventos de alerta separados.
- Ignorar aditivos. Um aditivo pode mudar vigência, índice ou aviso prévio. Mantenha aditivos na mesma pasta e informe ao modelo que eles prevalecem sobre o contrato original.
- Misturar dias úteis e corridos. Registre o tipo de dia na planilha e não deixe uma fórmula de dias corridos tratar um prazo em dias úteis.
Perguntas frequentes
Preciso saber programar para montar esse fluxo?
Para a agenda, basta colar o script, trocar o ID e autorizar. A extração pode ser feita arquivo por arquivo numa ferramenta de chat com o Gemini, colando o resultado na planilha.
A IA consegue calcular sozinha a data-limite do aviso?
Consegue tentar, mas não deve ser a fonte final: o cálculo depende de dias úteis, feriados e do marco inicial. Deixe-o visível na planilha e confira.
Funciona com contrato escaneado?
Sim, a API do Gemini processa páginas de PDF como imagem. A documentação recomenda páginas na orientação correta e sem desfoque. Digitalização ruim aumenta o risco de data lida errado.
O que acontece se eu editar a data depois que os eventos forem criados?
Nada muda sozinho, porque a linha já tem IDs na coluna K. Apague os eventos antigos, limpe a coluna K e marque a linha como conferida de novo para o script recriar os alertas.
Fontes e leitura recomendada
- Google Apps Script: CalendarEvent (lembretes e tags)
- Google Apps Script: Calendar (createAllDayEvent)
- Google Apps Script: ClockTriggerBuilder (gatilhos de tempo)
- Google Apps Script: gatilhos instaláveis
- Google Apps Script: cotas de serviço
- Gemini API: compreensão de documentos PDF
- Gemini API: saída estruturada com JSON Schema
- Termos adicionais da Gemini API (uso de dados)
- Código Civil (Lei 10.406/2002), arts. 132 e 473