Análise de dados

Como remover espaços em branco no Google Sheets

ModelMonkey22 de maio de 20268 min de leitura

Esse é um problema específico de modelos financeiros porque os dados que entram na sua planilha geralmente não nasceram nela. Exportações de GL do TOTVS Protheus, extratos de centro de custo do SAP, importações de negócios do Salesforce ou RD Station: todos carregam espaços invisíveis que sobrevivem a um TRIM aplicado por cima.

Por que o TRIM do Google Sheets não remove todos os espaços ocultos

O modo de falha é traiçoeiro. Você tem códigos de centro de custo na aba DRE vindos de uma exportação do ERP e os mesmos códigos na aba Premissas digitados à mão. Visualmente, são idênticos. A fórmula retorna 0.

=SUMIFS('DRE'!D:D, 'DRE'!C:C, Premissas!$B$4)

O código do ERP é " 6100 " (com espaço à direita). A célula de Premissas tem "6100". O Sheets trata as duas como strings diferentes. Sem erro, sem aviso, apenas um zero silencioso que sobrevive até alguém na apresentação para o conselho perguntar por que a ponte de EBITDA não fecha.

A documentação oficial do Google Sheets afirma que TRIM "remove espaços do texto", mas o caractere 160 não é um espaço nessa definição. Ele não se enquadra na categoria de espaços que TRIM conhece.

Comparativo: o que cada função remove

FunçãoEspaços ASCII (char 32)Chars de controle (chars 0-31)Espaços não-quebráveis (char 160)
TRIMSimNãoNão
CLEANNãoSimNão
SUBSTITUTE(…, CHAR(160), " ")NãoNãoSim
Combinação das trêsSimSimSim

Para dados vindos de ERP ou colados de PDF, as três precisam ser usadas em conjunto.

Fórmula completa para limpar whitespace no Google Sheets

A correção opera em três camadas aplicadas de dentro para fora.

Camada 1: SUBSTITUTE com CHAR(160) converte espaços não-quebráveis em espaços ASCII normais antes de qualquer outra limpeza.

Camada 2: CLEAN remove caracteres de controle não imprimíveis (chars 0 a 31). Comuns em exportações do Oracle e versões mais antigas do SAP que embutem caracteres de quebra de linha dentro de células.

Camada 3: TRIM remove espaços ASCII no início, no fim e colapsa sequências internas.

A fórmula completa:

=TRIM(CLEAN(SUBSTITUTE('Dados Brutos'!B2, CHAR(160), " ")))

Aplique em uma aba dedicada "Chaves de Lookup" que o modelo referencia em vez de apontar direto para a aba de importação. Assim, os dados brutos ficam intactos para fins de auditoria e o modelo lê de uma camada intermediária já limpa.

Para uma coluna inteira de uma vez:

=ARRAYFORMULA(TRIM(CLEAN(SUBSTITUTE('Exportação ERP'!B2:B500, CHAR(160), " "))))

Cole isso na aba Chaves de Lookup na célula B2 e ela cobre todo o intervalo em uma única célula. Em maio de 2026, o ARRAYFORMULA trata essa combinação sem problemas no Google Sheets, sem necessidade de coluna auxiliar por linha.

Números armazenados como texto após a limpeza

Espaços ocultos não quebram só lookups. Quando uma receita entra como " 4200000 ", ela é uma string de texto. O SUMIFS a ignora completamente. Após remover os espaços, você ainda precisa forçar a conversão de tipo:

=VALUE(TRIM(CLEAN(SUBSTITUTE('Exportação ERP'!C2, CHAR(160), " "))))

Ou como array:

=ARRAYFORMULA(VALUE(TRIM(CLEAN(SUBSTITUTE('Exportação ERP'!C2:C500, CHAR(160), " ")))))

Você pode verificar se a correção funcionou sem inspecionar célula por célula: números formatados como texto alinham à esquerda, números reais alinham à direita. Se a sua coluna de receita de R$ 4,2 milhões ainda está alinhada à esquerda depois da limpeza, o trabalho não terminou.

Substituição in-loco com Apps Script

A abordagem com fórmulas funciona bem quando você controla a estrutura do modelo. Quando alguém entrega um arquivo bagunçado e você precisa limpar antes de construir em cima, uma substituição in-loco é mais rápida.

function trimAllWhitespace() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getUsedRange();
  const values = range.getValues();

  const cleaned = values.map(row =>
    row.map(cell => {
      if (typeof cell !== 'string') return cell; // deixa números intactos
      // Substitui espaços não-quebráveis, depois faz TRIM
      return cell.replace(/\u00A0/g, ' ').replace(/\s+/g, ' ').trim();
    })
  );

  range.setValues(cleaned);
}

