Página de apoio · Livro 1
O Robô Que Sabe Parar — página do livro
Aqui está o código pronto para copiar e a lista de erros, com o que fazer em cada um.
Sem cadastro. Sem pedir e-mail. Sem criar conta. Se em algum momento esta página te pedir para se cadastrar antes de te dar o código, alguém a copiou — a original é esta.
Os prompts na versão longa e comentada abrem com o código impresso no livro. É uma linha para digitar, não um cadastro — e nada do que está aqui em cima depende dele.
Seção 1
O código
É este o arquivo inteiro. Você não precisa entender nada dele agora — o capítulo 4 do livro explica, e o primeiro prompt aqui embaixo faz uma inteligência artificial explicar de novo, com as suas palavras.
Antes de copiar, a única regra que importa: no máximo 10 a 15 candidaturas por dia, uma por e-mail, sempre com texto diferente e sempre em resposta a uma vaga real. Nunca use isto para disparo em massa. Não é para isso que serve, e é assim que se perde uma conta — a detecção de abuso não olha a cota, olha o comportamento.
// ===================================================
// O ROBÔ QUE SABE PARAR — a Sonda (NÃO SOU PROGRAMADOR, Livro 1)
// ===================================================
// Varre os rascunhos do Gmail. Só nos que o assunto termina
// exatamente em [ENVIAR], anexa o currículo, apaga a marca e envia.
// Rascunho sem a marca: o robô não faz nada. De propósito.
// Duas linhas para conferir ou trocar (capítulo 4 do livro):
// A marca que autoriza o envio.
var MARCA = "[ENVIAR]";
// O nome exato do arquivo, dentro da pasta Sonda.
var ARQUIVO = "curriculo.pdf";
// Nome da pasta no seu Google Drive. Precisa estar em Meu Drive
// (não em Compartilhados comigo) — ver capítulo 3 do livro.
var PASTA = "Sonda";
function roboDaSonda() {
var rascunhos = GmailApp.getDrafts();
Logger.log(rascunhos.length + " rascunho(s) encontrado(s) no total.");
var curriculo = buscarCurriculo_();
if (!curriculo) {
Logger.log('curriculo.pdf não encontrado na pasta "' + PASTA + '" — nenhum rascunho marcado será enviado nesta execução.');
}
for (var i = 0; i < rascunhos.length; i++) {
processarRascunho_(rascunhos[i], curriculo);
}
}
function processarRascunho_(rascunho, curriculo) {
var mensagem = rascunho.getMessage();
// O .trim() tira espaço sobrando no fim do assunto. Um espaço depois do
// [ENVIAR] é invisível na tela e, sem isso, o robô não reconheceria a marca
// e você não teria como descobrir o porquê.
var assunto = (mensagem.getSubject() || "").trim();
// A comparação ignora maiúscula e minúscula: [enviar] também vale.
var fim = assunto.substring(assunto.length - MARCA.length);
var temMarca = assunto.length >= MARCA.length &&
fim.toUpperCase() === MARCA.toUpperCase();
if (!temMarca) {
// Freio de mão: sem a marca no fim do assunto, o robô ignora. Nada é logado
// aqui de propósito — rascunho sem marca não é um evento, é o padrão.
return;
}
if (!curriculo) {
// Falha segura: sem o anexo, não envia. O rascunho marcado fica intacto,
// pronto para ser reprocessado assim que o arquivo existir na pasta.
Logger.log('"' + assunto + '": currículo não encontrado — nada foi enviado.');
return;
}
var novoAssunto = assunto.substring(0, assunto.length - MARCA.length).trim();
// draft.update() SOBRESCREVE o rascunho inteiro — não é um patch.
// Por isso lemos e repassamos destinatário, cc, bcc e corpo originais,
// além de anexar o currículo aos anexos que já existiam.
var destinatario = mensagem.getTo();
var cc = mensagem.getCc();
var bcc = mensagem.getBcc();
var corpoTexto = mensagem.getPlainBody();
var corpoHtml = mensagem.getBody();
var anexos = mensagem.getAttachments().concat([curriculo]);
rascunho.update(destinatario, novoAssunto, corpoTexto, {
cc: cc,
bcc: bcc,
htmlBody: corpoHtml,
attachments: anexos
});
rascunho.send();
Logger.log('enviado: "' + novoAssunto + '" (era: "' + assunto + '")');
}
function buscarCurriculo_() {
var pastas = DriveApp.getFoldersByName(PASTA);
var meuEmail = Session.getActiveUser().getEmail();
while (pastas.hasNext()) {
var pasta = pastas.next();
// Só aceita a pasta se ela for sua (Meu Drive). Uma pasta de mesmo nome
// em "Compartilhados comigo" tem outro dono e é ignorada — é o que o
// capítulo 3 do livro pede para evitar.
// Em algumas contas o Apps Script não consegue dizer qual é o seu e-mail
// (meuEmail vem vazio). Nesse caso não dá para conferir o dono, e aceitar
// a pasta é melhor do que dizer que o currículo não existe com ele lá.
var dono = pasta.getOwner();
if (meuEmail && dono && dono.getEmail() !== meuEmail) {
continue;
}
var arquivos = pasta.getFilesByName(ARQUIVO);
if (arquivos.hasNext()) {
return arquivos.next().getBlob();
}
}
return null; // Falha segura: sem currículo, robôDaSonda() não envia nada.
}As duas linhas que você pode trocar estão no topo do arquivo, com comentário em português do lado: a marca e o nome do currículo. Se você seguiu o capítulo 3, as duas já estão certas.
Colar isto pelo aplicativo do celular perde as quebras de linha. Esta é a única parte do livro que pede um computador — ou o navegador do celular em modo desktop.
Seção 2
Se a sua tela estiver em inglês
Acontece bastante, principalmente em conta criada há muito tempo. Os botões são os mesmos, com outro nome.
| No livro | Na sua tela |
|---|---|
| Novo projeto | New project |
| Executar | Run |
| Registro de execução | Execution log |
| Avançado | Advanced |
| Acessar (não seguro) | Go to … (unsafe) |
| Permitir | Allow |
| Acionadores | Triggers |
| Adicionar acionador | Add Trigger |
| Por tempo | Time-driven |
| De hora em hora | Hour timer |
| Rascunhos | Drafts |
Quer deixar em português? Nas configurações da sua Conta Google, em Dados e privacidade, vá a Idioma. A mudança vale para o editor de script também.
Seção 3
Os prompts, com comentário
No livro eles estão curtos, para caber na página e para você digitar rápido. Aqui está a versão longa de cada um, com o porquê de cada regra — é isso que te deixa adaptar o prompt para o seu caso em vez de repetir o meu.
Todos funcionam em qualquer assistente de inteligência artificial com versão gratuita.
Esta é a parte que vem com o livro. Digite o código impresso nele e a seção abre neste navegador para sempre. Continua sem e-mail e sem conta — e o código do robô, na seção 1, nunca depende disso.
O código está impresso no livro. Você digita uma vez e este navegador lembra — não pedimos e-mail, não criamos conta e não guardamos nada sobre você.
As telas de erro, o código do robô e o que fazer quando nada sai continuam abertos aqui em cima, sem código nenhum. Quem travou não fica preso atrás de uma parede.
Seção 4
Deu erro?
Comece por aqui: nada foi enviado, nada foi apagado. Quando o robô falha, ele para. O rascunho continua no lugar, com a marca, esperando. Você conserta e roda de novo.
Erro 1currículo não encontrado — nada foi enviado
O robô olhou na pasta Sonda e não achou o arquivo. Confira os três: a pasta se chama Sonda; ela está em Meu Drive, não em Compartilhados comigo; o arquivo se chama curriculo.pdf, minúsculo, sem acento e sem espaço. O seu rascunho não foi enviado — ele está intacto.
Erro 2SyntaxError, ou “erro de sintaxe”
O texto colado quebrou na cópia. Apague tudo e cole de novo daqui, pelo botão de copiar. Não digite à mão.
Erro 3Execução concluída, mas nada saiu
Nenhum rascunho marcado foi encontrado. Confira o fim do assunto: colchete reto, sem espaço dentro. Maiúscula não é o problema e espaço sobrando no fim também não — desses dois o robô dá conta sozinho.
Erro 4myFunction is not defined
Sobrou o código de exemplo do editor, ou a caixinha do alto está com a função errada. Confira que só existe o código colado, e selecione roboDaSonda antes de executar.
Erro 5Authorization is required, ou “é necessária autorização”
A permissão foi recusada, ou uma caixinha ficou desmarcada. Rode de novo e refaça a sequência do capítulo 5 marcando todas. Se travar: na sua Conta Google, em Dados e privacidade, vá a Apps com acesso à sua Conta, remova o acesso e autorize do zero.
Erro 6Criei o rascunho pelo celular e ele foi ignorado
O teclado do celular corrige colchete e maiúscula sozinho. Abra o rascunho no navegador e olhe o fim do assunto.
Não é nenhum dos seis? Use o prompt do socorro, aqui em cima.
Continua travado? Me escreva contando o que apareceu na tela, pelo contato. Erro relatado vira linha nova nesta lista.
Sobre esta página: ela é atualizada quando um leitor relata alguma coisa que quebrou. Se você chegou aqui pelo livro, obrigado.
Esta página não pede e-mail, não cria conta e não guarda nada sobre você. O código do robô e a lista de erros são abertos para qualquer pessoa; os prompts comentados abrem com o código do livro. A marca ENVIAR continua valendo: sem ela, nada sai.
Sem vínculo com Google, Alphabet ou Amazon. As telas dos produtos citados mudam com o tempo; é para isso que esta página existe.