Google Drive API v2 を使用しています。
API に含まれている検索機能を使用して、検索機能を実装しようとしています。
「children.list」は再帰的ではないようです。つまり、すべてのサブフォルダーを調べているわけではありません。フォルダーの子参照ごとに、API への複数の呼び出しを介して実装する必要がありますか? それとも、ここで何か不足していますか?
ご協力いただきありがとうございます。
Google Drive API v2 を使用しています。
API に含まれている検索機能を使用して、検索機能を実装しようとしています。
「children.list」は再帰的ではないようです。つまり、すべてのサブフォルダーを調べているわけではありません。フォルダーの子参照ごとに、API への複数の呼び出しを介して実装する必要がありますか? それとも、ここで何か不足していますか?
ご協力いただきありがとうございます。
私の知る限り、children.listもfiles.listも再帰的なリストをサポートしているので、あなたが言ったようにこれを実装する必要があると思います。以前のバージョンのドライブ(まだドキュメントと呼ばれていたとき)では、ファイルを複数の「ラベル」(まだフォルダではなくラベルがありました)に含めることができ、そのプロパティを保持している残りのファイルが可能であるため、この動作はGoogleによって行われる可能性があります無限ループの場合は種類を引き起こします
ChildReferences のリストを取得すると、実際にファイルを取得しない限り、それらがフォルダーであるかどうかを判断できません。したがって、大規模な再帰検索を行う場合は、バッチ処理を使用してこれを実現する必要があります。フォルダー内のすべてのファイルの所有者を再帰的に変更する方法を作成しました。これが役立つ場合があります。
private void updateFolderOwner(String folderId, final String newOwnerEmail) throws IOException{
String permissionId = service.permissions().getIdForEmail(newOwnerEmail).execute().getId();
Children.List request = service.children().list(folderId);
JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>() {
@Override
public void onSuccess(Permission permission, HttpHeaders responseHeaders) {}
@Override
public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) {
System.out.println("Error Message: " + e.getMessage());
}
};
JsonBatchCallback<File> findFolderCallback = new JsonBatchCallback<File>() {
@Override
public void onSuccess(File file, HttpHeaders responseHeaders) throws IOException {
if (file != null) {
String fileExtension = file.getFileExtension();
String mimeType = file.getMimeType();
if (mimeType != null && mimeType.equals("application/vnd.google-apps.folder") && (fileExtension == null || fileExtension.equals(""))) {
//Recursively search this folder...
updateFolderOwner(file.getId(),newOwnerEmail);
}
}
}
@Override
public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) {
System.out.println("Error Message: " + e.getMessage());
}
};
do {
try {
ChildList children = request.execute();
BatchRequest changeOwnerBatch = service.batch();
BatchRequest findFolderBatch = service.batch();
Permission permission = new Permission();
permission.setEmailAddress(newOwnerEmail);
permission.setValue(newOwnerEmail);
permission.setType("user");
permission.setRole("owner");
for (ChildReference child : children.getItems()) {
service.files().get(child.getId()).queue(findFolderBatch, findFolderCallback);
service.permissions().update(child.getId(), permissionId, permission).setTransferOwnership(true).queue(changeOwnerBatch, callback);
}
changeOwnerBatch.execute();
findFolderBatch.execute();
request.setPageToken(children.getNextPageToken());
} catch (IOException e) {
System.out.println("An error occurred: " + e);
request.setPageToken(null);
}
} while (request.getPageToken() != null && request.getPageToken().length() > 0);
}