Como Aplicar Hash em Telefones e E-mails no Google Planilhas

Equipe 8apps·

O Planilhas não tem função SHA-256 embutida. Como aplicar hash em uma lista de clientes corretamente – e por que o mesmo telefone precisa de dois hashes diferentes.

Todo mundo entende isso ao contrário. Produzir um digest SHA-256 leva quatro linhas de Apps Script. Conseguir uma correspondência de uma plataforma de anúncios exige normalização, e é na normalização que as listas morrem.

O Google diz isso com todas as letras na própria documentação da API: "If the contact information is not correctly formatted before hashing, the API still accepts the hashed information, but it can't be matched with a customer."

O upload dá certo. O que falha é a taxa de correspondência. E nada te avisa.

Este guia cobre as duas metades – como de fato produzir um hash no Google Planilhas e as regras de normalização por plataforma que decidem se ele vai corresponder a alguma coisa. Há quatro caminhos para a primeira metade. O mais curto é um complemento que normaliza e aplica hash em uma única função – o Caminho 1 abaixo – e o resto desta página é o detalhe por trás do motivo de a normalização ser a parte que vale a pena acertar.


Primeiro: o Planilhas não tem função de hash

A lista de funções publicada pelo Google tem dezessete categorias – Data, Engenharia, Financeiras, Texto, Matemática e por aí vai. Não há SHA256, não há MD5, não há HASH, não há DIGEST. A categoria Engenharia guarda conversões de base e números complexos, e nada criptográfico.

Ou seja, todo caminho é uma solução de contorno. São quatro, e não são igualmente bons:

CaminhoUse quandoVeredito
Um complemento que coloca funções de hash na planilhaVocê tem uma lista de clientes real para preparar e quer a normalização resolvidaRecomendado
Seu próprio Apps Script como função personalizadaVocê quer ser dono do código, ou precisa de um algoritmo ou regra que nenhum complemento implementaTudo bem, com cuidado
Um site de hashVocê está conferindo uma única string de testeNão para uma lista
Não aplicar hashSua plataforma aceita texto puro e sua política permiteLegítimo

O restante desta seção percorre cada um. As regras de normalização mais abaixo valem qualquer que seja a sua escolha – são elas que decidem a sua taxa de correspondência, e nenhum caminho te dispensa delas.


Caminho 1: um complemento que coloca as funções na planilha

É este o caminho a buscar, e o motivo é o argumento que esta página inteira faz. Produzir um digest é trivial. Normalizar a entrada corretamente é o que decide se o upload vai corresponder a alguém – e essa é justamente a etapa que um complemento pode fazer por você, por tipo de entrada, do mesmo jeito em todas as linhas.

O Hash Data divide o trabalho assim:

FunçãoO que faz
=HASHEMAIL(email, [algoritmo])Remove espaços, passa para minúsculas e então aplica o hash
=HASHPHONE(telefone, [algoritmo])Formata o número em E.164 e então aplica o hash – uma etapa em vez de encadear REGEXREPLACE dentro de um digest
=HASH(valor, [algoritmo])Aplica hash no valor exatamente como foi dado – sem normalização, diferencia maiúsculas

Quatro coisas que isso te dá em relação a um script feito à mão:

  • A normalização está na função, não em uma coluna auxiliar que você precisa reconstruir a cada nova planilha.
  • Sem o teto de 30 segundos das funções personalizadas para contornar – veja o Caminho 2 e por que isso pesa numa lista real.
  • Sua lista fica na planilha. Nada é colado em um site de terceiros.
  • SHA3-256 está disponível, o que o próprio computeDigest() do Apps Script não oferece.

Uma ressalva, dita com clareza, porque ela decide qual função usar. O =HASHPHONE() normaliza para E.164 – dígitos com um + na frente. Isso bate com o que o Google Ads documenta. O exemplo documentado da Meta vai no sentido oposto: só dígitos, sem +. Então, para um upload na Meta, normalize o número você mesmo com =REGEXREPLACE(A2, "[^0-9]", "") e aplique hash nessa string com =HASH(). Uma função não atende as duas plataformas porque as plataformas não concordam entre si – o mesmo ponto que a tabela comparativa mais abaixo faz.

O nível gratuito cobre 100 chamadas de hash por dia; o pago remove o limite.

Instalar o Hash Data pelo Google Workspace Marketplace


Caminho 2: escrever a função personalizada você mesmo

Se você prefere ser dono do código, é isto aqui, inteiro. Abra Extensões → Apps Script, cole o código, salve e use =SHA256(A2) na planilha.

/**
 * Retorna o digest SHA-256 da entrada em hexadecimal minusculo.
 * Aceita uma unica celula ou um intervalo.
 * @customfunction
 */
function SHA256(input) {
  if (Array.isArray(input)) {
    return input.map(function (row) {
      return row.map(function (cell) { return SHA256(cell); });
    });
  }

  if (input === '' || input === null || input === undefined) return '';

  var bytes = Utilities.computeDigest(
    Utilities.DigestAlgorithm.SHA_256,
    String(input),
    Utilities.Charset.UTF_8
  );

  return bytes
    .map(function (b) { return ((b < 0 ? b + 256 : b)).toString(16).padStart(2, '0'); })
    .join('');
}

