Python · Google Drive ↔ OneDrive · オープンソースの技術ガイド
Pythonで安全なGoogle Drive・OneDrive間転送を構築する
このガイドでは、見た目以上に難しいクラウド間コピーを、列挙、事前確認、ステージング、ハッシュ計算、アップロード、再ダウンロード、比較、チェックポイント保存という明確なパイプラインに分解し、そのすべてが完了してからローカルディスク領域を解放します。
更新日 ; 22 分で読めます.
簡単な回答
マネージド移行では、FileArkがコンピューターをデータ転送経路にすることなく、このワークフローを自動化します。複数テラバイト規模の移行ワークロードでテストされており、成功と報告する前に、ソースデータの受信、プロバイダーによるアップロードの受け入れ、移行先オブジェクトを確認します。パイプラインを自分で運用する必要がある場合は、以下のMITライセンスのPythonプログラムを使用すると、コンピューターを経由して慎重にコピーでき、ソースファイルが削除されることはありません。
コードを選ぶ前に運用モデルを決める
ライブラリが大規模な場合、無人で接続を実行する必要がある場合、またはノートPCをデータの転送経路にしたくない場合は、クラウド間を直接移行するサービスが現実的な選択肢です。FileArkは転送をオンラインで実行し、プロバイダーからの応答を監視して、回復可能なエラーを再試行します。また、進行状況を1つの画面で確認できます。ファイルを完了済みと判定する前に、検証プロセスで3つの独立したチェックを実行します。
ローカルスクリプトは、OAuthアプリケーション、ステージング用ディスク、ログ、移行先フォルダーのポリシーを完全に制御したい場合に便利です。その代わり、運用上の責任が伴います。マシンをオンラインに保つ必要があり、ネットワーク接続がボトルネックになります。また、OAuth認証情報を保護し、処理中のバッチと検証用コピーに十分な一時ディスク領域を確保し続ける必要があります。
ここで公開するプログラムは、意図的に慎重な設計になっています。1つの個人用ドライブのルートから、移行先に新しく作成したフォルダーへコピーします。削除メソッドは提供せず、競合するファイルを上書きしません。検証後には永続的なチェックポイントを保存し、ローカルまたは移行先の空き容量が設定した予約容量を下回ると停止します。
転送パイプラインと障害発生時の停止範囲
移行元ツリーのインベントリを作成
移行元アダプターはフォルダーを再帰的に走査し、プロバイダーのページネーションに従って、ID、パス、種類、報告されたサイズを記録します。また、対応するGoogleネイティブ形式のファイルを、移植可能なエクスポート形式に変換します。
移行先とローカルの空き容量を事前確認する
エンジンは、未処理のバイト数に設定可能な予約容量を加えた値を、移行先のクォータと比較します。また、各バッチの開始前と個々のファイルのダウンロード前に、ステージング用ファイルシステムの空き容量を確認します。
上限を設定したバッチをステージング
ファイルは、合計バイト数とファイル数の両方で制限されたバッチ単位で処理されます。ローカルディスクを使用するのは現在のバッチだけなので、大規模なライブラリでも同じ容量のドライブを用意する必要はありません。
ハッシュ計算とアップロード
ダウンロード後、スクリプトはローカルでSHA-256を計算し、判明している場合は移行元のサイズを確認します。その後、移行先フォルダーを作成し、プロバイダーと互換性のある再開可能なチャンク単位でアップロードします。
検証とチェックポイントの保存
デフォルトモードでは、移行先に新しく作成されたオブジェクトを再ダウンロードし、SHA-256を比較します。一致したファイルのみがJSONチェックポイントに記録され、ローカルのステージング領域から削除されます。
MITライセンスの完全版Pythonプログラムをダウンロード
ダウンロードファイルは、読みやすい単一のPythonエントリーポイントです。プロバイダーのSDKは実際の転送時にのみインポートされるため、依存関係や認証情報をインストールする前でもデモコマンドとヘルプコマンドを実行できます。別のrequirementsファイルには、対応するパッケージの最小バージョンが固定されており、ソースと同じ場所にライセンスも収録されています。
使用前にコードを確認し、小規模な移行先フォルダーでテストしてください。重要なデータには、既定の再ダウンロード検証を使用してください。汎用スクリプトでは、共有権限、ショートカット、保持ラベル、共有ドライブのルール、テナントポリシーのすべてを再現することはできません。
Python転送プログラムをダウンロード
バッチ処理、チェックポイント、再試行、クォータの予約容量、移行先でのSHA-256検証を備えた、Google Drive APIとMicrosoft Graphの直接実装です。fileark-cloud-transfer.py · Python 3.10以降 · MITライセンス
Pythonの依存関係ファイルをダウンロード
Google OAuthとDrive、Microsoft認証、Graphリクエスト、再試行処理に必要な最小限の依存関係一覧です。requirements-fileark-cloud-transfer.txt · pip要件 · プレーンテキスト
MIT ライセンスをダウンロード
FileArk の手動転送スクリプト 2 種に適用される許諾通知です。LICENSE-fileark-cloud-transfer.txt · MIT · プレーンテキスト
クラウドへのアクセスを許可する前に安全性を確認する

