こんにちは。
GMOアドマーケティングのT.Mです。
はじめに
Rubyでチームドライブにファイルをアップロードする方法をご紹介します。
チームドライブについて
Googleドライブを使っている方も多いと思います。
個人の場合は「マイドライブ」という名前になっていると思いますが、
企業で「G Suite」を使っていると「チームドライブ」という機能が使えるようになります。
このチームドライブは、マイドライブと同様にファイルのアップロードやスプレッドシートの作成、メンバとのファイル共有などできることは一緒です。
大きな違いはファイルの所属が個人からチームに変わるので、マイドライブの場合メンバの離職時にファイルの引き継ぎが必要でしたが、チームドライブであればファイルの引き継ぎが不要になります。
やってみてできなかったこと
Googleドライブを操作する方法は色々あるので、チームドライブに対しても試してみましたが、
マイドライブに対してはうまくいくものの、チームドライブだと意図しない結果になりました。
gdriveコマンド
GoogleドライブをCUIで操作するためのコマンドgdriveを試しました。
しかし、gdrive listを実行してもチームドライブの参照が出てきませんでした。
google_driveのGem
RubyでGoogleドライブを扱うときはgoogle_driveのGemを使うと思います。
しかし、チームドライブに対して動かすと、ファイルのアップロードはできたものの、ファイル一覧が取得できませんでした。
google-api-client使ってアップロード
最終的にはGoogle APIを叩くことにしました。
Ruby用のGemであるgoogle-api-clientを使います。
Google APIのバージョンはv3になります。
作ったソース全文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
require 'googleauth' require 'google/apis/drive_v3' require 'date' class Drive SERVICE_ACCOUNT_KEY_FILE_PATH = 'サービスアカウントの認証用ファイル.json' SCOPE = 'https://www.googleapis.com/auth/drive' TEAM_DRIVE_ID = 'チームドライブのID' UPLOAD_FILE_NAME = 'アップロードする時のファイル名' # 初期化処理 def initialize authorizer = Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open(SERVICE_ACCOUNT_KEY_FILE_PATH), scope: SCOPE) authorizer.fetch_access_token! @service = Google::Apis::DriveV3::DriveService.new @service.authorization = authorizer end # 一覧取得 def list @service.list_files( corpora: 'teamDrive', team_drive_id: TEAM_DRIVE_ID, q: "name='欲しいファイル名'", spaces: 'drive', fields: 'files(id,trashed)', include_team_drive_items: true, supports_team_drives: true) end # 削除フラグの設定 def set_trashed(file) @service.update_file( file.id, {trashed: true}, supports_team_drives: true) end # アップロード def upload(file_path) file_object = { name: UPLOAD_FILE_NAME, parents: [TEAM_DRIVE_ID], modifiedTime: DateTime.now } @service.create_file( file_object, supports_team_drives: true, upload_source: file_path) end end |
初期化
Gemfileに追加します。
1 |
gem "google-api-client" |
初期化処理部分です。
1 2 3 4 5 6 7 8 9 |
def initialize authorizer = Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open(SERVICE_ACCOUNT_KEY_FILE_PATH), scope: SCOPE) authorizer.fetch_access_token! @service = Google::Apis::DriveV3::DriveService.new @service.authorization = authorizer end |
今回はサービスアカウントを使用するための初期化方法です。
google-api-clientでは、googleauthを使った認証になります。
scopeオプションで指定するものは、ドキュメントから探しました。
一覧取得
一覧取得の方法です。
list_filesを使用します。
1 2 3 4 5 6 7 8 9 10 11 |
# 一覧取得 def list @service.list_files( corpora: 'teamDrive', team_drive_id: TEAM_DRIVE_ID, q: "name='欲しいファイル名'", spaces: 'drive', fields: 'files(id,trashed)', include_team_drive_items: true, supports_team_drives: true) end |
チームドライブ用のパラメータがあるので、適宜設定する必要があります。
corpora・・・クエリが適用される対象を指定します。今回はチームドライブだけを対象にするので’teamDrive’を使います。
team_drive_id・・・検索するチームドライブのIDを指定します。
include_team_drive_items・・・結果の中にチームドライブを含めるかを指定するのでtrueにします。
supports_team_drives・・・リクエストするアプリケーションがチームドライブをサポートしているか指定するのでtrueにします。
アップロード
アップロードの方法です。
create_fileを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# アップロード def upload(file_path) file_object = { name: UPLOAD_FILE_NAME, parents: [TEAM_DRIVE_ID], modifiedTime: DateTime.now } @service.create_file( file_object, supports_team_drives: true, upload_source: file_path) end |
チームドライブ用のパラメータを指定します。
file_object・・・ファイル名等を指定します。parentsキーにチームドライブのIDを指定します。
supports_team_drives・・・リクエストするアプリケーションがチームドライブをサポートしているか指定するのでtrueにします。
削除(trashed付与)
ファイル削除の方法です。
update_fileを使用します。
1 2 3 4 5 6 7 |
# 削除フラグの設定 def set_trashed(file) @service.update_file( file.id, {trashed: true}, supports_team_drives: true) end |
delete_fileを使用しません。
チームドライブでは権限が足りずにエラーになります。(権限によると思います)
通常はあまり強い権限を付与しないと思いますので、完全削除ではなくゴミ箱へ移動という操作をします。
file_object・・・ゴミ箱に移動するのでtrashedにtrueを指定します。
supports_team_drives・・・リクエストするアプリケーションがチームドライブをサポートしているか指定するのでtrueにします。
おわりに
RubyでGoogle APIを使い、チームドライブの操作を行いました。
チームドライブ用に追加でパラメータを指定する必要があることに気づかず、だいぶはまりました。。。
この記事がお役に立てれば幸いです。
以上です。