Недавно я пытался перекинуть свои контакты из старого Блекберри в телефон с Андроидом и меня постигла неудача - оказалось не существует инструментов для корректного преобразования одного формата в другой.

Тогда я решил преобразовать мои контакты, полученные из старого телефона, в таблицу excel, и с помощью несложного скрипта в VBA преобразовать её файл вида .vcf, который можно скормить любому современному телефону.

Таблица у меня получилась такого вида:

Пример таблицы excel с контактами
Пример таблицы excel с контактами
Public Sub vcard()

 Dim a(), i&, ii&, t
 Dim b As String, OutDir As String
 Dim fso As Object 'FileSystemObject
 Dim txt As Object 'TextStream
 
    a = [a1].CurrentRegion.Value
    b = "" ' Переменная, в которую мы будем собирать информацию в формате .vcf
        
    For i = 2 To UBound(a)
    
        b = b & "BEGIN:VCARD" & vbNewLine & "VERSION:2.1" & vbNewLine
        b = b & "FN:" & Cells(i, 1).Text & vbNewLine
        
        If Cells(i, 2).Text <> "" Then b = b & "EMAIL:" & Cells(i, 2).Text & vbNewLine
        If Cells(i, 3).Text <> "" Then b = b & "ADR:" & Cells(i, 3).Text & ", " & Cells(i, 4).Text & vbNewLine
        If Cells(i, 5).Text <> "" Then b = b & "TEL;HOME:" & Cells(i, 5).Text & vbNewLine
        If Cells(i, 6).Text <> "" Then b = b & "TEL;CELL;PREF:" & Cells(i, 6).Text & vbNewLine
        If Cells(i, 7).Text <> "" Then b = b & "TEL;WORK:" & Cells(i, 7).Text & vbNewLine
        If Cells(i, 8).Text <> "" Then b = b & "ORG:" & Cells(i, 8).Text & vbNewLine
        If Cells(i, 9).Text <> "" Then b = b & "TITLE:" & Cells(i, 9).Text & vbNewLine
        If Cells(i, 10).Text <> "" Then b = b & "NOTE:" & Cells(i, 10).Text & vbNewLine

        b = b & "END:VCARD" & vbNewLine
        
    Next


OutDir = "C:\out\" 'Папка, в которую сохраним полученный файл

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txt = fso.CreateTextFile(OutDir & "out.vcf", 1, 1) 'Последний параметр - Unicode
     
    txt.WriteLine b
 
    txt.Close


End Sub

Код перебирает строки и ячейки и если находит информацию в соответствующих ячейках создаёт соответствующую строчку в файле .vcf.

Вы можете сформировать другую табличку в excel и немого скорректировав скрипт сможете собрать свой файл .vcf.

Ничего сложного, но может кому-то понадобится.

P.S. для информации напоминаю структуру файла .vcf.

Начинаться контакт должен строками:
"BEGIN:VCARD"
"VERSION:2.1"

Далее идут ключи (они могут отсутствовать, тогда просто информации в соответствующих ячейках не будет)

"FN:" - название контакта
"EMAIL:" - электронная почта
"ADR:" - адресс
"TEL;HOME:" - домашний телефон
"TEL;CELL;PREF:" - сотовый телефон
"TEL;WORK:" - рабочий телефон
"ORG:" - название организации
"TITLE:" - должность
"NOTE:" - заметка

Контакт должен завершаться строчкой:
"END:VCARD"

В одном файле .vcf может быть сколь угодно много контактов, идущих друг за другом.

Комментарии (12)


  1. mixsture
    11.11.2023 23:41

    Предложу разделить читающую часть и записывающую на разные процедуры. Тогда адаптация скрипта к новому файлу будет состоять из редактирования только читающей процедуры.

    Если двигаться дальше, то из читающей части я бы вынес информацию о расположении колонок в "настройки", а из пишущей части - путь к папке сохранения в них же. Тогда при адаптации можно ограничиться лишь исправлением этих настроек, не трогая основной код.


    1. Kutush Автор
      11.11.2023 23:41

      Да, спасибо, скрипт конечно можно усовершенствовать, но он станет сложней. Я стремился сделать самый простой скрипт, который может использовать любой пользователь excel. Мне кажется, в таком виде он наиболее понятен, а если что не так - любой пользователь сможет его скорректировать.

      Тут я считаю играет связка excel - скрипт. Сначала подготавливаем данные в том виде, который нужно, средствами excel, затем делаем файл .vcf с помощью наиболее простого скрипта.


  1. mixsture
    11.11.2023 23:41
    +1

    И с очисткой данных тут тоже стоит поработать. Формат записи явно использует двоеточие и точку с запятой как разделители и, если встретит их внутри данных (например, в адресе), то врятли выйдет корректный файл на выходе.
    Вероятно, их как-то можно экранировать или хотя бы заменять на неопасные символы.


    1. Kutush Автор
      11.11.2023 23:41

      Очистку данных я предлагаю делать в excel самостоятельно - там достаточно богатый инструментарий, который может использовать любой офисный работник.


  1. Z55
    11.11.2023 23:41
    +3

    Если честно, не очень понятно зачем?

    Поясню. У вас уже есть excel-файл с контактами. Гугл, с радостью импортирует к себе csv файл с контактами и при очередной синхронизации доставит контакты в телефон. Без лишних скриптов.


    1. Kutush Автор
      11.11.2023 23:41

      Я конечно пробовал. ) Импортирует не корректно. Пришлось разбираться с структуре файла .vcf и писать скрипт.


      1. Z55
        11.11.2023 23:41

        Всё там отлично. А если непонятна структура csv, нужно просто экспортировать текущие контакты там же и посмотреть, как должен выглядеть файл. Работает отлично, проверено не однократно.


        1. Kutush Автор
          11.11.2023 23:41

          Но у меня не получилось... Часть данных терялось, часть искажалась.

          Я импортировал контакты выгруженные из какой-то утилиты для Блекберри... Это не то же самое, что перекидывать контакты из старого телефона с Андроидом на новый Айфон. Проблемы были... И проблемы такие встречаются у людей - им поможет подобный скрипт (я надеюсь )))


  1. Merrynose
    11.11.2023 23:41
    +2

    Есть значительно более простой путь:

    1. Сохраняете свою эксель-табличку как CSV

    2. Открываете сайт contacts.google.com

    3. Через пункт меню "Импортировать" импортируете ваш CSV

    4. Profit


    1. Kutush Автор
      11.11.2023 23:41

      У меня импортировалось некорректно, пока я лично не сделал скрипт (разобравшись при этом в структуре файла .vcf) как я описал в статье.

      Ясное дело, что я пробовал очевидные способы и потерпел крах )))

      Зачем бы я начал писать свой скрипт, если бы работал импорт контактов. )

      Надо понимать, что гугл импортирует табличку определённой структуры. Если к примеру попробовать вставить в него табличку в том виде, в котором я её в статье привёл в качестве примера, он половину информации игнорирует, часть сохраняет некорректно и тп.


      1. Merrynose
        11.11.2023 23:41

        Не готов ставить диагноз именно вашей табличке (возможно ему пробелы в названиях столбцов не нравится или ещё что), но я неоднократно использовал этот способ и все нормально импортировалось.


  1. CrashLogger
    11.11.2023 23:41

    Флэшбеки из прошлого ) Я такое писал на Delphi 20 лет назад.