quarta-feira, 15 de setembro de 2010

Texto para colunas no Google Spreadsheets - Parte 1

Tenho utilizado com uma certa frequência o pacote de aplicativos de Escritório (Office) do Google, o famoso Google Docs. Os fatores que me fazem gostar do pacote são:
  1. centraliza meus documentos em um só lugar,
  2. me dá a possibilidade de compartilhar meus documentos com quantas pessoas eu quiser,
  3. permite que as pessoas com acesso aos documentos colaborem na sua confecção, etc.
Não sou um hard user de suites de Escritório. Utilizo apenas para fazer trabalhos da faculdade e escrever pequenos textos. Justamente por esse motivo algumas das limitaçãos do pacote não me incomodam tanto.

Esse final de semana resolvi adiantar os trabalhos da faculdade e utilizei o Docs quase sem nenhum problema. Sim vocês acabaram de ler "quase". Não tive problema nenhum quanto na confecção de documentos tipo Word, que no pacote Google são chamados apenas de Documentos. Porém em um exercicio de lógica resolvi fazer um uso um tanto quanto incomum das planilhas (SpredSheet) do Docs.

O exercicio consistia em utilizar a tabela ASCI para converter a cadeia abaixo de bits (zeros e uns) em uma frase intelegível por humanos.

01000101.01110011.01110100.01110101.01100100.01100001.01110010.00000000.01101100.10100010.01100111.01101001.01100011.01100001.00000000.10000010.00000000.01101100.01100101.01100111.01100001.01101100.0010000

Ah existiam N maneiras de escamotear esse exercício. Seriam poucas linhas em Perl. Em Python não precisaria nem de arquivo seria só utilizar o shell interativo. Ex:




Mas a maneira mais rápida "parecia" ser utilizar o uma planilha de Excel. Os passos seriam:
  1. Colar os bits na celula A1 do Excel.
  2. Utilizar a função texto para colunas para isolar cada segmento delimitado por ponto em uma coluna.
  3. Utilizar a formula =bin2dec(A1) na célula A2 ctrl+c ctrl+v nas outras colunas da linha 2
  4. Utilizar a formula =caract(A2) na célula A3 ctrl+c ctrl+v nas outras colunas da linha 3
Dessa forma teríamos a primeira linha com os binários, a segunda com suas representações decimais e a terceira com a conversão dos decimais para o ASCII.

Então eu leria a terceira linha e colaria na area de respostas da questão.

Simples e bem mais rápido do fazer 23 conversões de binário para decimal na munheca e depois consultar 23 vezes. É claro que fazendo 23 conversões e 23 consultas os objetivos pedagógicos seriam efetivamente alcançados, mas eu quero mais é que o meu P#@$ cresça.

Qual foi primeira dificuldade encontrada? Adivinha? Eu simplesmente não tinha Excel instalado na máquina. Pensei Excel de c# é r#l@ vou mandar o "Gato" utilizando a planilha do Docs. Fácil hein ! Vamos ao check:
  • Passo 1 - Colar o bagulho na coluna A1 - OK
  • Passo 2 - Texto para colunas - Eeeeepa!
Caraca cadê o função de texto para colunas nas planilhas dos Docs?
-Mãaaaaaaaaaae !!! Cadê a função de texto pra colunas do Docs!
Cri-cri-cri...(onomatopéia de grilo).

É senhores! Acreditem! Non Ecziste! E agora? Agora fu#eu. Minha abordagem foi invibializada no segundo passo. Mas como assim?... uma coisa básica e tão útil, um simples texto para colunas!

Agora é a hora de abrir a mente procurar caminhos alternativos. Quais são as opções?
  1. Copiar e colar cada um dos 23 dos segmentos de 8 bits em uma coluna e seguir para os seguintes passos.
  2. Substituir os <.> (pontos) que separam os segmentos de 8 bits por pois esse caracter a planilha reconhece automáticamente como delimitador já colaria cada segmento em uma coluna.
  3. Etc..
Enquanto analisava as alternativas, eu fuçava os menus pois não me conformava com não exitência de funcionalidade tão banal. Fuçando então encontrei dentro do menu Ferramentas o submenu Script. Aí minha cabeça explodiu. Descobri que era possível programar no Docs macros de maneira bem semelhante ao que se faz com Excel da Microsoft no Desktop. Não tive mais dúvidas. Vou criar minha própria função de texto pra colunas. Dessa vez eu entro para história.

Agora minha lista estava assim:
  1. Copiar e colar cada um dos 23 dos segmentos... solução trabalhosa mas que funcionará. Não quero.
  2. Substituir os <.> (pontos) que separam... solução mais rápida e inteligente e que funcionará . Não quero.
  3. Criar uma funcionalidade de texto para colunas na ferramanta... solução mais demorada com grande probabilidade de falhar ou ser abortada devido a dificuldade apresentada. - Minha campeã.
É camaradas, inconformado com a ausência da funcionalidade me embui do desafio e comecei a ler a documentção e a API de script do Docs.

Umas 3 horas depois a primeira versão da função TextoParaColunas estava pronta, e eu pude terminar meu trabalho utilizando ela. Mas apesar de funcional ela tinha algumas limitações:
  1. Funcionava apenas para uma linha, enquanto que a função original do excel funciona para quantas linhas forem selecionadas.
  2. O separadaor só poderia ser ponto pois estava hardcoded.
  3. Necessitava que o usuário entrasse no Script Manager para executar a função.
3 horas depois das 3 horas anteriores... todas as limitações estvam sanadas e agora realmente existia um "Texto para colunas" do qual eu poderia me orgulhar. Ficou tão jeitosinho que tomei até coragem para publicar o script na Script Galery, para que qualquer pessoa que sinta falta dessa funcionalidade possa inserir e utilizar em suas planilhas.

Aqui vai o caminho das pedras para quem quiser dar uma bisbilhotada no código ou simplesmente utilizar a funcionalidade.
  1. Abra o docs e crie uma nova planilha ou abra uma planilha existente.
  2. Na planilha já aberta acesse o menu ferramentas >> script >> inserir. Surgirá o Script Galery.
  3. Digite "Texto para colunas" na caixa de pesquisas e clique em pesquisar.
  4. Selecione o script que aparece com o meu e-mail: glauco.$%$ˆ@gmail.&ˆˆ) e clique em inserir.



Pronto está instalado. Deverá surgir um menu novo na sua Spredsheet chamado Dados.



A operação é bem simplificada em relação ao MS Excel, mas isso eu explicarei em outro post.

Espero que tenham gostado.