Ir para o conteúdo
5 min de leitura

Google Apps Script: comprimir PDFs do Drive pela API

Como usar o Google Apps Script para ler PDFs do Drive, comprimir pela API do AjustaPDF e gravar o resultado em outra pasta, com a chave fora do código.

Com Google Apps Script, você comprime PDFs de uma pasta do Drive sem baixá-los para o computador. O script lê cada arquivo, envia para a API de compressão, recebe o PDF menor e grava o resultado em outra pasta. A cota diária e o tempo por execução decidem como dividir o trabalho.

Prepare o projeto e a chave

Crie um projeto novo em script.google.com e salve-o com um nome que diga a tarefa. Antes de escrever o código, guarde a chave de API nas propriedades do script: nas configurações do projeto, adicione uma propriedade com o nome AJUSTAPDF_KEY e o valor da chave. Isso evita que a chave fique escrita no código, que é o lugar mais fácil de ela vazar ao copiar o script para outra pessoa.

A chave é criada na página Conta, na seção Chaves de API. Ela gasta a cota da conta que a criou, a mesma que o site usa, e você pode revogá-la a qualquer momento se achar que ela vazou.

O script completo

O arquivo do Drive vira um blob com getBlob(). O envio é um POST para a rota de compressão, com o cabeçalho Authorization no formato Bearer. No corpo, o campo file recebe o blob e o campo level recebe media, o nível médio, sem acento. O UrlFetchApp monta o corpo como multipart quando um dos valores do payload é um blob, então você não precisa montar o formulário à mão.

function comprimirPasta() {
  const chave = PropertiesService.getScriptProperties().getProperty("AJUSTAPDF_KEY");
  const origem = DriveApp.getFolderById("ID_DA_PASTA_DE_ORIGEM");
  const destino = DriveApp.getFolderById("ID_DA_PASTA_DE_SAIDA");
  const inicio = Date.now();

  const arquivos = origem.getFilesByType(MimeType.PDF);
  while (arquivos.hasNext()) {
    if (Date.now() - inicio > 4 * 60 * 1000) break; // folga antes do limite da execução

    const arquivo = arquivos.next();
    const nome = arquivo.getName().replace(/\.pdf$/i, "") + "-comprimido.pdf";
    if (destino.getFilesByName(nome).hasNext()) continue; // já feito

    const resposta = UrlFetchApp.fetch("https://api.ajustapdf.com/pdf/compress", {
      method: "post",
      headers: { Authorization: "Bearer " + chave },
      payload: { file: arquivo.getBlob(), level: "media" },
      muteHttpExceptions: true,
    });

    if (resposta.getResponseCode() !== 200) {
      Logger.log(arquivo.getName() + ": " + resposta.getContentText());
      if (resposta.getContentText().indexOf("QUOTA_EXCEEDED") !== -1) break;
      continue;
    }
    destino.createFile(resposta.getBlob().setName(nome));
  }
}

O muteHttpExceptions é o que deixa você ler o erro: sem ele, o UrlFetchApp lança uma exceção em qualquer resposta 4xx ou 5xx e a mensagem da API se perde. Com ele, a resposta de erro traz um JSON com error e message, e o script grava o código no log e só continua quando o status é 200. Para parar o lote quando a cota do dia acaba, o script procura QUOTA_EXCEEDED no corpo da resposta.

Grave o resultado no Drive

O blob da resposta não traz um nome útil. Antes de gravá-lo, dê um nome com setName, mantendo o nome original e acrescentando um sufixo como “-comprimido”, e use createFile na pasta de saída. A pasta de origem fica intacta e o resultado aparece lado a lado. Como o script confere se o arquivo comprimido já existe na pasta de saída, uma segunda execução retoma de onde a anterior parou, sem repetir nem gastar cota em arquivos prontos.

Divida o trabalho por execução

Uma execução do Apps Script tem limite de tempo, de 6 minutos em contas comuns (confira o valor atual na documentação do Google). Uma pasta grande não cabe numa única execução, e por isso o script para antes do limite e deixa o resto para a próxima. Um gatilho de tempo chama a função de hora em hora ou por dia, até a pasta acabar:

function agendar() {
  ScriptApp.newTrigger("comprimirPasta").timeBased().everyHours(1).create();
}

