{"id":26795839,"url":"https://github.com/protw/obsidian_py","last_synced_at":"2026-05-03T19:31:36.558Z","repository":{"id":285005578,"uuid":"953061578","full_name":"protw/obsidian_py","owner":"protw","description":"Конвертація таблиць Google Sheets, отриманих через заповнення Google Forms, у нотатки Obsidian // Convert Google Sheets from Google Forms to Obsidian Notes","archived":false,"fork":false,"pushed_at":"2025-04-15T17:12:21.000Z","size":307,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-15T17:46:37.051Z","etag":null,"topics":["obsidian","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/protw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-22T13:36:19.000Z","updated_at":"2025-04-15T17:12:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"1351da60-0d04-46fa-bf1f-fed079286e94","html_url":"https://github.com/protw/obsidian_py","commit_stats":null,"previous_names":["protw/obsidian_py"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/protw/obsidian_py","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protw%2Fobsidian_py","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protw%2Fobsidian_py/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protw%2Fobsidian_py/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protw%2Fobsidian_py/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/protw","download_url":"https://codeload.github.com/protw/obsidian_py/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protw%2Fobsidian_py/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32582494,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["obsidian","python"],"created_at":"2025-03-29T18:16:06.906Z","updated_at":"2026-05-03T19:31:36.550Z","avatar_url":"https://github.com/protw.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Від Google Forms до нотаток Obsidian\n\n2025-03-30, [версія статті на Medium](https://medium.com/p/55d4b57a92b4)\n\n![Загальний алгоритм GS2NOTES](doc/Загальний_алгоритм_GS2NOTES.png)\n\n### Зміст\n\n- [Вступ: постановка задачі](#вступ-постановка-задачі)\n- [Автоматизоване завантаження таблиць Google Sheets](#автоматизоване-завантаження-таблиць-google-sheets)\n- [Зв'язок між полями таблиці і властивостями нотаток](#зв'язок-між-полями-таблиці-і-властивостями-нотаток)\n- [Загальний алгоритм конвертації таблиці до нотаток](#загальний-алгоритм-конвертації-таблиці-до-нотаток)\n- [Порядок підготовки власного робочого простору](#порядок-підготовки-власного-робочого-простору)\n  - [1. Підготовка файлової структури на локальному комп'ютері](#1-підготовка-файлової-структури-на-локальному-комп'ютері)\n  - [2. Встановлення синхронізації з Google Drive](#2-встановлення-синхронізації-з-google-drive)\n  - [3. Налаштування Jupyter Notebook](#3-налаштування-jupyter-notebook)\n  - [4. Налаштування запуску на локальному комп'ютері](#4-налаштування-запуску-на-локальному-комп'ютері)\n  - [5. Налаштування Google Forms](#5-налаштування-google-forms)\n- [Запуск застосунку](#запуск-застосунку)\n\n### Вступ: постановка задачі\n\nІдея цієї розробки стала наслідком взаємодії [Національного Контактного Пункту (НКП)](https://uhsp.edu.ua/2024/12/09/na-bazi-ugsp-tryvaye-robota-naczionalnogo-kontaktnogo-punktu-nova-yevropejska-inicziatyva-baugauz-dajdzhest-podij-lystopada/) New European Bauhaus (NEB) на базі Університету Григорія Сковороди у Переяславі (УГСП) з командою [Національного Екологічного Центру України (НЕЦУ)](https://necu.org.ua/). \n\nПроблема, що постала перед НКП, полягала у необхідності збору і опрацювання великого обсягу інформації про наявні конкурси, потенційних заявників і партнерів, а також про проєктні ідеї. Складність завдання сама по собі ще посилювалась обмеженістю людського ресурсу НКП.\n\nНа цьому тлі НЕЦУ запропонував ідею створення робочого простору НКП NEB з використанням інструменту [Obsiidan](https://obsidian.md/). Запропоноване рішення мало вирішити такі проблеми:\n\n- започаткувати системний підхід в допомозі українським учасникам щодо формування проєктних заявок на євпропейські грантові конкурси\n- систематизувати інформацію про європейських та українських партнерів і консорціуми, програми і конкурси, зокрема, в програмі НЄБ Горизонт Європа, але не обмежуючись останньою.\n- сприяти утворенню і підтримці мережевої взаємодії заявників.\n\nЗгодом було вирішено побудувати систему технічну реалізацію запропонованої ідеї на сполучені:\n\n- Google Forms для збирання структурованої інформації від потенційних заявників,\n- Obsidian для зберігання та аналізу зібраної інформації з подальшим плануванням і реалізацією заходів підтримки заявників у процесах пошуку партнерів і підготовки заявок.\n- Застосунок з конвертації даних з Google Forms у формат Obsidian.\n\nЗагальна блок-схема представлена на рисунку вище.\n\nНижче описані такі технічні аспекти реалізації:\n\n- Автоматизоване завантаження даних з таблиць відповідей Google Forms.\n- Зв'язок між полями таблиці і властивостями нотаток Obsidian.\n- Алгоритм конвертації таблиці відповідей Google Forms до нотаток Obsidian.\n- Запуск застосунку.\n\n### Автоматизоване завантаження таблиць Google Sheets\n\nПрограмне завантаження (тобто без необхідності взаємодії з користувачем) таблиць Google Sheets вимагатиме передачу застосунку певних закритих реквізитів безпеки. Задача тут полягає в тому, щоб ці реквізити перебували у захищеному недоступному для сторонніх місці.\n\nОтже, розпочнімо з питання активації Google Sheets API та Google Drive API. Покрокова процедура активації винесена в окремий [документ](doc/Активація_GSheets_та_GDrive_API.md), щоб не відволікатися тут від основного викладення.\n\nВ результаті проведення цієї процедури буде утворений файл облікових даних сервісного акаунту Google Drive. Ви назвете цей файл **`credentials.json`** і розмістите у фолдері `obsidian_py/` поруч з фолдером вашого сховища даних Obsidian. Наприкінці цього тексту я опишу [порядок підготовки вашого робочого простору](#Порядок підготовки власного робочого простору), з якого буде чітко зрозуміло що і куди класти.\n\nПриклад файлу облікових даних сервісного акаунту можна глянути в репозитарії застосунку на Github - [credentials_example.json](https://github.com/protw/obsidian_py/blob/master/credentials_example.json). Якщо вам цікаво розібратися зі структурою, то ви можете глянути окремий документ -  [Зміст файлу credentials.json.md](doc/Зміст_файлу_credentials.json.md).\n\n**⚠️ Важливий момент**\n\nУ таблиці Google Sheets:\n\n1. Відкрий таблицю.\n2. Поділися нею через: **`your-service-account@your-project-id.iam.gserviceaccount.com`**.\n3. Дай права **Редагування** або **Перегляд**.\n\nПовний текст автоматизованого завантаження таблиці Google Sheets можна глянути у методі [`read_gs_table`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L106).\n\n\u003cu\u003eПідсумок\u003c/u\u003e: що класно в цьому способі: ✅ Автоматично працює без браузера. ✅ Немає потреби логінитися вручну. ✅ Один акаунт може отримувати доступ до кількох таблиць. ✅ Токен оновлюється автоматично.\n\n### Зв'язок між полями таблиці і властивостями нотаток\n\nВ результаті конвертування таблиці Google Sheets відповідей Google Forms у нотатки Obsidian поля форми будуть перетворені або у властивості нотатки або у підрозділи тексту нотатки. Також деякі поля можуть потребувати певної обробки.\n\nНеобхідний формалізований опис зв'язків між полями форми (таблиці), з одного боку, і властивостями та підрозділами нотаток, з іншого, складений у файлі [`config.yml`](config.yml).\n\nКлючі (елементи) верхнього рівня у цьому файлі, а саме: **`[teams, orgs, persons, proj]`** означають тип вхідної таблиці і відповідних нотаток Obsidian типу **Команди**, **Організації**, **Персони** та **Проєктні ідеї**, відповідно.\n\nКожний із цих ключів вернього рівня містить однакову [структуру даних](https://gist.github.com/protw/cc816fbcb5820e6ec5f2bf4f1940ad8b) з таким призначенням елементів:\n\n| Ключ               | Призначення                                                  |\n| ------------------ | ------------------------------------------------------------ |\n| **`subdir`**       | Субфолдер Obsidian-сховища, де зберігаються нотатки цього типу |\n| **`name`**         | Ім'я файлу таблиці Google Sheets відповідей Google Forms     |\n| **`cols`**         | Назви всіх полів Google Forms (і, відповідно, стовпчиків таблиці Google Sheets) |\n| **`frontmatter`**  | Назви полів Google Forms, що підуть як властивості до фронтматерії нотаток Obsidian |\n| **`sections`**     | Назви полів Google Forms, що підуть як заголовки до нотаток Obsidian |\n| **`not_required`** | Список необов'язкових полів Google Forms (поки що не використовується) |\n| **`pers_name`**    | Список полів Google Forms, що будуть перетворені перед розміщенням у нотатки з допомогою метода [`pib2ip`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L205) |\n| **`linked`**       | Список полів Google Forms, що будуть перетворені як внутрішні посилання Obsidian перед розміщенням у нотатки з допомогою метода [`make_linked`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L219) |\n| **`label_refs`**   | Зв'язування назви властивості нотатки Obsidian (ключ) з назвою поля Google Forms (значення). Відповідне значення поля Google Forms передається у значення властивості нотатки Obsidian |\n| **`label_vals`**   | У значення властивості нотатки Obsidian (ключ) передається значення ключа із цього файлу або це значення використовується для певного перетоврення |\n\n### Загальний алгоритм конвертації таблиці до нотаток\n\nПроцедура конвертації таблиці у нотатки повністю описана класом `GS2ON_Convertor` у модулі `gs2note.py` і розділена на два етапи: перший – під час ініціації (метод [`__init__`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L38)) і другий – у методі [`main`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L315).\n\nНа першому етапі проводяться [такі дії](https://gist.github.com/protw/d084f60824c8deaad72237ddb0b0d923):\n\n| Метод                                                        | Дії                                                          |\n| ------------------------------------------------------------ | ------------------------------------------------------------ |\n| [check_dupl_in_vault](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L68) | Перевірка дублікатів назв нотаток у сховищі Обсідіан         |\n| [read_yaml_config](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L93) | Зчитування двох конфігураційних файлів [`config.yml`](config.yml) та [`config_gs.yml`](config_gs_example.yml) (⚠️) і створення спільного конфігураційного словника `conf` |\n\n⚠️ Примітка: тут зазначене посилання на приклад, ви маєте створити під цим же іменем і за цією ж структурою свій конфіденційний файл.\n\nНа другому етапі проводиться довший [перелік дій](https://gist.github.com/protw/362071e52c4667b50343d0ce3ae0e7b9):\n\n| Метод                                                        | Дії                                                          |\n| ------------------------------------------------------------ | ------------------------------------------------------------ |\n| [`read_gs_table(table)`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L106) | Зчитуємо вхідні дані з таблиці Google Forms заданого типу `table` і опис її конвертування до Obsidian |\n| [`check_table_struct`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L147) | Валідація структури вхідної таблиці Google Forms і словника з описом конвертування цієї таблиці до Obsidian |\n| [`pib2ip`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L205) | Перетворення значень стовпчиків зі списку `pers_name` з вхідного датафрейму: \"Прізвище Ім'я По-батькові\" -\u003e \"Ім'я Прізвище\" |\n| [`make_linked`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L219) | Перетворення значень стовпчиків зі списку `linked` з вхідного датафрейму у внутрішнє Obsidian-посилання: `name -\u003e [[name]]` |\n| [`dfgf2dfob`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L227) | Копіювання вхідної таблиці `dfgf` з довгими назвами стовпчиків у таблицю зі скороченими назвами стовпчиків `dfob` |\n| [`check_dupl_in_table`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L244) | Перевірка відсутності дублікатів імен нотаток у вхідній таблиці |\n| [`complete_obs_table`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L255) | Завершення підготовки Obsidian таблиці перед конвертацією у нотатки |\n| [`create_notes`](https://github.com/protw/obsidian_py/blob/master/gs2note.py#L280) | Створення нотаток у сховищі Обсідіан з вх. таблиці Гугл Форм |\n\n### Порядок підготовки власного робочого простору\n\n#### 1. Підготовка файлової структури на локальному комп'ютері\n\nДля початку встановлюємо Obsidian на локальному комп'ютері. Тут я не зупиняюсь на встановленні цього застосунку через те, що це, по-перше, тривіальне завдання, а по друге, це не є предметом цього документу.\n\n⚠️ Важливо зазначити структуру шляхів розміщення ваших Obsidian сховищ (vaults). Скажімо, ми маємо два сховища: **`NCP-NEB`** і **`NECU`**. У кожному зі сховищ ви можете мати субфолдери: **`ORGS`**, **`PERSONS`**, **`PROJ`** і **`TEAMS`** для зберігання нотаток щодо організацій, осіб, проєктних ідей і команд, відповідно. \n\nТакож, нам треба організувати окремий службовий фолдер **`obsidian_py`**, де ми розмістимо конфігураційні файли: **`credentials.json`** та **`config_gs.yml`**, а також Jupyter Notebook **`gs2note_run.ipynb`** для запуску застосунку. \n\nТакож у цьому фолдері можна розмістити форми Google Forms разом з їхніми таблицями відповідей. \n\nУ підсумку файлова структура на локальному комп'ютері матиме такий вигляд:\n\n![obsidian_vaults_path](doc/obsidian_vaults_path.png)\n\n#### 2. Встановлення синхронізації з Google Drive\n\n⚠️ Ми працюємо в Obsidian невеликою командою. Тому наступним кроком має стати налаштування синхронізації фолдера `D:/path_to_all_your_vaults_storage/` з Google Drive. Тут важливим моментом є те, щоб в результаті синхронізації фолдер **`OBSIDIAN/`** став доступним з кореню MyDrive на Google Drive. Якщо цього не спостерігається, то на Google Drive треба зробити ярлик (*shortcut*) фолдера **`OBSIDIAN/`** у MyDrive (якщо не знаєш як, то [інструкція тут](https://support.google.com/drive/answer/9700156?hl=uk\u0026co=GENIE.Platform%3DDesktop)).\n\n#### 3. Налаштування Jupyter Notebook\n\nНа останок потрібно зафіксувати вашу структуру у комірці вхідних параметрів Jupyter Notebook **`gs2note_run.ipynb`** у змінних **`vault`** і **`table`**, а також у словнику **`folders`**. Для цього відкрийте цей Jupyter Notebook в бравзері через Google Drive і, у разі потреби, внесіть необхідні зміни:\n\n```python\n# @title Вхідні параметри\n\n# @markdown Оберіть Обсідіан-сховище (**vault**):\nvault = 'NECU' #@param ['NECU', 'NCP-NEB']\n\n# @markdown Оберіть тип таблиці (**table**), що буде конвертований з Гугл форми\n# @markdown до обраного сховища:\ntable = 'persons' #@param ['persons', 'teams', 'orgs', 'proj']\n\n# ==== УВАГА! Цей розділ Colab комірки лише для адміна!! ====\n\n# Якщо ви не знаєте призначення налаштувань нижче, або не впевнені в тому\n# що знаєте, то нічого не чипайте\nfolders = {\n    'base': '/content/drive',\n    'vaults_base': '/MyDrive/OBSIDIAN/',\n    'code_dir': 'obsidian-py/'\n}\n\n# В робочому положенні ВСІ елементи словника `cond` мають бути встановлені `True`\ncond = {\n    'is_dupl_in_vault': True, # Рекомендовано True, за замовчанням\n    'is_dupl_in_table': True,  # Рекомендовано True, за замовчанням\n    'not_write_dupl':   True,  # Рекомендовано True, за замовчанням\n    'is_clean_writing': True  # За замовчанням True\n}\n```\n\n⚠️ Зверніть увагу на рядки коментарів, що починаються з **`#@param`**. Ці рядки несуть чіткий семантичний зміст, а саме: формують інтерфейс користувача у вигляді меню зі спадним списком під час запуску Jupyter Notebook. Якщо цікаво, то докладно цей підхід до формування користувацького інтерфейсу описаний тут - [Forms - Colab](https://colab.research.google.com/notebooks/forms.ipynb). \n\n#### 4. Налаштування запуску на локальному комп'ютері\n\nУ разі запуску застосунку з локального комп'ютера необхідно зафіксувати вашу структуру у файлі **`gs2note_run.py`**:\n\n```python\nimport gs2note\n\n# ==== ВХІДНІ ПАРАМЕТРИ ====\n\n# Оберіть Обсідіан-сховище (vault):\nvault = 'NECU' # обрати зі списку ['NECU', 'NCP-NEB']\n\n# Оберіть тип таблиці (table), що буде конвертований з Гугл форми\n# до обраного сховища:\ntable = 'persons' # обрати зі списку ['persons', 'teams', 'orgs', 'proj']\n\n# ==== УВАГА! Цей розділ лише для адміна!! ====\n\n# Якщо ви не знаєте призначення налаштувань нижче, або не впевнені в тому\n# що знаєте, то нічого не чипайте\nfolders = {\n    'base': 'D:/boa_uniteam/',\n    'vaults_base': 'OBSIDIAN/',\n    'code_dir': 'obsidian-py/'\n}\n# В робочому положенні ВСІ елементи словника `cond` мають бут встановлені `True`\ncond = {\n    'is_dupl_in_vault': True, # Рекомендовано True, за замовчанням\n    'is_dupl_in_table': True,  # Рекомендовано True, за замовчанням\n    ## ---- СХОВАТИ ВІД КОРИСТУВАЧА ----\n    'not_write_dupl':   True,  # Рекомендовано True, за замовчанням\n    'is_clean_writing': True  # За замовчанням True\n}\n\nconv = gs2note.run(vault=vault, table=table, folders=folders, cond=cond)\n```\n\n#### 5. Налаштування Google Forms\n\nДля зручності наперед підготовлені чотири зразки Google Forms: **`Команда`**, **`Організація`**, **`Персона`** і **`Проєктна ідея`**:\n\n- [Команда](https://docs.google.com/forms/d/1H-bDiYkjdoo7HTm3EVuRlSJrc4EwAXsknj1Y1pSFB04/edit)\n- [Організація](https://docs.google.com/forms/d/1m094KZrvDN2TatReSDv824ERRQapbxf-FAJ0-S8mhJA/edit)\n- [Персона](https://docs.google.com/forms/d/1CfsYUdYOev5Zdb7VO89Iin4onLy3LtWeKiKcInBj58Q/edit)\n- [Проєктна ідея](https://docs.google.com/forms/d/1vZA1igquxMLhsSFB4fd-QayNb8aW3uBNwlikZZ38b8A/edit)\n\nЦі зразки є готовими формами, але не призначені для заповнення. Тому для своєї роботи **обов'язково** зробіть з кожної форми свою копію, з якою ви будуте працювати. Для цього \n\n1. відкрийте форму у бравзері;\n\n2. якщо праворуч вгорі на формі замість вашого аватару є напис \"Увійти\", то спочатку увійдіть під своїм робочим акаунтом;\n\n3. натисніть значок \"три вертикальні крапки\" поруч (лівіше) з вашим аватаром і оберіть \"Зробити копію\";\n\n4. ⚠️ під час копіювання зробіть так, щоб ім'я форми в точності збігалось з оригіналом (а саме: **`Команда`**, **`Організація`**, **`Персона`** і **`Проєктна ідея`**), і тут же перемістіть форму у фолдер **`OBSIDIAN/obsidian_py/`** на Google Drive;\n\n5. зв'яжіть форму з таблицею відповідей, для чого з трьох елементів меню (посередині вгорі форми); **`Запитання | Відповіді | Налаштування`** оберіть **`Відповіді`** і далі натисніть **`Зв'язати з Таблицями`**; в результаті біля форми на Google Drive з'явиться таблиця Google Sheets, наприклад: **`Команда (Відповіді)`**.\n\n6. вставте Google ідентифікатор **`\u003cgs_identifier\u003e`** новоствореної таблиці відповідей\n\n   ```\n   https://https://docs.google.com/spreadsheets/d/\u003cgs_identifier\u003e/edit\n   ```\n\n    у відповідний рядок конфігураційного файлу **`config_gs.yml`**:\n\n   ```yaml\n   gs_domain: https://docs.google.com/spreadsheets/d/\n   gs_id:\n       teams: \u003cgoogle-sheets-id-for-teams-table\u003e\n       orgs: \u003cgoogle-sheets-id-for-orgs-table\u003e\n       persons: \u003cgoogle-sheets-id-for-persons-table\u003e\n       proj: \u003cgoogle-sheets-id-for-proj-table\u003e\n   ```\n\n7. активуйте Google Sheets API та Google Drive API, як це зазначено у розділі [Автоматизоване завантаження таблиць Google Sheets](#Автоматизоване завантаження таблиць Google Sheets); ⚠️ не забудьте поширити таблицю на новостворений сервісний акаунт.\n\n### Запуск застосунку\n\nНу начебто все налаштовано, форми заповнені користувачами — час запускати.\n\nТут ми опустимо запуск конвертора на локальному комп'ютері, бо це варіант для тих ентузіастів, що мають встановлений Python.\n\nСтандартний варіант це запуск конвертора з хмари, з-під Google Colab:\n\n1. відкрийте на Google Drive фолдер **`OBSIDIAN/obsidian_py/`** і зробіть подвійний клік на  Jupyter Notebook **`gs2note_run.ipynb`**;\n\n2. у відкритому Jupyter Notebook оберіть зі спадних меню потрібні Obsidian-сховище (**`vault`**) і таблицю (**`table`**);\n\n3. запустіть Jupyter Notebook натиснувши **CTRL+F9** або через меню **Середовище виконання / Виконати всі**.\n\n4. в результаті успішного виконання у вас з'явиться щось подібне до цього:\n\n   ```\n   ВХІДНІ ПАРАМЕТРИ\n   ✅ Фолдер Обсідіан-сховища: /content/drive/MyDrive/OBSIDIAN/NECU/\n   ✅ Фолдер налаштувань: /content/drive/MyDrive/OBSIDIAN/obsidian-py/\n   ✅ Тип конвертованої таблиці: persons\n   ЗАПУСК КОНВЕРТОРА\n   ✅ Зчитана таблиця PERSONS розміром (3, 12)\n   ✅ Валідація відповідності структури таблиці `PERSONS` пройдена\n   ✅ У субфолдері NECU/PERSONS створено 3 нотаток: ['Євген Бовсуновський', 'Олег Бондаренко', 'Дмитро Іванов']\n   ```\n\n⚠️ Obsidian \"не любить\" дублікати імен (назв) нотаток. Кожна нотатка має мати унікальне ім'я. Тому, у разі знаходження дублікатів імен або в таблиці відповідей Google Forms, або у Obsidian-сховищі застосунок зупиниться і повідомить про список імен-збігів. Ваша задача позбавитись збігів окремо у вхідній таблиці або окремо у Obsidian-сховищі (це ручна робота) і запустити застосунок знов. До речі, якщо ви запустите Jupyter Notebook повторно після першого успішного запуску, то застосунок пропустить збіги імен нотаток між вхідною таблицею і сховищем та повідомить про нуль новостворених нотаток.\n\n---\n\nУ-у-уф! Це все! Насолоджуйтесь!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprotw%2Fobsidian_py","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprotw%2Fobsidian_py","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprotw%2Fobsidian_py/lists"}