Power AutomateとPythonで実現するOneDriveとGoogle Driveの同期

## はじめに

クラウドストレージの利用が普及する中、**OneDrive**と**Google Drive**の両方を活用するユーザーも増えています。
私の職場でも来年から仕事でOneDriveを使用する方針に変わりました。
しかしOneDriveの容量は18GBしかありません。対してGoogkeDriveはほぼ無制限に容量があるので、OneDriveのデータをGoogleDriveに入れる事でバックアップをとり気軽にOneDriveを使用したいと思いました。
これらのサービス間でデータを同期させるとなると、手動での操作が煩雑になりがちです。
そこで、**Microsoft Power Automate**と**Pythonスクリプト**を活用して、
OneDriveとGoogle Drive間のデータ同期を自動化する方法について検討してみました。

本記事では、Power AutomateとPythonそれぞれの利点と欠点を比較し、どちらを選択すべきかについて解説します。
これにより、ユーザーは自身のニーズに最適な方法を選択できるようになります。

## Power AutomateによるOneDriveとGoogle Driveの同期

### Power Automateとは

**Power Automate**は、Microsoftが提供するクラウドベースのサービスで、コーディング不要でさまざまなアプリケーションやサービスを連携させ、自動化ワークフロー（フロー）を作成することができます。ユーザーはドラッグ＆ドロップで簡単にフローを構築できるため、技術的な知識がなくても利用しやすいのが特徴です。

### Power Automateでの同期設定

Power Automateを使用すると、OneDriveに保存したデータをGoogle Driveにも自動的に保存するフローを簡単に作成できます。以下は、その基本的な手順です。

1. **Power Automateにサインイン**:
   MicrosoftアカウントでPower Automateにサインインします。

2. **新しいフローの作成**:
   「自動化されたクラウド フロー」を選択し、トリガーとして「OneDriveにファイルが作成されたとき」を設定します。

3. **Google Driveへのファイルアップロード**:
   次に、アクションとして「Google Driveにファイルを作成」を追加し、OneDriveから取得したファイルをGoogle Driveに保存します。

4. **フローの保存とテスト**:
   フローを保存し、OneDriveにファイルをアップロードして正しくGoogle Driveに同期されるかテストします。

### Power Automateの利点

- **ノーコードで簡単**:
  プログラミングの知識がなくても、直感的なインターフェースでフローを作成できます可能

- **迅速な構築**:
  数分でフローを設定でき、一瞬で同期が実現

- **豊富なコネクタ**:
  Microsoft製品だけでなく、多数のサードパーティサービスと連携可能

### Power Automateの欠点

- **高度なカスタマイズの制限**:
  標準的なフローは簡単に作成できますが、複雑なロジックや特殊な要件には対応が難しい場合がある

- **コスト**:
  一部の高度な機能や大量の実行には有料プランが必要

- **特定の機能の不足**:
  例えば、OneDriveからファイルを削除した場合にGoogle Driveからも自動的に削除する機能は標準では提供されていない

## PythonスクリプトによるOneDriveとGoogle Driveの同期

### Pythonを選ぶ理由

一方で、**Python**を使用すれば、より柔軟で高度な同期処理を実現できます。
特に、Power Automateでは実現が難しい削除操作や複雑な同期ロジックを組み込むことが可能です。
ただし、Pythonスクリプトの作成にはそれなりにコードを書く知識が必要となります。

### 必要なライブラリ

PythonでOneDriveとGoogle Driveを同期するためには、以下のライブラリを使いました。

- **requests**: HTTPリクエストを送信するためのライブラリ
- **PyDrive2**: Google Drive APIと連携するためのライブラリ
- **msal**: Microsoft Graph API用の認証ライブラリ

### 実装手順

#### 1. 認証とAPIセットアップ

- **Microsoft Graph API**:
  Azureポータルでアプリケーションを登録し、OneDriveへのアクセス許可を設定

- **Google Drive API**:
  Google Cloud Consoleでプロジェクトを作成し、Google Drive APIを有効化し、OAuth 2.0クライアントIDを取得

#### 2. ファイルの同期

以下に、OneDriveからGoogle Driveへファイルを転送する基本的なスクリプト例を示します。

```python:OneDrive-GooglDriv_Sync1.py
from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive
import requests

# OneDrive 認証情報
ONEDRIVE_ACCESS_TOKEN = "YOUR_ONEDRIVE_ACCESS_TOKEN"
ONEDRIVE_FILE_URL = "https://graph.microsoft.com/v1.0/me/drive/root:/YOUR_FILE_PATH:/content"

# Google Drive 認証
gauth = GoogleAuth()
gauth.LocalWebserverAuth()  # 認証プロセスを開始
drive = GoogleDrive(gauth)

# OneDriveからファイルをダウンロード
response = requests.get(ONEDRIVE_FILE_URL, headers={"Authorization": f"Bearer {ONEDRIVE_ACCESS_TOKEN}"})
if response.status_code == 200:
    with open("temp_file", "wb") as file:
        file.write(response.content)

# Google Driveにアップロード
gfile = drive.CreateFile({"title": "Uploaded_File_Name"})
gfile.SetContentFile("temp_file")
gfile.Upload()

print("ファイル転送が完了しました！")
```

