👏
Drive API × 共有ドライブでハマったことまとめ
こちらは株式会社ガラパゴス(有志) Advent Calendar 2025の8日目の記事です。
お仕事で共有ドライブとDrive APIを使うことがあったので、備忘録も兼ねて、、、
なぜ共有ドライブを使う必要があったか
サービスアカウントからは「個人の My ドライブ」には直接書き込めないため、
認可フローなしでファイルを作るには、
- 共有ドライブを作る
- サービスアカウントをメンバー招待
- 権限(コンテンツ管理者など)を付与
という構成が必要でした。
共有ドライブと「共有されたファイル」の違い
まずここから若干ハマりポイントな気がしましたが、、
共有ドライブのアイテムと通常のファイルとでは所有権に関して大分仕様が異なりました。
共有ドライブ
- ファイルは個人所有ではない
- 権限はドライブ単位(管理者/コンテンツ管理者など)
- 上記に加え、通常ファイル同様にファイル単位でもロール追加可能
通常ファイル(My ドライブ)
- ファイルは個人所有
- ファイル単位で共有権限を設定
またDriveのUI上に表示されている「共有アイテム」はただ共有されてるファイル一覧で、共有ドライブとは別物です。(ややこしい、、、)
Drive API使用時はsupportsAllDrives: true が必要
共有ドライブ内のファイル操作には supportsAllDrives: true を付けないと怒られます。
例(コピー):
await drive.files.copy({
fileId: originalFileId,
requestBody: { name: title },
supportsAllDrives: true,
});
運良くドキュメント眺めてて見つけられましたが、説明がこんな感じ。うーーん。
supportsAllDrives: リクエスト元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているかどうか。
ファイル移動は addParent と removeParent を同時に行う
一番ハマったのがこちら。ファイルを作成後、特定のフォルダ配下に移動したいケースです。
// ❌
await drive.files.update({
fileId,
addParents: targetFolderId,
supportsAllDrives: true,
});
こちらのコードだと以下のように怒られが発生します。
A shared drive item must have exactly one parent.
正解はこちら。共有ドライブ内のファイル移動だと同時にremoveも必要になります。
(こちらは公式ドキュメントには記載なく苦労しました、、、)
await drive.files.update({
fileId,
addParents: targetFolderId,
removeParents: sourceFolderId,
supportsAllDrives: true,
});
なお、共有ドライブから個人ドライブへの移動(ショートカット作成)に関しては以下の方法が使えるようです。
おわり
まとめ
- サービスアカウントでファイル作成するなら共有ドライブを利用する必要がある
- Drive APIでは
supportsAllDrives: trueを指定する - 共有ドライブ内でのファイル移動は
addParentsとremoveParentsをセットで指定する
Discussion