Pular para o conteúdo
Não sou programador

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.

abrir em texto puro
// ===================================================
// 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.

Equivalência entre os botões em português e em inglês
No livroNa sua tela
Novo projetoNew project
ExecutarRun
Registro de execuçãoExecution log
AvançadoAdvanced
Acessar (não seguro)Go to … (unsafe)
PermitirAllow
AcionadoresTriggers
Adicionar acionadorAdd Trigger
Por tempoTime-driven
De hora em horaHour timer
RascunhosDrafts

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.

assunto da vagasai
os promptsfica

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.

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

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

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

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

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

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