次にOneDriveから削除した場合にGoogleDriveからも削除するよう同期するスクリプトです。

``` python:OneDrive-GooglDriv_Sync2.py
from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive
import requests

# OneDrive 認証情報
ONEDRIVE_ACCESS_TOKEN = "YOUR_ONEDRIVE_ACCESS_TOKEN"
ONEDRIVE_FILES_API = "https://graph.microsoft.com/v1.0/me/drive/root/children"

# Google Drive 認証
gauth = GoogleAuth()
gauth.LocalWebserverAuth()  # 認証プロセスを開始
drive = GoogleDrive(gauth)

# OneDriveのファイル一覧を取得
onedrive_response = requests.get(
    ONEDRIVE_FILES_API,
    headers={"Authorization": f"Bearer {ONEDRIVE_ACCESS_TOKEN}"}
)
onedrive_files = {item["name"] for item in onedrive_response.json().get("value", [])}

# Google Driveのファイル一覧を取得
gdrive_files = drive.ListFile({"q": "'root' in parents and trashed=false"}).GetList()
google_drive_files = {file['title']: file['id'] for file in gdrive_files}

# Google DriveからOneDriveにないファイルを削除
for filename, file_id in google_drive_files.items():
    if filename not in onedrive_files:
        print(f"削除中: {filename}...")
        file_to_delete = drive.CreateFile({'id': file_id})
        file_to_delete.Delete()
        print(f"{filename} を削除しました！")

print("同期処理が完了しました。")
```

## Pythonスクリプトの利点

- **柔軟なカスタマイズ**: 複雑な同期ロジックや特定の条件に基づく操作を自由に実装可能
- **高度なエラーハンドリング**: エラー発生時の処理を詳細に制御可能
- **コスト**: 基本的にオープンソースのライブラリを使用するため、追加のコストは発生しない

## Pythonスクリプトの欠点

- **初期設定の複雑さ**: APIの認証設定や必要なライブラリのインストールなど、初期設定に手間がかかる
- **プログラミングの知識が必要**: スクリプトの作成やメンテナンスには、一定のプログラミングスキルが求められる
- **運用管理**: スクリプトを定期的に実行するための環境（サーバーやクラウドランナー）の管理が必要

## Power AutomateとPythonの選択基準

### Power Automateを選ぶべきケース

- **技術的な知識が少ない**: プログラミングの経験がなくても、簡単に同期フローを構築したい場合
- **迅速な導入が必要**: すぐに同期を開始したい場合や、短期間での設定が求められる場合
- **基本的な同期機能で十分**: ファイルの転送のみを行い、削除や複雑な処理が不要な場合

### Pythonを選ぶべきケース

- **高度なカスタマイズが必要**: 特定の条件下での操作や、複雑な同期ロジックを実装したい場合
- **双方向同期や削除機能が必要**: OneDriveでファイルを削除した際にGoogle Driveからも自動的に削除するなど、双方向の同期を行いたい場合
- **コストを抑えたい**: 無料で利用できるオープンソースのツールを活用したい場合
- **柔軟な運用管理が可能**: スクリプトの定期実行や、エラーハンドリングを細かく制御したい場合

## まとめ

**Power Automate**は、ノーコードで迅速にOneDriveとGoogle Drive間の基本的なデータ同期を実現する優れたツールです。
特に、プログラミングの知識がないユーザーや、短期間での導入が求められるケースに適しています。
しかし、削除操作などの高度な機能を実装するには限界があります。

一方、**Pythonスクリプト**は、柔軟で高度な同期処理を実現できます。
プログラミングの知識があるユーザーや、カスタマイズ性を重視する場合に最適です。
ただし、初期設定や運用管理には手間がかかるため、技術的なスキルが必要となります。

最終的には、**自身のニーズと技術レベルに応じて、適切な方法を選択することが重要**です。簡単な同期であればPower Automateを活用し、より高度な同期機能が必要であればPythonスクリプトを検討してみてください。


---

**参考情報**:

- [Microsoft Power Automate 公式サイト](https://flow.microsoft.com/)
- [Microsoft Graph API ドキュメント](https://docs.microsoft.com/ja-jp/graph/overview)
- [Google Drive API ドキュメント](https://developers.google.com/drive)
- [PyDrive2 GitHub リポジトリ](https://github.com/iterative/PyDrive2)