【Python】Pydrive2.0でGoogleDrive上のファイルの共有設定を取得、変更する

こんにちは!

今日はPydrive2でドライブ上のファイルの共有設定を取得したり、変更したりする方法を書いていきます

Pydrive2はGoogleDriveAPI V2のラッパーライブラリでちょっととっつきにくいDriveAPIを使用しやすくしてくれます。

ただ、最新のDriveAPIはV3

その辺りの影響か、挙動がいまいち理解できなかったところ(動作には問題なし)もあるのでそちらについても細くしながら書いていきます。

【開発環境】

  • WSL2 (Window でLinuxを使えるサービス)
  • Ubuntu 20.04
  • Python3.8.0
  • Pydrive2 1.10.0

なお、Pydrive2を使用するための認証設定は、以下のページをご参照ください。

関連記事

こんにちは! PythonでGoogleドライブを操作するために使われるライブラリ、Pydrive2の使い方をまとめていきたいと思います。 公式のドキュメント、GitHubを参照にしているので、詳しく知りたい方はそちらをご覧ください。 【開[…]

ドライブファイルの共有設定を取得する

# Pydriveでまずは認証
from pydrive2.drive import GoogleDrive
from pydrive2.auth import GoogleAuth
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

file_id = "xxxxxxxxxxxxxxxxxxxxxxxx" # 共有設定を取得したいドライブファイルID

# ファイルIDを指定して共有権限を取得
response = drive.auth.service.permissions().list(
    fileId=file_id
).execute()

permissions = response["items"]

ドライブ上のファイルの共有設定を取得するには、Permissions:listメソッドを使います。

Permissions.getというメソッドもあるのですが、こっちはあまり使用することがなさそうなメソッドになっています。

どういうことかと言うと、、、私たちがファイルの共有設定を変更しようとすると、こんな風な画面になりますよね。

共有が複数に設定されていれば、ここの画面に共有しているユーザーのリストが表示されます。

そして、このユーザーリストを取得できるのが、Permissions:listメソッドなんですね。

Permissions:getメソッドは、1ユーザーの共有設定を取得してくるメソッドになってます。

ただ、1ユーザーの共有設定を取得することってあまりないですよね。また、permissionIdという1ファイル、1ユーザーに固有のIDを指定しないとgetメソッドは使えず、使い勝手もあまり良くないな~という印象です。

というわけで、Permissons:listを使いましょう。

Permissions:listを使った返り値はこうなります。なお、こちらは、Drive API V2での使用なので、V3だと異なるため注意です。

{
  "kind": "drive#permissionList",
  "etag": etag,
  "selfLink": string,
  "nextPageToken": string,
  "items": [
    permissions Resource
  ]
}

itemsの中に、パーミッションリストが入っているので、response[“items”]としてあげれば、共有しているユーザー一覧が取得できます!

ちなみに、このPermissions Resourceの値だけ、なぜかDrive API V3の定義になっていました。原因は不明です💦

このちょっとした差異により、後述する特定のファイルの共有設定を他のファイルにコピーする、という操作でやや工夫が必要になりました。

ドライブファイルの共有設定を追加する

# Pydriveでまずは認証
from pydrive2.drive import GoogleDrive
from pydrive2.auth import GoogleAuth
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

file_id = "xxxxxxxxxxxxxxxxxxxxxxxx" # 共有設定を追加したいドライブファイルID

# ファイルIDを指定して共有権限を追加
# ユーザーの共有情報を設定
body = {
  "type": "reader", # 必須 owner, writer, readerなど選べる
  "role": "user", # 必須 user, group, domainなどアカンとタイプを選べる
  "value": "xxxx@gmail.com", # 共有したい人のアドレスを入力。必須ではないらしい。
}

permission = drive.auth.service.permissions().insert(
    fileId=file_id,
    sendNotificationEmails=False, # 共有設定をした相手にメール通知をするかどうかのオプション
    body = body
).execute()

ファイルに共有設定を追加するには、Permissions:insertを使います。(V3だとPermissions:create

渡す値については、公式ドキュメントを参照してください。bodyの中に辞書型で入れてあげれば、他の設定を追加することができます。

複数のユーザーをまとめて追加するメソッドはないため、複数人を追加したければ、for文などで、複数回Permissions:insertを実行しましょう。

1つのファイルの共有設定を他のファイルにコピーする

最後に、これまで解説してきたことを合わせて、一つのファイルの共有設定を他のファイルにコピーする方法を解説します。

# Pydriveでまずは認証
from pydrive2.drive import GoogleDrive
from pydrive2.auth import GoogleAuth
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

file_id = "xxxxxxxxxxxxxxxxxxxxxxxx" # 共有設定を追加したいドライブファイルID
# 共有権限一覧を取得
response = drive.auth.service.permissions().list(
    fileId=file_id
).execute()

permissions = response["items"]

# 取得した共有権限の一覧から、type, role, emailAddress(←注意)を取得し、insertで渡すbodyを作る。
bodys = {} # 共有設定一覧を保管する

for permission in permissions:
  body = {}
  body["type"] = user["type"]
  body["role"] = user["role"]
  body["value"] = user["emailAddress"] # V2ならvalueがキーのはずだが、なぜかV3の仕様のemailAddressで取得される

# for文でPermissions:insertを実行
for body in bodys:
  drive.auth.service.permissions().insert(
    fileId=file_id,
    sendNotificationEmails=False,
    body = body
  ).execute()

こちらの書き方で、一つのファイルの共有設定を、もう一つのファイルにコピーすることができます。

コードのコメントでも書いたのですが、V2のPermissions:listでは、ユーザーのメースアドレスは、valueをキーで取り出せるはずなのですが、なぜかV3のemailAddressで格納されています。

何かのバグかなと思ってはいるのですが、皆さんもご注意ください。

以上、 pydrive  でファイルの共有設定を変更する方法を書いてみました。

ほとんどPydriveのメソッドは使っていない、、、ということは気にしないでくださると💦

最新情報をチェックしよう!