共有ドライブに対してGoogle Drive APIを実行する際のオプション指定について
この記事について
共有ドライブを操作する場合はsupportsAllDrives
というオプションを有効化したりしなかったりする必要があるようなんですが、それに関する情報がなかなか見つからなかったので自分でまとめてみます。
GoogleDriveAPIを有効化するところから書き始めるので、オプションの話だけ読みたい方はこちらまで飛ばしてください。
使用言語はPHPですが、他の言語でも必要なオプション自体は変わらないので、応用は効くと思います。
僕は最初このことを知らず、「設定は大丈夫そうなのに何故ファイルの作成も取得もできないんだ???」と小一時間悩むことになったので、そういう人が1人でも減れば嬉しいです…
対象者
- Google Drive APIをこれから初めて使う方
- Google Drive APIでファイルをアップロードしたり、アップロードしたファイルにアクセスできなくて困ってる方
- PHP版のライブラリを使っている方(他の言語でも応用はできそう)
動作環境・前提
バージョン | |
---|---|
Mac | 14.7.2 |
チップ | Apple M2 |
PHP | 8.3.6 |
Google Drive APIの有効化と、サービスアカウントの作成
ここでは、Google Cloud コンソール上で行う作業の手順をまとめます。
まだGoogle Cloudのプロジェクトが作成できていない方は、新しいプロジェクトを作成してから以下の手順に移ってください。
①Google Drive APIを有効化する
- ナビゲーションメニューの「APIとサービス」をホバーし、右に出てきたメニューの「ライブラリ」をクリック
- 「API ライブラリへようこそ」という画面が表示されたら、検索ボックスでGoogle Drive APIを検索する
- 検索結果の中から「Google Drive API」をクリックし、開いたページ内で「有効にする」ボタンを押下する
- 「APIが有効です」と表示されたらOK
②サービスアカウントの作成
- ナビゲーションメニューの「APIとサービス」をホバーし、右に出てきたメニューの「認証情報」をクリック
- 認証情報の画面が開いたら、「認証情報を作成」ボタンを押下し、出てきたメニューから「サービスアカウント」を選択
- 「①サービスアカウントの詳細」を入力して、「続行」を押下
- 「②このサービス アカウントにプロジェクトへのアクセスを許可する」で、「ストレージフォルダ編集者」ロールを付与する(無ければ「ストレージフォルダ管理者」も可)
- 付与できたら「続行」を押下。付与し忘れても、以下の手順9でロール付与できるので大丈夫です
- 「③ユーザーにこのサービス アカウントへのアクセスを許可」は何も編集しないで、「完了」を押下
- サービスアカウントが作成できたら、ナビゲーションメニューの「IAMと管理」をホバーし、「IAM」を押下
- 作成したサービスアカウントに、「ストレージフォルダ編集者(or管理者)」のロールが付与できていることを確認する
- もし付与できていなかったら、右にある鉛筆ボタンを押下し、ロールを付与する。付与されていることが確認できたらOK
③認証情報の取得
- ナビゲーションメニューの「APIとサービス」をホバーし、右に出てきたメニューの「認証情報」をクリック
- 2. サービスアカウントの作成で作成したサービスアカウントをクリックし、開いたページで「鍵」をクリック
- 開いたタブ内で「キーを追加」ボタンを押下し、JSON形式で鍵を作成する
- JSONファイルがダウンロードできたらOK
Google Driveにフォルダを用意する
ここでは、これからAPIで操作する対象となるGoogleDriveフォルダを作成していきます。
既に使用するフォルダを作成済みの場合は、以下の手順2まで飛ばしてください。
- 共有ドライブ内に、新しいフォルダを作成する
- 作成したフォルダを右クリックし、「共有」をホバーし、出てきたメニューから「共有」クリックする
- 「(フォルダ名)を共有」のモーダルが表示されたら、前節の2. サービスアカウントの作成で作成したサービスアカウントのメールアドレスをコピペし、「完了」を押下
プロジェクトでコードを実装する
ここでは、いよいよコードの実装を行います。
だいたい以下のディレクトリ構成になっているイメージで話を進めます。
.
├── .env
├── composer.json
├── credentials/
└── app/
※ あくまでサンプルなので、環境変数とか認証情報の置き場所とかはテキトーです
①環境変数を設定する
- 前々節の③認証情報の取得で作成したJSON形式の認証ファイルを用意する
- 認証ファイルを
credentials
配下に置く -
.env
に以下の形式で、手順2で配置した認証ファイルのプロジェクトrootからのpathを追記する
# 例
GOOGLE_APPLICATION_CREDENTIALS="/credentials/認証情報ファイル名"
②ライブラリをインストールする
- ターミナルで
composer require google/apiclient
を実行する
google/apiclientとは
PHP用のGoogleAPIクライアントライブラリです。
③APIを実行するサービスを作成する
- 以下のようなサービスクラスを作成する
<?php
declare(strict_types=1);
namespace src\googleDriveApi;
use Google\Client;
use Google\Service\Drive;
class GoogleDriveFolderService
{
private Client $client;
private Drive $drive;
public function __construct()
{
$this->client = new Client();
$this->client->useApplicationDefaultCredentials(); // これを書くと、.envのGOOGLE_APPLICATION_CREDENTIALSを勝手に読み込んでくれる
$this->client->setScopes([Drive::DRIVE]); // scopeをGoogleDriveにする
$this->drive = new Drive($this->client);
}
}
- このクラスの中で、Google Drive APIを実行するコードを書いていく↓
ファイル・フォルダを作成する
public function createFile($content): void
{
$postBody = new DriveFile([
'name' => 'テストファイル',
'parents' => ['00000000000000000000000000000'], // 親フォルダのID(任意)
]);
$optParams = [
'data' => $content, // アップロードするコンテンツ(フォルダ作成の場合は不要)
'mimeType' => 'application/pdf',
'supportsAllDrives' => true,
];
$this->drive->files->create(
$postBody,
$optParams
);
}
親フォルダのIDを指定すると、その配下に新しいフォルダを作成してくれます。
IDは、親フォルダを開いたときのURLの以下の部分を見るとわかります。
また、ファイル・フォルダの作成時は、supportsAllDrives
を有効(=True)にする必要があります!
これがないと、File not found
のエラーになってしまいます。
ファイルIDからファイル・フォルダを取得する
public function getDriveFileById(string $fileId): DriveFile
{
$optParams = [
'supportsAllDrives' => true,
];
return $this->drive->files->get(
$fileId, // ファイルID
$optParams,
);
}
ファイルIDからファイル・フォルダを取得する(getメソッドを使う)場合も、supportsAllDrives
を有効(=True)にする必要があります!
最後に
今回は、共有ドライブでGoogle Drive APIを実行する際の手順をまとめました。
Cloudコンソールであれこれやったりライブラリを使う際に必須のオプションがあったりしてちょっと面倒ですが、慣れたら流れ作業でできそうです。
また、今回はサービスアカウントに「ストレージフォルダ編集者or管理者」ロールを付与して試しましたが、実際はもっと小さいロールでも実行できるのかもしれないなと思っています。
このあたりは、また別の機会に調べてみたいですね。
あと、そもそも「ストレージフォルダ」ってCloudStorageのことでは?なんでこれでGoogleDriveAPIが叩けるんだ?という疑問もあるので、そこも解消したいです。
GoogleCloud詳しい方、ぜひコメントで教えてください!
参考にさせていただいた記事

株式会社 カラビナテクノロジーは「命綱や支点を素早く確実に繋ぐカラビナ。そんなカラビナのような役割をテクノロジーで実現したい」という想いのもと、福岡で設立。 主にシステム開発・アプリ開発・ Webサイト制作を行っています。採用情報→karabiner.tech/career
Discussion