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