web-dev-qa-db-ja.com

すべてのOneNoteページを個別のマークダウンファイルにエクスポートするにはどうすればよいですか?

私はLinuxに移行していますが、最後のハードルはOneNoteから抜け出すことです。すべてのノートブックをエクスポートして、すべてのページが個別のマークダウンファイルに移動するようにします。

私は多くのことを試しました— このスレッド はいくつかの提案をしましたが、それらはすべて時代遅れです。

OneNoteですべてのページを個別の.docxファイルとしてエクスポートできる場合、pandocを使用してそれらを個別のマークダウンファイルに変換するのは簡単です。ただし、OneNoteは複数のページを1つのファイルとしてのみエクスポートします。したがって、1つの方法は、すべての単一ページのエクスポートを個別に自動化する方法を見つけることです。

もう1つのオプションは、ノートブック全体を.docxファイルとして一度にエクスポートし、それらをpandocでマークダウンに変換してからファイルを分割することです。正規表現であり、正しい完全な正規表現でファイルを出力するには、awkウィザードでは不十分です。

誰かがこれを手伝ってくれる?

14
Anders

輸出パイプラインを見つけることになりましたが、それは苦痛でした。これが私のメモです。

ワークフロー:

  1. ネットワークをオフにして、エクスポートごとにOneNoteが長時間のOneDrive同期を実行しないようにします。

  2. [ノートブック]リストでノートブックを展開して、すべてのタブを表示します。

  3. タブを右クリックして、[エクスポート...]をクリックします。

  4. ファイルタイプのドロップダウンをクリックして、 M _.docx_形式を選択します。押す Enter それを選択します。

  5. 押す Enter 再度エクスポートしたファイルを保存します。

  6. ノートブックのタブごとに手順2〜5を繰り返します。

  7. Pandocをセットアップし、PowerShellまたはcmdウィンドウを開きます。

  8. エクスポートされた_.docx_ファイルが配置されているディレクトリにcdします。

  9. エクスポートされた_.docx_ファイルごとに、次のpandocコマンドを使用して、それをマークダウンに変換します(journalをファイルの名前に置き換えます)。

    _pandoc --extract-media='' --wrap=preserve '.\journal.docx' -o journal.md
    _

    コマンドの説明は次のとおりです。_--extract-media=''_は、_.docx_ファイルから画像を抽出してデフォルトのサブフォルダー(デフォルトでは「media」という名前)に配置するようpandocに指示します。 _--wrap=preserve_は、出力ファイルを改行でハードラップしないことをpandocに指示します(これがデフォルトです)。次のフィールドは入力ファイル名であり、_-o_は「出力」を表すため、_journal.md_は出力ファイル名です。

    このファイルを分割したくない場合(たとえば、タブに1ページしか含まれていない場合)は、手順15に進みます。

    (あなたがこれらの束をしているとき、あなたは押すことができます  (上矢印)キーを押してシェルで前のコマンドを呼び出し、ファイル名を編集します。)

  10. タブにページを保存するための新しいフォルダーを作成します。この例では、現在、OneNoteの[ジャーナル]タブのすべてのページが_journal.md_にまとめられています。 journalという名前のフォルダーを作成します。このフォルダーには、個別の.mdファイルとして最終的に分離されたページが格納されます。

  11. _.docx_ファイルに画像があった場合、これらはmediaという新しいフォルダーにエクスポートされます。メディアフォルダーが存在する場合は、今作成したフォルダーにドラッグします。 (このため、エクスポートごとに個別のメディアフォルダーが作成され、マークダウンファイル内のリンクが正しく機能するようにこれらを個別に保持したいので、各パンドック操作を個別に実行する必要があります。これを行うための巧妙なスクリプトを書くことができます自動的に実行されますが、ノートブックの数が非常に多い場合を除き、手動で実行する方が時間がかかりません。)(注:_--extract-media=''_引数の単一引用符で目的のフォルダー名を指定すると、ステップを節約できます—画像付きの_.docx_ファイルの場合、フォルダーが自動的に作成されます。)

  12. Bashターミナルを開き、_.md_ファイルを含むディレクトリにcdします。手順10で作成したフォルダーは、このフォルダーのサブフォルダーである必要があります(次のコマンドでパスを修正しない限り)。

  13. まだ行っていない場合は、Windows Bashウィンドウのアイコンをクリックし、[プロパティ]をクリックして、[クイック編集モード]をチェックしてから、[OK]をクリックします。次に、Windows Bashウィンドウのアイコンをもう一度クリックします。今度は[デフォルト]をクリックし、[クイック編集モード]をチェックして、[OK]をクリックします(今後作成する新しいBashウィンドウには、この設定が記憶されます)。これで、ターミナルでテキストを選択して押すことができます Ctrl+C コピーするには、ターミナルウィンドウを右クリックして、テキストをクリップボードに貼り付けます。これで、コマンドを別の場所に準備し、各バージョンをBashにすばやく貼り付けることができます。

  14. 次のコマンドをカスタマイズして、個々のページに分割する_.md_ファイルごとに実行します。

    csplit ./journal.md --keep-files --prefix='journal/journalentry ' --suffix-format='%i.md' --elide-empty-files '/^\(Monday\|Tuesday\|Wednesday\|Thursday\|Friday\|Saturday\|Sunday\),/-2' '{*}'

    (1行で入力してください。)

    ご覧のとおり、_journal.md_はマークダウンファイルの名前(現在のディレクトリにあり、_./_で示されます)、journalの2番目の出現(_--prefix='_の後)は、分割ファイルを含むサブフォルダーの名前です。journalentryは、各ファイルの名前です(インデックス番号が後に続きます)。

    コマンドを理解したい場合は、以下に説明があります。_--keep-files_は、エラーまたはファイルの終わりが検出された場合でもファイルを印刷し、最後のページが正しく出力されることを確認します(それがのパターンで終わっていないため)正規表現)。 _--prefix_は、出力ファイルの命名方式を設定します。 _--suffix-format_を使用すると、ファイル拡張子(この場合は_.md_)を設定できますが、ファイルのインデックス番号を出力するsprintfステートメントには_%i_を含める必要があります。 _--elide-empty-files_は、必要のない空のファイルの出力をスキップします。最後に、_'/_で始まり_/-2'_で終わる正規表現は、ファイルを分割するタイミングを定義します。「行の先頭に(/)が見つかると(^)次のようになります。 (()月曜日または(\ |)火曜日または水曜日または木曜日または金曜日または土曜日または日曜日())の後にコンマが続き、2行(-2)後退してファイルをそこに分割し、現在までの内容を出力します。最後のビット_'{*}'_は、ファイルの終わりに到達するまで、前のコマンドを無期限に繰り返します。

  15. _.docx_ファイルと_.md_ファイルをフォルダーにドラッグします。たとえば、今作成したフォルダーはintermediatesです。または、それらを削除することもできます。戻って変換プロセス中に発生した何かを参照したい場合に備えて、新しいファイル形式に慣れるまで、しばらく保存しておくと便利です。それらを中間フォルダーに移動すると、現在の場所を忘れてステップを繰り返す可能性がなくなります。

  16. OneNoteからエクスポートした_.docx_ファイルごとに手順9〜14を繰り返します。

  17. これで、タブごとに1つのフォルダーがあり、各ページに1つずつ、一連​​の個別の_.md_ファイルが含まれています。さらに、OneNoteタブに画像があった各サブフォルダーのmediaフォルダー。

  18. 各OneNoteノートブックを_.mht_ファイル(単一ファイルのWebページ)、または必要に応じて_.pdf_としてエクスポートすることをお勧めします。このように、複数の変換が原因で一部のマークダウンファイルで書式設定やその他の情報が失われた場合、いつでも戻って、_.mht_ファイルでどのように表示されるはずだったかを簡単に確認できます。さらに、各OneNoteノートブックを_.onepkg_ファイル(OneNoteパッケージ)としてエクスポートすることをお勧めします。これにより、ノートブックをネイティブ/元のファイル形式でOneNoteで再度開きたい場合に、素晴らしい最終エクスポートコピーが得られます。 (たとえば、_.mht_ファイルにも回復したい元のフォーマットが欠けている場合に役立ちます)。

  19. 各ノートブックを完成したら、OneNoteでノートブックを右クリックして[このノートブックを閉じる]をクリックします。これにより、誤ってノートブックを編集して、新しい変更を再エクスポートする必要がなくなります。マークダウンフォルダーについては、各ノートブック用のフォルダーも作成し、その中にすべてのタブフォルダーを配置しました。

  20. エクスポートプロジェクト全体が完了したら、OneDriveに移動して、そこで同期されているすべてのOneNoteノートブックのオリジナルを削除できます(もちろん、今すぐ独自のファイルをバックアップしていることを確認してください!OneDrive for LinuxまたはSyncthingなどを試すことができます)。

  21. 最後に、2つのスクリプトを使用して、すべての.mdファイルの名前を、各ファイルの最初の行であるOneNoteページのタイトルに変更できます。次のファイルを作成します。

    ファイル1:_~/scripts/rename-files-to-first-line.sh_

    _for i in *md ; do mv -n "$i" "$(cat "$i"|head -n1|tr -d '\000-\037[]{}()/\?*')".md; done
    _

    ファイル2:_~/scripts/recurse.sh_

    _CDIR=$(pwd)
    for i in $(ls -R | grep :); do
        DIR=${i%:}                    # Strip ':'
        cd $DIR
        $1                            # Your command
        cd $CDIR
    done
    _

    次に、ノートフォルダーに移動し、_recurse.sh_コマンドを引数として使用して_rename-files-to-first-line.sh_コマンドを実行します。

    _$ ~/scripts/recurse.sh ~/scripts/rename-files-to-first-line.sh
    _

    スクリプトがすべてのファイルを再帰的に処理し、奇妙な最初の行(ファイル名に変換されない)を含むファイルやその他のEdgeケースでいくつかのエラーをスローすることがわかります。ただし、_rename-files-to-first-line_のmvコマンドは引数_-n_を指定して実行されるため、ファイルが上書きされることはありません。名前が変更されないメモがいくつかある可能性があります。それらの最初の行が空白またはその他の奇妙なためですが、手動でこれらのいくつかのファイルを修正できます。

  22. OneNoteからのすっきりとした脱出をお楽しみください。