Duas coisas derrubam as pessoas aqui, e vale entender ambas mesmo que você nunca escreva o script.

O computeDigest() devolve um array de bytes com sinal, não uma string hexadecimal. O Apps Script entrega bytes com sinal ao estilo Java, então qualquer valor acima de 0x7F chega negativo. É isso que o b < 0 ? b + 256 : b conserta. Sem ele, você obtém um digest cheio de caracteres - que nenhuma plataforma aceita. Sem o padStart(2, '0'), você perde silenciosamente zeros à esquerda de bytes individuais, produzindo um digest com menos de 64 caracteres, errado de um jeito muito difícil de enxergar.

Uma função personalizada precisa retornar em até 30 segundos, ou a célula mostra #ERROR!. Uma versão por célula – uma fórmula em cada linha – quebra numa lista de clientes real. É por isso que a função acima testa primeiro se recebeu um array: escrita assim, você pode colocar =SHA256(A2:A5000) em uma única célula e deixá-la devolver a coluna inteira como um array.


Caminho 3: um site de hash

Este é o caminho para pensar com mais cuidado, porque é o mais fácil de buscar e o único com um problema de divulgação.

Colar uma lista de clientes em um site é uma transferência de dados pessoais para quem opera aquele site. Em geral você não consegue saber pela página se o hash acontece no seu navegador ou no servidor deles, e a resposta importa enormemente. Para conferir uma única string de teste, tudo bem – há uma mais abaixo nesta página que você deveria usar. Para uma lista de clientes reais, não.


Caminho 4: não aplicar hash

A opção esquecida. O Google Ads aceita dados de clientes em texto puro e aplica o hash antes do upload, e o TikTok documenta que "accepts both hashed and original values."

Então, se o seu motivo para aplicar hash é uma política ou um contrato, o hash é a resposta. Se você presumiu que era obrigatório, muitas vezes não é – e aplicar hash previamente significa que você assume a normalização, e cada erro nela, em vez da plataforma. Vale saber antes de construir um pipeline em torno disso.


Depois: normalize, e normalize por plataforma

Esta é a parte que a maioria dos guias pula, e é a razão de as taxas de correspondência despencarem.

Google Ads

O Customer Match documenta, para colunas com hash: tudo em minúsculas, sem espaços, "Format phone numbers using the E.164 format" e – explicitamente – "Include the country code and '+' sign."

O Google documenta uma regra só para Gmail em dois lugares, e elas não são idênticas – o que vale saber antes de copiar uma delas para um pipeline.

A página do arquivo de dados do Customer Match diz apenas: "Remove all periods (.) that precede the domain name in gmail.com and googlemail.com email addresses." Pontos, nada mais.

A página da API do Customer Match vai além, mas sob um título restrito a conversões avançadas: remova os pontos do nome de usuário e o sinal de mais com tudo que vem depois. O exemplo resolvido dela é Jane.Doe+Shopping@googlemail.comjane.doe+shopping@googlemail.com (minúsculas) → janedoe@googlemail.com.

Ou seja, a metade do sufixo com mais está documentada para conversões avançadas, não para o upload de uma lista de clientes. Se você está montando uma lista de público, a regra dos pontos é a que o Google de fato documenta para esse trabalho. No que as duas concordam: isso se aplica apenas a gmail.com e googlemail.com. Aplicar a todos os domínios é um bug por si só – muitos sistemas de e-mail tratam jane.doe@ e janedoe@ como pessoas diferentes.

Meta

A Meta documenta outra coisa. Para e-mail: "Trim any leading and trailing spaces. Convert all characters to lowercase." Nenhuma regra de ponto do Gmail.

Para telefone: "Remove symbols, letters, and any leading zeros," mais "Always include the country code as part of your customers' phone numbers." O exemplo resolvido da própria Meta é (650)555-121216505551212 – código do país, só dígitos, sem sinal de mais.

Então o mesmo telefone produz dois hashes diferentes

Google AdsMeta
Telefone, documentadoE.164, "include the country code and '+' sign""Remove symbols… and any leading zeros"; exemplo → 16505551212
Pontos do Gmail e sufixo +Pontos removidos em gmail.com / googlemail.com; a regra do sufixo + está documentada para conversões avançadasNão documentado
Codificação"Use hex SHA256""HEX representations… using lowercase for A through F"

Uma coluna com hash não atende as duas plataformas. Se você vinha reaproveitando uma, essa é a sua taxa de correspondência.

O TikTok é a exceção

O TikTok documenta bem menos: "MD5 and SHA256 encryption is supported. The content of the file before encryption needs to be in all uppercase or lowercase." Nenhuma exigência de E.164 é publicada, e ele aceita tanto valores com hash quanto originais. Não presuma que as regras do Google valem lá.


As fórmulas, na ordem em que se aplicam