まずデモを実行してください。ネットワーク通信は行わず、クラウドにもデータを書き込みません。最後の行には、誤解の余地がないよう「移行元から削除されたファイルは0件」と明記されます。実際のエンジンも構造化ログで同じ処理順序を出力し、未検証のファイルが最初に見つかった時点で0以外の終了コードを返します。
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --helpシークレットを埋め込まずにOAuthクライアントを作成する
Google Driveの場合は、Google Cloudプロジェクトでデスクトップ用OAuthクライアントを作成し、Drive APIを有効にして、同意画面を設定したうえでクライアントJSONをダウンロードします。--google-client-secretでそのパスを渡すか、GOOGLE_OAUTH_CLIENT_SECRET_FILEを設定してください。スクリプトはファイルの一覧取得、ダウンロード、フォルダー作成、アップロード、検証を行う必要があるため、Driveへのアクセスを要求します。
OneDriveでは、Microsoft Entra IDにパブリッククライアントアプリケーションを登録し、デバイスコードフローを有効にして、委任されたFiles.ReadWrite権限を追加したうえで、アプリケーションのクライアントIDを渡します。個人用アカウントと組織アカウントの両方を対象とする場合はcommon、職場アカウントを対象とする場合はorganizationsを選択します。ポリシーで求められる場合は、特定のテナントIDを指定してください。
トークンはローカルファイルにキャッシュされるため、移行が中断しても再ログインせずに再開できます。クライアントJSONとトークンキャッシュはシークレットとして扱ってください。バージョン管理の対象から除外し、ファイルシステムの権限を制限し、サポートチケットには絶対にアップロードせず、移行の受け入れ完了後に削除してください。
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txtGoogle DriveからOneDriveへ転送する、または逆方向に転送する
IDに固有の値はすべて、運用者が用意します。このプログラムには、クライアントID、シークレット、テナント、トークン、リモートアカウント、移行先の認証情報は含まれていません。最初のコマンドでは、ブラウザーでGoogleにサインインし、デバイスコードを使ってMicrosoftにサインインした後、OneDriveの新しいフォルダーへコピーします。
OneDriveからGoogle Driveへ転送するには、移行元と移行先を入れ替えます。個別の移行ごとに、異なる状態ファイルと移行先ルートを使用してください。チェックポイントには移行元プロバイダー、移行先プロバイダー、ルートが関連付けられており、設定が一致しない場合は再開されません。
export MICROSOFT_CLIENT_ID="your-public-client-id"
python fileark-cloud-transfer.py \
--source google \
--destination onedrive \
--google-client-secret ./client_secret.json \
--microsoft-tenant common \
--destination-root "FileArk Manual Transfer 2026-07-25" \
--batch-gib 8 \
--batch-files 200 \
--local-reserve-gib 15 \
--destination-reserve-gib 10 \
--verification redownloadpython fileark-cloud-transfer.py \
--source onedrive \
--destination google \
--microsoft-client-id "$MICROSOFT_CLIENT_ID" \
--google-client-secret ./client_secret.json \
--destination-root "OneDrive archive 2026-07-25" \
--state-file ./onedrive-to-google-state.json \
--verification redownload容量を複数回確認する理由
転送に時間がかかると、開始前に一度だけ実施した事前チェックの情報は古くなる可能性があります。別のユーザーが移行先に他のファイルをアップロードしたり、エクスポートしたGoogleドキュメントがソースのメタデータから推測されるサイズより大きくなったり、無関係なアプリケーションがローカルディスクを消費したりすることがあります。そのため、このエンジンは開始前に移行先の総空き容量を確認し、各バッチでも移行先の空き容量を確認します。さらに、ローカルへのダウンロード後にも移行先の空き容量を再確認し、各ステージングコピーまたは検証用コピーの前にはローカルディスクの空き容量を確認します。
予約容量の値は運用上の余裕を確保するためのものであり、転送サイズの見積もりではありません。OSのアップデート、プロバイダー側での使用量集計の遅延、同じクラウドクォータを使用する他のユーザーを考慮し、十分に大きな値を設定してください。プロバイダーが有限の残りクォータを公開していない場合、スクリプトは警告を表示し、プロバイダー側の制限適用に委ねます。これは残量が判明している状態での事前チェックより確実性が低いため、継続的な監視が必要です。
def ensure_destination_capacity(quota, required, reserve):
if quota.remaining is None:
LOG.warning("Destination did not report a finite quota")
return
needed = required + reserve
if quota.remaining < needed:
raise RuntimeError(
f"Destination is too small: {human_bytes(quota.remaining)} free, "
f"{human_bytes(needed)} required including reserve."
)ステージング領域の使用量をバイト数とファイル数で制限する
バイト数の上限はディスク使用量を制限し、ファイル数の上限は、移行元に数十万個の小さなオブジェクトが含まれる場合のAPIとファイルシステムのオーバーヘッドを抑えます。バッチ上限を超える大きさのファイルは、1ファイルだけのバッチとして処理できます。そのため、予約容量は最大の単一オブジェクトに対応できる大きさに設定する必要があります。
デフォルトのチャンクサイズは10 MiBです。これは、Google Driveの再開可能アップロードの粒度である256 KiBと、Microsoft Graphで連続フラグメントに求められる320 KiBの公倍数です。コマンドライン検証機能は、互換性のないチャンクサイズを認証前に拒否します。
def batches(files, max_bytes, max_files):
batch, batch_size = [], 0
for item in files:
planned_size = max(item.size, 1)
if batch and (
len(batch) >= max_files
or batch_size + planned_size > max_bytes
):
yield batch
batch, batch_size = [], 0
batch.append(item)
batch_size += planned_size
if batch:
yield batchGoogleネイティブ形式のドキュメントを変換して処理する
Google ドキュメント、スプレッドシート、スライド、図形描画、Apps Scriptプロジェクトは、通常のダウンロード可能なバイトストリームではありません。Googleアダプターは、それぞれをDOCX、XLSX、PPTX、PNG、JSONにエクスポートし、移植可能なファイル拡張子を追加します。フォルダーは走査されますが、ファイルが含まれていない限り、空のオブジェクトとしてはアップロードされません。
変換によって、フォント、数式、コメント、埋め込みオブジェクト、ページレイアウト、共同編集の履歴が変わる可能性があります。また、Googleのエクスポートエンドポイントには、形式とサイズに関する制約があります。スクリプトは、代替表現を勝手に生成するのではなく、対応していないネイティブ形式を警告付きでスキップします。代表的な変換済みファイルを手動で確認してください。
ショートカット、共有ドライブ、共有されているもののマイドライブ内にはないファイル、OneNoteパッケージ、組織の保持メタデータ、バージョン履歴、共有ACLは、このエディションの対象外です。このような制約があるため、ファイルのコピーを完全なテナント移行と表現することはできません。
バイト単位の完全一致には、移行先からの完全な再ダウンロード検証を使用する
プロバイダー側でアップロードが成功することは必要条件ですが、それだけでは十分ではありません。アップロード後、スクリプトはまず移行先メタデータのサイズとステージング済みファイルのサイズを比較します。デフォルトの再ダウンロードモードでは、続いて移行先オブジェクトを同じディレクトリ内の一時ファイルへダウンロードし、SHA-256を計算して、そのダイジェストをステージング済みソースのダイジェストと比較します。
サイズとダイジェストの両方が一致した場合にのみ、チェックポイントに記録されます。チェックポイントには、移行元ID、移行元から報告されたサイズ、移行先ID、移行先パス、実際のバイト数、双方のダイジェスト、UTCでの完了時刻が記録されます。チェックポイントに記録された移行元パスが後から別のIDまたはサイズを指すようになった場合、変更されたデータを暗黙にスキップせず、スクリプトは停止します。
再ダウンロードを行うと移行先側の読み取りトラフィックが2倍になり、ステージング済みファイルと検証用コピーの両方を一時的に保存する容量が必要になります。このコストを理解し、独立したコンテンツ検証プロセスを用意している場合にのみ、メタデータモードを選択してください。
destination.redownload(uploaded, verification_copy)
verification_hash = sha256_file(verification_copy)
if verification_hash != local_hash:
raise RuntimeError(
f"SHA-256 mismatch after destination re-download: {relative!r}."
)
state["completed"][relative] = {
"source_id": item.id,
"destination_id": uploaded.id,
"bytes": actual_size,
"sha256": local_hash,
"destination_sha256": verification_hash,
}不確実な状態を成功と見なさずに再開する
プログラムは、一時ファイルへの書き込みと名前変更によって状態をアトミックに保存します。検証済みの項目がローカルのステージング領域から削除されるのは、その永続的な書き込みが完了した後だけです。同じコマンドを再実行すると、チェックポイントに記録済みの項目をスキップし、未処理のパスから続行します。
プロバイダーがアップロードを受け入れた後、チェックポイントが書き込まれる前にクラッシュする可能性があります。競合時の動作がfailに設定されているため、次回の実行では既存の移行先パスで停止し、上書きしたり、誤って成功と判定したりすることはありません。オブジェクトを調べて比較したうえで、検証済みの復旧エントリを慎重に追加するか、新しい移行先ルートを指定して再実行してください。
OAuthの有効期限切れ、レート制限、一時的なサーバーエラー、中断されたチャンクは、設定された上限の範囲内で再試行されます。認証エラーや継続的な権限エラーが発生した場合、プログラムは停止します。障害の原因を把握するまでは、ログ、チェックポイント、ステージング領域の内容を保持してください。
実運用に即した受け入れテストを行う
- まずは、空のファイル、大きなファイル、深い階層のパス、Unicode名、Googleネイティブ形式のドキュメントを含む小さなフォルダーから始めてください。
- 最初に--dry-runを実行し、インベントリの合計バイト数をプロバイダーの画面に表示される値と比較してください。
- 最初の本番バッチでは、ローカルの空き容量と移行先のクォータを個別に監視してください。
- 再ダウンロード検証を有効にしたままにし、チェックポイントを移行記録とともにアーカイブしてください。
- 移行先にある代表的なPDF、Officeファイル、画像、動画、アーカイブ、変換済みのGoogleネイティブ形式ドキュメントを開いて確認します。
- 想定されるフォルダー数とファイル数を比較し、スキップまたは失敗したすべての項目を調査して、別のユーザーからのアクセスもテストしてください。
- あらかじめ定めた併存期間中は、移行元を変更せずに維持してください。このスクリプトが移行元を削除することはありません。
よくある質問
このPythonスクリプトが移行元のファイルを削除することはありますか?
いいえ。ソースを削除する機能は実装されていません。エンジンはソースからダウンロードし、別の移行先ルートへ書き込みます。検証に成功しても、削除されるのは一時的なローカルのステージングコピーだけです。
双方向に転送できますか?
はい。Google DriveまたはOneDriveの一方を移行元、もう一方を移行先に設定します。移行ごとに一意のチェックポイントと移行先ルートを使用してください。
共有権限とファイル履歴は保持されますか?
いいえ。このエディションがコピーするのは、現在のファイル内容とフォルダーパスです。共有ACL、公開リンク、バージョン、コメント、ラベル、保持ポリシー、組織固有のメタデータについては、別途移行と検証が必要です。
アップロード直後のファイルを再ダウンロードするのはなぜですか?
アップロードが受け入れられ、メタデータ上のサイズが一致していても、移行先から正確なバイト列を読み戻せることの証明にはなりません。再ダウンロードモードでは移行先のコンテンツからSHA-256を計算し、完全に一致した場合にのみチェックポイントへ記録します。
これはGoogleまたはMicrosoftの公式ツールですか?
いいえ。これはMITライセンスで公開されている、FileArkによる独立したリファレンス実装です。コードを確認し、重要でないデータでテストしたうえで、プロバイダーと組織のポリシーに従ってください。
このガイドで参照した公式情報
- Google Workspace ラーニング センター:OneDriveからGoogle Driveへの移行
- Google Drive ヘルプ:保存容量とファイルの動作
- Microsoft サポート:OneDriveへのファイルのアップロードと保存
- Google Drive API:ファイルのダウンロードとエクスポート
- Google Drive API:再開可能なアップロード
- Google Drive API:ストレージクォータのフィールド
- Microsoft Graph:ドライブ直下の項目を一覧表示
- Microsoft Graph:再開可能なアップロードセッションを作成
- Microsoft Graph:OneDriveのクォータリソース