警告:

  • これはサブページをキャプチャしません。必要に応じて、サブサブフォルダを使用してそれらを再作成する必要があります。

  • テーブルでどの程度うまく機能するのかはわかりません。とにかく、マークダウンはテーブルにとってはあまり意味がありません。

  • おそらく、フォントなど、エクスポートで失われたり、めちゃくちゃになったりする他の種類のフォーマットがあるでしょう。リッチテキストと画像の場合は、かなりうまくいきます。

12
Anders

私のメモはジャーナルエントリではないため、他の答えはそれをカットしませんでしたが、私は MicrosoftのGraph API を使用した解決策を見つけました。つまり、OneNoteを実行する必要さえありません。メモをMicrosoftアカウントに同期するだけで、メモを完全な形式のHTMLとして取得できます(ブラウザーで表示したり、好みの形式に変換したりできます) Pandocを使用)。

魔法は this Python script で発生します。Microsoftアカウントへのログインに使用できる簡単なローカルWebサーバーを実行し、実行するとすべてダウンロードされますノートをHTMLとして、画像と添付ファイルを元の形式で保存し、ノートブックの元の構造(ページの順序とサブページを含む)を維持したままファイル階層に保存します。

スクリプトを実行する前に、Microsoft Azureに「アプリ」を登録して、グラフAPIにアクセスできるようにする必要があります。

  1. https://aad.portal.Azure.com/ にアクセスし、Microsoftアカウントでログインします。
  2. [Azure Active Directory]を選択し、[管理]で[アプリの登録]を選択します。
  3. 「新規登録」を選択してください。任意の名前を選択し、[サポートされているアカウントの種類]を[任意の組織ディレクトリ内のアカウントと個人のMicrosoftアカウント]に設定し、[リダイレクトURI]で[Web]を選択してhttp://localhost:5000/getTokenと入力します。登録。
  4. 「アプリケーション(クライアント)ID」をコピーして、Pythonスクリプトの先頭にclient_idとして貼り付けます。
  5. 「管理」から「証明書とシークレット」を選択します。 「新しいクライアントシークレット」を押し、名前を選択して確定します。
  6. クライアントシークレットをコピーし、secretとしてPythonスクリプトに貼り付けます。
  7. 「管理」から「API権限」を選択します。 「権限の追加」を押し、下にスクロールしてOneNoteを選択し、「委任された権限」を選択して、「Notes.Read」と「Notes.Read.All」を確認します。 「権限の追加」を押します。

