はじめに
本記事はBASE アドベントカレンダー 2023の5日目の記事です。
こんにちは!BASE株式会社でエンジニアをしている田中です。
Creative Time1 Groupに所属し、主にBASEのBackOffice領域の機能開発を担当しています。
BASEでは、社内でのドキュメント管理の課題解決に向けて、2023年2月頃からツールをKibelaからNotionに移行しようという検証が始まりました。
この記事では、どのようにしてKibelaの記事をNotionに移行したのかや、移行の際に困ったポイントを紹介していこうと思います。
Notion導入にあたっての詳しい経緯や課題などについては、12/6公開予定のbonさんによる「Notion導入について(後編)」にて紹介予定です。
Kibelaのエクスポート機能とNotionのインポート機能
Kibelaには記事のエクスポート機能があり、記事および画像などのアップロード済みファイルをZip形式でダウンロードできます。
ダウンロードしたZip内には、attachmentsという記事の添付ファイルが含まれるフォルダ、notesというMarkdown (.md)形式の記事が含まれるフォルダが存在します。
エクスポートされたMarkdownには、以下のようにYAMLのヘッダー部分と記事本文の情報が入っています。
--- id: QmxvZy8x path: "/notes/1" author: "@ayako" contributors: - "@ayako" coediting: true folders: - 初期グループ / fuga groups: - 初期グループ published_at: '2023-03-09 18:10:44 +0900' updated_at: '2023-03-10 19:31:08 +0900' archived_at: comments: - id: Q29tbWVudC8x path: "/notes/1#comment_1" author: "@ayako" published_at: '2023-03-10 19:31:08 +0900' updated_at: '2023-03-10 19:31:08 +0900' content: コメント --- # テスト記事 # タイトル ## 見出し1 hoge <img title='スクリーンショット' alt='スクリーンショット' src='../attachments/2.png' width="376" data-meta='{"width":376,"height":364}'>
Notionには現状Kibelaから直接インポートする機能はないため、Kibelaからエクスポートしたマークダウンファイルを、NotionのText & Markdownのインポート機能で取り込みます。
標準インポートでは取り込めなかった情報
ここまでの手順で記事本文自体のインポートは可能なのですが、標準インポート機能では取り込めなかった情報があります。
YAMLヘッダー部分に記載の情報
以下のような記事の詳細情報は標準インポートでは取り込めません。
- 著者・編集者
- 記事の所属グループ
- 記事の属するフォルダ
- 記事作成日
- 最終更新日
- 記事についていたコメントの内容
どうにか解決する方法はないか調べる中で、既にKibelaのNotion移行を行い、同じ事象で困ってツールを作成していた方を見つけました。
Kibela から Notion に約2万+件の記事を移行するために移行ツールを作った話
こちらのkibela-to-notionを利用し、YAMLヘッダー部分に記載の情報については問題なく取り込めました。
画像やPDFなどのファイル群
attachments/
内にエクスポートされた記事内に存在したファイル群は、エクスポートした段階で
<img src='../attachments/image.png'>
のように相対パスになっており、そのままNotionにマークダウンをインポートしても画像を参照できず読み込みはできません。
記事執筆時点(2023/12/1現在)でも、Notion APIで画像のアップロード機能がないため、自分でどこかにアップロードする必要があります。
The Notion API does not yet support uploading files to Notion.
Start building with the Notion API
先述のkibela-to-notionの記事でも画像問題は触れられており、S3やGoogleDriveを利用する方法もセキュリティ上の問題や、inline表示ができない点で懸念があり、何か他の方法はないかと模索しました。
検証を繰り返し、Notion上に画像をアップロードしてURLを発行し、APIでURLを取得して置き換える方法を取りました。
ファイルのアップロード
Notion上にKibelaからファイルをアップロードするDBを作成し、Files&mediaのプロパティを追加し、空のページを作ります。そこにKibelaからエクスポートしたZIP内のattachements/
内のファイルをアップロードしていきます。アップロードするファイル数はかなり多かったため、1000ファイルごと程に分割しアップロードしました。
アップロードしたファイルの取得
作成した空のページごとに、ページプロパティを取得するNotion API を使用してファイルを取得し、ファイル名をkey、Notion上にアップロードしたファイルのURLをvalueにしてRedisに格納します。
相対パスのファイルURLの書き換え
あとはRedisに格納したファイル名を元に、マークダウンファイル内の相対パスになっている箇所を書き換えます。ここの手順に関しては、kibela-to-notion内にそのまま利用できるロジックが存在していたため、利用しました。
ファイルURLを置き換えたマークダウンファイルをNotionにインポートすると、無事にファイルが読み込めており、ファイルが参照できない問題は解決しました。
その他苦労したこと
Notionへの大量のファイルアップロードやインポート
今回どうしても必要だった作業として、相対パスの参照問題を解決するためのNotionへのファイルのアップロードと、マークダウンファイルのNotionへのインポートです。
数が数なだけにまとめてアップロードしたいのですが、同じファイル数や同じファイルの大きさだとしても、すぐ完了する場合もあれば途中で原因も分からず失敗してしまうことが何度もありました。そのためにはできるだけファイルを分割して小さい単位で作業を行うしかなかったため、社内の有志の方にご助力いただき、作業を分担し解決しました。
おわりに
このNotion移行計画が2月ごろ始まり、計画・検証・作業含め完了したのが10月のため8ヶ月ほどかかりました。メインの業務とは別で行なっていたため時間もかかりましたが、社内の有志の方のご協力もあり無事に移行を終えることができ感謝しています。
アドベントカレンダー 6日目はtakashimaさんとbonさんです!お楽しみに!