Normalize em uma coluna auxiliar, aplique hash na coluna auxiliar e depois fique só com o digest.

EtapaFórmula
E-mail, ambas as plataformas=LOWER(TRIM(A2))
Remover um espaço não separável que o TRIM() deixa passar=TRIM(SUBSTITUTE(A2, CHAR(160), " "))
Pontos do Gmail e sufixo +, só Google Ads – veja a ressalva de escopo acima (aplicado a B2, o e-mail em minúsculas)=IF(REGEXMATCH(B2, "@(gmail|googlemail)\.com$"), SUBSTITUTE(REGEXREPLACE(REGEXEXTRACT(B2, "^[^@]+"), "\+.*$", ""), ".", "") & REGEXEXTRACT(B2, "@.*$"), B2)
Telefone, só dígitos (Meta)=REGEXREPLACE(A2, "[^0-9]", "")
Telefone, E.164 (Google Ads)="+" & REGEXREPLACE(A2, "[^0-9]", ""), depois de ter certeza de que o código do país está presente

Essa última linha carrega uma ressalva que merece ser dita em voz alta: colocar um + na frente de um número nacional não cria um número E.164 válido. 07700 900461 vira +7700900461, que está errado e não vai corresponder. O código do país precisa estar realmente lá.


Os modos de falha, na ordem em que acontecem

  1. Sua planilha destrói os dados antes de você aplicar o hash. Um número de 16 dígitos vira notação científica, 07700 900461 perde o zero à esquerda, +44… é lido como fórmula. Formate a coluna como texto simples antes de qualquer coisa cair nela – consertar depois é perda de dados, não formatação.
  2. Maiúsculas e espaços. John@ e john@ são digests diferentes. Assim como john@x.com e john@x.com com um espaço no fim vindo de uma exportação CSV. E o TRIM() não remove um espaço não separável, que é exatamente o que uma colagem de página web deixa para trás.
  3. Aplicar hash no valor exibido. (650) 555-1212 não é 16505551212. Se a célula está formatada como telefone, o que você vê e o que você passa pelo hash são strings diferentes.
  4. Hash duplo. Rodar a fórmula sobre uma coluna que já contém hashes. Conferência fácil: um digest SHA-256 em hexadecimal tem sempre exatamente 64 caracteres de 0-9a-f, então =LEN(B2)=64 pega isso – e pega truncamento também.
  5. Codificação errada. Um digest em base64 é um hash válido da entrada certa e ainda assim não vai corresponder. Vários trechos populares de copiar e colar usam MD5 e base64 por padrão.

Verifique antes de enviar

A Meta publica o digest esperado para john_smith@gmail.com:

62a14e44f765419d10fea99367361a727c12365e2520f32218d505ed9aa0f62f

Aplique hash exatamente nessa string com a sua fórmula. Se você não obtiver exatamente esse valor de volta, conserte a fórmula – não a lista. Leva trinta segundos e é o único teste que distingue "meu hashing está quebrado" de "minha lista é ruim", coisas que de fora são indistinguíveis.


Uma palavra honesta sobre privacidade

Hashing é pseudonimização, não anonimização. O GDPR resolve isso no Considerando 26: "Personal data which have undergone pseudonymisation, which could be attributed to a natural person by the use of additional information should be considered to be information on an identifiable natural person." As diretrizes 01/2025 do EDPB sobre pseudonimização partem exatamente desse ponto.

Um hash de telefone sem salt é quebrável por força bruta – o espaço numérico é pequeno o bastante para ser esgotado. E você não pode adicionar salt, porque o salt é exatamente o que impede a plataforma de corresponder. Dados de clientes com hash continuam sendo dados de clientes. Trate-os assim.

Quando terminar: copie a coluna com hash, cole especial apenas como valores e apague a coluna bruta.


Tudo, em ordem

Qualquer que tenha sido o caminho, a sequência é a mesma:

  1. Formate a coluna como texto simples antes de os dados caírem nela.
  2. Normalize em uma coluna auxiliar, usando as regras da plataforma para a qual você vai enviar – não as da outra.
  3. Aplique hash na coluna auxiliar, SHA-256 hexadecimal, a menos que a plataforma diga outra coisa.
  4. Teste uma string conhecida contra o digest publicado pela Meta antes de confiar na coluna.
  5. Confira =LEN(B2)=64 em todo o intervalo para pegar truncamento e hash duplo.
  6. Cole especial apenas como valores, apague a coluna bruta e envie.

As etapas 2 e 3 são as que o Hash Data reduz a uma única função – =HASHEMAIL() para e-mail, =HASHPHONE() para telefones em E.164, =HASH() para qualquer coisa que você já normalizou. Ele suporta SHA256, MD5, SHA1, SHA512 e SHA3-256, e tudo roda dentro da sua planilha. O nível gratuito cobre 100 chamadas de hash por dia; o pago remove o limite.


Fontes

Especificações das plataformas verificadas em 20 de agosto de 2026. As plataformas de anúncios revisam essas páginas; confira a fonte antes de um upload grande.


Leitura relacionada