次に、Python依存関係をインストールする必要があります。Python 3.7(またはそれ以降)がインストールされていることを確認し、コマンドpip install flask msal requests_oauthlibを使用して依存関係をインストールしてください。 。

これでスクリプトを実行できます。ターミナルで、スクリプトが配置されているディレクトリに移動し、python onenote_export.pyを使用してスクリプトを実行します。これにより、ポート5000でローカルWebサーバーが起動します。

ブラウザーで http:// localhost:50 に移動し、Microsoftアカウントにログインします。初めてそれを行うときは、アプリがOneNoteのノートを読み取ることができることも受け入れる必要があります。 (これにより、Azureポータルで作成したクライアントIDとシークレットを共有しない限り、第三者がデータにアクセスすることはありません)。この後、ターミナルに戻って進行状況を確認します。

注:マイクロソフトでは、特定の期間内に実行できる要求の数を制限しています。したがって、多くのメモがある場合、最終的には次のようなメッセージがターミナルに表示される可能性があります。Too many requests, waiting 20s and trying again.これは問題ではありませんが、プロセス全体に時間がかかる可能性があります。また、ログインセッションはしばらくすると期限切れになり、TokenExpiredErrorになります。これが発生した場合は、単に http:// localhost:50 をリロードすると、スクリプトは続行します(すでにダウンロードしたファイルはスキップされます)。

