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

URL canônica: https://ajustapdf.com/blog/pdf-com-google-apps-script

Publicado em 2026-10-20 · 5 min de leitura · por [AjustaPDF](https://ajustapdf.com/sobre#editorial)

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.

| Plano | Operações por dia | Tamanho por arquivo |
| --- | --- | --- |
| Sem conta | 3 | 25 MB |
| Conta grátis | 10 | 50 MB |
| Pro | 500 | 200 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](/blog/pdf-no-google-docs-baixar) 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](/blog/lgpd-enviar-documento-de-cliente-site).

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](/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](/blog/pdf-no-google-drive); para outras automações, [n8n, Make ou Zapier](/blog/automatizar-pdf-n8n-make-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.
