Cookies para estatística e publicidade
Usamos cookies de estatística e de publicidade, ambos enviados ao Google. Recusar não muda nada do que você vê.Ler a página de privacidade
Aqui você converte ICS para CSV de graça e sem conta: solte o arquivo acima e em poucos segundos o resultado está pronto para baixar. A conversão acontece dentro do seu próprio navegador, então o arquivo nunca é enviado. Funciona igual no Windows, no macOS e no Linux e também no iPhone e no Android, e continua funcionando mesmo se você cortar a conexão.
Até 100 arquivos de uma vez. Formatos misturados não são problema.
Eles são convertidos um após o outro e baixados juntos em um ZIP.
ICS para CSV
Um aplicativo de calendário é feito para olhar para frente, e é fraco para olhar para trás em conjunto. Quantas horas foram para um cliente no trimestre passado. Qual reunião recorrente cresceu discretamente para catorze pessoas. Quanto de uma semana já está ocupado antes de alguém marcar qualquer coisa. Se uma sala foi usada nos dias em que estava reservada. Nenhuma dessas perguntas é uma visão dentro do calendário, e todas são uma tabela dinâmica.
Então o export existe para ser contado. Essa moldura importa porque decide o que esta conversão não consegue fazer é sério: perder a cor de um evento não é nada; perder o fato de que um evento se repetia é tudo. As próximas duas seções são sobre isso.
É a parte a ler antes de confiar em qualquer total. No formato de calendário, uma série recorrente é guardada como um único evento carregando uma regra de recorrência — a reunião diária do último ano é um único `VEVENT` com um `RRULE` dizendo semanal em dias úteis até uma data, mais talvez algumas adições `RDATE` e exceções `EXDATE` para os dias em que foi cancelada.
As colunas geradas aqui são as próprias propriedades do evento: resumo, início, fim, local, descrição, organizador, status, identificador e participantes. `RRULE`, `RDATE` e `EXDATE` não estão entre elas, então a série contribui com exatamente uma linha, mostrando os horários da primeira ocorrência. Um trimestre de reuniões diárias vira uma linha de trinta minutos. Qualquer soma da coluna de duração fica errada pela diferença de quanto os eventos recorrentes realmente consumiram, que na maioria das agendas de trabalho é a maior parte do tempo.
A correção é rio acima, e é mais fácil do que parece. Tanto o Google Agenda quanto o Outlook, quando pedidos para exportar ou imprimir um intervalo de datas em vez de um calendário inteiro, geram as ocorrências individuais em vez da regra — então exportar «este trimestre» dá um arquivo em que cada reunião diária é seu próprio `VEVENT`, e cada uma vira uma linha.
Onde isso não está disponível, expansão é trabalho de script, não de planilha: o `icalendar` do Python com `dateutil.rrule`, ou o pacote `ical-expander` para Node, percorrem uma série entre duas datas e produzem as ocorrências. De qualquer forma, faça a expansão enquanto o arquivo ainda é um ICS. Depois que virar tabela, a regra desapareceu e nada consegue reconstruí-la, porque a tabela nunca a carregou.
Em ordem: `summary`, `start`, `end`, `location`, `description`, `organizer`, `status`, `uid`, `attendees`. Todo evento produz uma linha com as nove, vazia onde o evento não tinha aquela propriedade, então a tabela fica retangular independente de quão desigual for a origem.
Duas colunas merecem atenção. `status` distingue eventos confirmados, provisórios e cancelados, e os cancelados ainda geram linhas — filtre-os antes de contar, ou uma oficina cancelada de um dia inteiro vai entrar na conta como tempo gasto. E `uid` é um identificador estável atribuído pelo calendário, o único jeito confiável de remover duplicatas quando dois exports se sobrepõem.
Os horários são reescritos da forma compacta do calendário para ISO 8601, então `20260301T080000Z` vira `2026-03-01T08:00:00Z`, que toda planilha reconhece. O que não é feito é qualquer conversão entre fusos.
Um valor escrito em UTC mantém seu Z no final. Um valor qualificado por um parâmetro `TZID` — `DTSTART;TZID=America/Sao_Paulo:20260301T080000` — é local a esse fuso, e é escrito como `2026-03-01T08:00:00` sem Z e sem deslocamento. Convertê-lo exigiria um banco de dados de fusos horários, e assumir UTC deslocaria cada compromisso em uma hora ou mais. O resultado é uma coluna onde algumas células declaram seu fuso e outras não. Se você está somando durações, isso é inofensivo, já que início e fim compartilham fuso. Se está comparando horários entre uma equipe distribuída, não é, e o fuso tem de vir do arquivo original.
Um evento de dia inteiro é escrito com valores de data, não de horário, e converte para um simples `2026-03-01` nas colunas de início e fim, sem parte de horário. Isso é inequívoco e ordena corretamente, o que já é mais do que se pode dizer da maioria do tratamento de datas.
A pegadinha está no formato, não na conversão: para um valor de data, o fim é exclusivo. Um evento de um dia no dia 3 é armazenado começando no dia 3 e terminando no dia 4, e uma oficina de três dias a partir do dia 3 termina no dia 6. Subtraia um dia antes de relatar um intervalo de datas a uma pessoa, e cuidado com qualquer fórmula que calcule duração — a aritmética está certa para o formato e errada para a frase que alguém vai escrever a partir dela.
O formato de calendário permite que um evento declare um início e uma duração em vez de um início e um fim, e alguns programas usam essa forma para tudo. Só a propriedade de fim é mapeada para uma coluna, então esses eventos chegam com início preenchido e fim vazio.
É silencioso, não destrutivo, e é bem fácil de passar despercebido numa tabela grande, porque células vazias parecem dado opcional. Se a coluna de fim está esparsa, é esse o motivo — ordene por ela e veja se os vazios se concentram numa origem só. Recuperar o valor significa voltar ao ICS e ler a propriedade de duração, tarefa para script, não para planilha.
Um convite guarda um participante como endereço no valor e um nome de exibição num parâmetro. A metade legível é a que fica, então a célula traz «Ana Souza» onde o convite carregava um nome comum e `[email protected]` onde não carregava. Vários participantes são juntados com ponto e vírgula e espaço numa célula só. O organizador é tratado do mesmo jeito, na própria coluna.
É uma escolha deliberada em vez de inventar `participante1` até `participante9`, que truncaria o décimo e deixaria nove colunas quase vazias para todo mundo. Contar participantes vira então uma fórmula sobre a célula, não uma contagem de colunas. Separar a célula em linhas é um passo de Power Query ou um script de duas linhas, se você precisar de uma linha por pessoa.
O formato de calendário carrega mais do que compromissos. Tarefas são `VTODO`, entradas de diário são `VJOURNAL`, blocos de disponibilidade são `VFREEBUSY`, e alarmes ficam dentro dos eventos como `VALARM`. Só `VEVENT` é lido aqui.
Um arquivo que só tem tarefas para, então, com «Nenhum evento de calendário foi encontrado neste arquivo», o que é preciso, não uma falha — um export de um aplicativo de lembretes não é um calendário de eventos, mesmo compartilhando a extensão. Alarmes, anexos e status de resposta por participante são descartados dos eventos que são lidos, pelo mesmo motivo da recorrência: uma tabela não tem forma para eles.
Importe em vez de abrir direto. No Excel, Dados e depois De Texto/CSV, e defina as colunas de início e fim como Texto na entrada, a menos que você queira que o Excel reinterprete — a análise de data dele vai remover o deslocamento sem pedir licença, reformatar segundo o idioma da máquina, e transformar uma string ISO em algo que não ordena mais como texto. A coluna do identificador também deve ser Texto.
Descrições são a outra coisa a vigiar. Descrições de reunião rotineiramente têm vírgulas, aspas e quebras de linha de verdade — uma pauta colada, um bloco de número de discagem — e as três são tratadas envolvendo o valor em aspas com aspas internas duplicadas, a convenção RFC 4180 que todo importador competente lê. Uma quebra ingênua por vírgulas num pipeline de shell não vai funcionar; use um leitor de CSV de verdade ou converta para TSV.
| ICS | CSV | |
|---|---|---|
| Nome completo | iCalendar | Comma-Separated Values |
| Extensão do arquivo | .ics, .ical | .csv |
| Tipo de mídia | text/calendar | text/csv |
| Publicado pela primeira vez | 1998 | 1972 |
| Especificação | RFC 5545 | RFC 4180 |
| Licença | Padrão aberto | Padrão aberto |
| Situação hoje | Atual | Atual |
| Abre no navegador | Nenhum navegador | Nenhum navegador |
| Considerado no lugar | — | XLSX, JSON, Parquet |
Os programas de sempre não se cruzam: ICS abre em Google Calendar, Apple Calendar e Microsoft Outlook, e CSV em Microsoft Excel, LibreOffice Calc e pandas, então quem receber o resultado precisa de algum do segundo grupo.
ICS foi publicado em 1998. Está descrito em RFC 5545, e vale conhecer se o arquivo precisa sobreviver à ferramenta que o escreveu.
CSV e de 1972, descrito em RFC 4180. Microsoft Excel, LibreOffice Calc e pandas leem o formato.
CSV foi publicado em 1972 e ICS em 1998. O mais antigo costuma ser o arquivo mais seguro para entregar; o mais novo faz o mesmo com menos bytes.
Não. Esta conversão acontece inteiramente no seu navegador, então o arquivo não sai do seu aparelho. Você mesmo pode conferir: abra a aba de rede das ferramentas de desenvolvedor e converta alguma coisa. Você verá a própria página e as requisições de estatística e de publicidade com que este serviço é pago, e nenhuma que leve o seu arquivo.
É. Sem conta, sem marca d’água e sem cota diária para gastar: roda no seu próprio aparelho, então você pode voltar quantas vezes quiser. O navegador processa arquivos de até 100 MB, 100 por vez.
ICS e CSV descrevem o conteúdo de maneiras radicalmente diferentes. A conversão é, portanto, uma reconstrução e não uma cópia: fiel, mas não idêntica byte a byte. Campos repetidos — vários telefones, vários participantes — são juntados numa célula em vez de espalhados por colunas inventadas. Regras de repetição, alarmes e anexos não têm lugar numa tabela e ficam de fora.
Para a conversão, não: ela acontece no navegador que você já tem aberto. Para abrir o resultado você precisa depois do programa com que o seu aparelho normalmente exibe Comma-Separated Values.