[Google Drive API v3] Javaでユーザーや共有ドライブ、ファイルの変更履歴を取得する

Google Drive API v3（Java）を使用して、
Driveに格納されているファイルの変更履歴を取得する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Drive API v3] JavaでDrive APIを使う](https://qiita.com/doran/items/15b2c59adb410ddeeb8a)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[変更履歴の開始トークンを取得](#1-変更履歴の開始トークンを取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[変更履歴リストを取得](#2-変更履歴リストを取得)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. 変更履歴の開始トークンを取得
変更履歴の開始トークンを取得します。
この開始トークンは変更履歴リストを取得する際に必要になります。

[2. 変更履歴リストを取得](#2-変更履歴リストを取得)で取得できる変更履歴は、
この開始トークンを取得した時点を開始とし、それ以降に変更された内容になります。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。

DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_METADATA_READONLY
DriveScopes.DRIVE_PHOTOS_READONLY
DriveScopes.DRIVE_READONLY

[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行
```
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Changes changes = drive.changes();
    
    Drive.Changes.GetStartPageToken token = changes.getStartPageToken();
    
    StartPageToken res = token.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//www.googleapis.com/drive/v3/changes/startPageToken
が実行されます。

#### 1.2.2. クエリパラメータ
Drive.Changes.GetStartPageTokenのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setDriveId|String|取得したい開始トークンの共有ドライブID|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|

### 1.3. レスポンスの内容
#### StartPageToken

|メソッド|戻り値|説明|
|---|---|---|
|getStartPageToken|String|開始トークン|
|getKind|String|リソースの種類<br>固定文字列："drive#startPageToken"|

## 2. 変更履歴リストを取得

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。

DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_METADATA_READONLY
DriveScopes.DRIVE_PHOTOS_READONLY
DriveScopes.DRIVE_READONLY

[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行
変更履歴リストを取得するには開始トークンを指定します。
開始トークンを取得した時点から後の変更履歴が取得できます。
開始トークンの取得は、[1. 変更履歴の開始トークンを取得](#1-変更履歴の開始トークンを取得)を参照ください。

setFieldsで取得したいフィールド（[ChangeList](#changelist)）を指定できます。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

レスポンスの[getNextPageToken](#changelist)がNULLではない場合、
全てのリストが取得できていません。
[クエリパラメータのsetPageToken](#222-クエリパラメータ)に取得できた値を設定し、
再度APIを実行します。
```
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Changes changes = drive.changes();
    
    Drive.Changes.List list = changes.list("開始トークン");
    list.setFields(*);
    
//レスポンスのgetNextPageTokenがNULLではない場合
//labels.setPageToken("レスポンスのgetNextPageToken");

    ChangeList res = list.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
GET:　https:\//www.googleapis.com/drive/v3/changes
が実行されます。

#### 2.2.2. クエリパラメータ
Drive.Changes.Listのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setPageSize|Integer|ページごとに返される変更の最大数|
|setPageToken|String|次のページで前のリスト要求を継続するためのトークン<br>**レスポンスのgetNextPageTokenで取得が可能**|
|setDriveId|String|変更が返される共有ドライブID|
|setIncludeCorpusRemovals|Boolean|削除されたファイルも対象にするか|
|setIncludeItemsFromAllDrives|Boolean|マイドライブと共有ドライブの両方を含めるか|
|setIncludeRemoved|Boolean|削除やアクセスの喪失などによって項目が変更リストから削除されたことを示す変更を含めるか|
|setRestrictToMyDrive|Boolean|結果をマイドライブ階層内の変更に制限するか|
|setSpaces|String|[space](#space)のカンマ区切りのリスト<br>drive、appDataFolderのみ|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|

#### space

|定義値|内容|
|---|---|
|drive|Googleドライブ内
|appDataFolder|アプリのデータフォルダ|
|photos|Googleフォト内|

### 2.3. レスポンスの内容
#### ChangeList

|フィールド|メソッド|戻り値|説明|
|---|---|---|---|
|kind|getKind|String|リソースの種類<br>固定文字列："drive#changeList"|
|nextPageToken|getNextPageToken|String|次のページのページトークン<br>リストの最後の場合はNULL|
|newStartPageToken|getNewStartPageToken|String|開始トークン|
|changes|getChanges|List\<[Change](#change)\>|変更のリスト|

#### Change

|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："drive#change"|
|getRemoved|Boolean|ファイルまたは共有ドライブが、削除またはアクセスの喪失などによって、この変更リストから削除されたか|
|getFile|[File](#file)|ファイルの更新された状態|
|getFileId|String|変更されたファイルのID|
|getTime|String|この変更の時刻|
|getDriveId|String|この変更に関連付けられた共有ドライブのID|
|getChangeType|String|変更の種類<br>file か drive|
|getDrive|[Drive](#drive)|共有ドライブの更新された状態|

#### File
[⧉[Google Drive API v3] JavaでDriveのファイルの情報を取得する(File)](https://qiita.com/doran/items/95060585b9745a568dcb#file)
を参照ください。

#### Drive
[⧉[Google Drive API v3] Javaで共有ドライブの情報を取得する(Drive)](https://qiita.com/doran/items/3f04743209ed29dd9b13#drive)

を参照ください。

<br>
<br>
おしまい。。