A cota vale por operação. Cada arquivo comprimido gasta uma das operações do dia, e o plano grátis tem 10. Por isso, combine o gatilho com a leitura dos cabeçalhos x-quota-used e x-quota-limit, que a API devolve nas respostas bem-sucedidas, e pare quando o uso chegar ao teto. O Apps Script também tem cotas próprias de chamadas externas e de tamanho de envio; confira as atuais na documentação do Google antes de apontar o script para uma pasta com arquivos grandes.

PlanoOperações por diaTamanho por arquivo
Sem conta325 MB
Conta grátis1050 MB
Pro500200 MB

Arquivos do Google não são PDF

Um Google Docs ou um Google Slides no Drive não é um PDF, e enviá-lo direto não funciona. Para obter o PDF, chame getAs com MimeType.PDF sobre o arquivo do Google e envie essa cópia no lugar do getBlob(). A cópia não altera o documento original. Se a pasta tem uma mistura de PDFs e arquivos do Google, o tipo do arquivo, obtido com getMimeType, decide qual caminho seguir. O guia baixar Google Docs como PDF mostra como ajustar página e margens antes da exportação.

Cuidados com o que sai do Drive

O script envia arquivos do Drive para um servidor de terceiro, e isso precisa de uma decisão consciente. O arquivo é apagado do servidor logo depois de devolver o resultado, mas uma pasta do Drive costuma misturar documentos de trabalho, de clientes e pessoais. Escolha a pasta de origem com cuidado e teste com arquivos de exemplo antes de apontar o script para o acervo inteiro. Sobre dados de clientes, veja LGPD ao enviar documento de cliente.

A compressão achata formulários: os campos preenchidos viram texto fixo e os campos somem. Não envie modelos que alguém ainda vai preencher pelo mesmo script, e confira o resultado antes de substituir qualquer arquivo original.

Quando o Apps Script não é o caminho

Para um arquivo de vez em quando, o navegador é mais simples: a ferramenta de comprimir PDF recebe o arquivo e devolve o resultado em um passo. O Apps Script compensa quando a pasta do Drive recebe PDFs toda semana e o resultado precisa cair em outra pasta sem intervenção. Para o que o próprio Drive faz sem script, veja juntar PDF no Google Drive; para outras automações, n8n, Make ou Zapier. Se o objetivo é juntar os PDFs de uma pasta em um só, a lógica é parecida, com a rota /pdf/merge e o campo files no lugar de file.

Checklist antes de publicar o script

  • Guarde a chave nas propriedades do script, nunca no código.
  • Teste com uma pasta de três arquivos e abra cada resultado.
  • Grave os resultados em outra pasta e nunca sobrescreva o original.
  • Confira o log depois da primeira execução automática.

Perguntas frequentes

Dá para comprimir PDFs do Google Drive com Google Apps Script?

Dá. O script lê o arquivo do Drive como blob, envia para a rota /pdf/compress da API com a chave no cabeçalho Authorization e grava o resultado numa pasta do Drive. Cada arquivo gasta uma operação da sua cota, e o limite de tempo de cada execução do Apps Script obriga a processar a pasta em partes.

Onde guardar a chave de API no Apps Script sem deixá-la no código?

Nas propriedades do script, que ficam fora do código e não aparecem quando você copia o projeto. No editor, abra as configurações do projeto e adicione AJUSTAPDF_KEY em Propriedades do script; no código, leia com PropertiesService.getScriptProperties(). Quem tem acesso de edição ao projeto ainda consegue ver o valor, então trate o projeto como sensível.

Como converter um Google Docs ou Slides para PDF antes de enviar?

Arquivos nativos do Google, como Docs e Slides, não são PDF no Drive. Para obter o PDF, peça ao arquivo uma cópia no tipo PDF com getAs(MimeType.PDF) e envie essa cópia para a API. Assim o script trabalha só com arquivos PDF de verdade, e o documento original não muda.

O que acontece com os arquivos que o script envia para a API?

O servidor processa o arquivo e o apaga assim que a resposta sai, exceto na função de pedir assinatura, que guarda o arquivo criptografado até todos assinarem. Mesmo assim, o script deve enviar só o que você tem direito de processar, porque o Drive pode conter documentos de terceiros.