Execute uma vez em Extensões > Apps Script > Executar. Trata o caractere 160 (que é \u00A0) e colapsa todos os espaços internos. Pula células numéricas para não converter seus valores de receita em texto acidentalmente.

O método getUsedRange() e setValues() utilizados acima fazem parte da API do SpreadsheetApp do Google Apps Script, que opera em lote sobre o intervalo inteiro, evitando chamadas célula a célula que seriam muito mais lentas.

Esse script processa uma planilha com 2.000 linhas em menos de 3 segundos. Para um dump de GL completo com 10.000 linhas ou mais, espere entre 8 e 12 segundos antes de o Sheets concluir a escrita.

Integrando ao modelo com múltiplas abas

O padrão mais organizado para um modelo que ingere dados externos regularmente: uma aba Dados para importações brutas, uma aba Chaves de Lookup que aplica a limpeza em três camadas, e todas as abas de DRE, Fluxo de Caixa e Retornos referenciando Chaves de Lookup.

='Chaves de Lookup'!$C$2:$C$500  ← referencia nomes de entidade já limpos

A fórmula SUMIFS da DRE então acessa a coluna limpa:

=SUMIFS('DRE'!$D:$D,
  'Chaves de Lookup'!$C:$C, Premissas!$B$12,
  'DRE'!$A:$A, ">=" & Premissas!$B$3,
  'DRE'!$A:$A, "<=" & Premissas!$B$4)

O SUMIFS nunca toca a exportação bruta diretamente. Se o formato do ERP mudar no próximo trimestre e introduzir novos caracteres indesejados, você corrige em uma fórmula na aba Chaves de Lookup e o resto do modelo herda a correção automaticamente.

Vale institucionalizar esse padrão em qualquer modelo que ingere dados externos com regularidade. Um pull ruim do ERP em um DCF de operação de crédito sindicalizado ou em um pacote trimestral para o board gera o tipo de erro que é constrangedor de explicar.

Quando usar REGEXREPLACE

Para padrões mais complexos - pontos finais após códigos de centro de custo, delimitadores mistos, capitalização inconsistente junto com espaços - o REGEXREPLACE é mais preciso que a combinação SUBSTITUTE/TRIM:

=REGEXREPLACE(TRIM(CLEAN(A2)), "\s{2,}", " ")

Isso trata qualquer sequência de espaço Unicode com mais de um caractere. O TRIM padrão só colapsa espaços ASCII, então se você está vendo lacunas fantasmas em nomes de entidades depois de um TRIM comum, vale tentar REGEXREPLACE com \s.

ModelMonkey para ingestão contínua de dados

A versão manual desse processo: exportar do ERP, colar no Sheets, rodar as fórmulas de limpeza, atualizar o modelo. São de 20 a 30 minutos por ciclo e é exatamente o tipo de tarefa que introduz erros de transcrição. O ModelMonkey consegue puxar dados diretamente de fontes como HubSpot e Stripe para a sua planilha com uma agenda de atualização automática, eliminando a etapa de exportação manual e permitindo que a fórmula de limpeza em três camadas opere direto sobre a coluna de ingestão.

Perguntas frequentes

O TRIM do Google Sheets remove espaços não-quebráveis? Não. O TRIM remove apenas o espaço ASCII padrão (caractere 32). Para espaços não-quebráveis (caractere 160), você precisa de SUBSTITUTE(texto, CHAR(160), " ") antes de aplicar o TRIM.

Por que meu VLOOKUP retorna #N/A mesmo com valores aparentemente iguais? Espaços invisíveis são a causa mais comum. Aplique =TRIM(CLEAN(SUBSTITUTE(A2, CHAR(160), " "))) nos valores de lookup e nos valores de referência. Se o problema persistir, verifique se há outros caracteres não imprimíveis com =CODE(LEFT(A2,1)) para inspecionar o primeiro caractere da célula.

Qual a diferença entre TRIM e CLEAN no Google Sheets? TRIM remove espaços em branco no início, no fim e sequências internas (apenas char 32). CLEAN remove caracteres de controle não imprimíveis (chars 0 a 31), como quebras de linha embutidas em células. Os dois resolvem problemas diferentes e se complementam na fórmula combinada.

Como verificar se uma célula contém espaços ocultos? Use =LEN(A2) e compare com =LEN(TRIM(A2)). Se os valores forem diferentes, há espaços ASCII extras. Para checar o caractere 160, use =LEN(A2) - LEN(SUBSTITUTE(A2, CHAR(160), "")). Qualquer resultado maior que zero confirma a presença de espaços não-quebráveis.

A fórmula de limpeza funciona com ARRAYFORMULA? Sim. Em maio de 2026, =ARRAYFORMULA(TRIM(CLEAN(SUBSTITUTE(B2:B500, CHAR(160), " ")))) funciona corretamente no Google Sheets e cobre o intervalo inteiro a partir de uma única célula.