6
danmou

OneNoteページを個別のマークダウン(.md)にエクスポートするには、 Joplin および Evernote をインストールする必要があります。

この link で提案されているように、最初にノートをEvernoteにインポートします。次に、すべてのメモをEvernoteから.enexファイルにエクスポートし、Joplinにインポートします。

Joplinには、ノートを.mdファイルとしてエクスポートするオプションがあります。

注:ノート間で階層を維持するEvernoteの方法はOneNoteとは異なるため、ノートをグループ化する場合は、事前にEvernoteでフラグを使用することをお勧めします。

4
bruno

このための非プログラム的な回避策を見つけました。

TLDR;

OneNoteからノートを Evernote にエクスポートしてから Notion にエクスポートし(オプション)、選択した形式の個別のファイルとしてエクスポートします。


私はNotionからノートをエクスポートするのに本当に苦労してきました。オンラインで見ると、OneNoteページをエクスポートして分割し、それらをmdまたはhtmlファイルに変換するためのいくつかの本当に不自然な方法が返されます。なんてめちゃくちゃ!

基本的に、OneNoteセクションをEvernoteに非常に簡単にインポートできます。デスクトップ用のEvernoteをダウンロードした後、それを行うのは非常に簡単で、そこからNotionにインポートするのも同じくらい簡単です。

同じ組織を維持したい場合は、個々のセクションをインポートすることをお勧めします。それ以外の場合は、すべてのセクションを一括インポートすることができます。ページにはセクション名のタグが付けられ、それがNotionにも反映されます。

Microsoft/Outlookアカウントにログインし、OneNote 2016を使用してそれらが同期されていることを確認することにより、OneNoteノートブックを同期する必要があることに注意してください。

お役に立てれば。

0
JayPex