Как насчет этого метода?Я думаю, что есть несколько решений для вашей ситуации.Поэтому, пожалуйста, подумайте об этом как об одном из них.К сожалению, все папки, включая подпапки в папке, не могут быть получены с помощью files.get
Drive API.И когда q
используется для files.list
Drive API, 'folder ID' in parents
получает только папки с идентификатором папки.Папки в подпапке в идентификаторе папки не могут быть получены.Поэтому в этом методе я использовал следующий поток:
- Получить все папки на Google Диске.
- В этом примере сценария, если количество папок на вашем Google Диске меньше 1000, все папки извлекаются одним вызовом API.Если количество папок от 1000 до 2000, используются 2 вызова API.
- Создание дерева папок с использованием списка всех папок.
Примерскрипт:
function run(auth) {
var drive = google.drive({version: 'v3', auth: auth});
getFolderTree(drive, "", []);
}
function getFolderTree(drive, nextPageToken, folderList) {
drive.files.list({
pageToken: nextPageToken ? nextPageToken : "",
pageSize: 1000,
q: "mimeType='application/vnd.google-apps.folder'",
fields: "files(id,parents),nextPageToken",
}, (err, {data}) => {
if (err) return console.log('The API returned an error: ' + err);
const token = data.nextPageToken;
Array.prototype.push.apply(folderList, data.files);
if (token) {
getFolderTree(drive, token, folderList);
} else {
// This script retrieves all folders including subfolders under this folder ID.
const folderId = "### Top folder ID ###";
const folderTree = function c(folder, folderSt, res) {
let ar = folderList.filter(e => e.parents[0] == folder);
folderSt += folder + "#_aabbccddee_#";
let arrayFolderSt = folderSt.split("#_aabbccddee_#");
arrayFolderSt.pop();
res.push(arrayFolderSt);
ar.length == 0 && (folderSt = "");
ar.forEach(e => c(e.id, folderSt, res));
return res;
}(folderId, "", []);
// Output the folder tree.
console.log(folderTree);
}
});
}
Вывод:
Когда структура папок выглядит следующим образом.(Вы можете установить идентификатор верхней папки в этом примере скрипта.)
![enter image description here](https://i.stack.imgur.com/XkOoJ.png)
Этот скрипт создает массив следующим образом.
[
['topFolderId'],
['topFolderId','folderId_2a'],
['topFolderId','folderId_2b'],
['topFolderId','folderId_2b','folderId_3a'],
['topFolderId','folderId_2b','folderId_3b']
]
Примечание:
- Я подтвердил, что этот пример сценария работает на googleapis с версией 30.0.0.
- Как правило, дерево папок создается путем извлечения папок из верхней папки впорядок.Но когда в этой ситуации используется Drive API, если в верхней папке много папок, требуется вызов большого количества API.Таким образом, в этом методе я попытался создать дерево папок с небольшим количеством вызовов API, используя список всех папок.
- Это простой пример сценария, поэтому, пожалуйста, измените его в своей среде.
Ссылки:
Если это не помогло в вашей ситуации, извините.
Редактировать:
Этот обновленный скрипт извлекает вседерево папок, включая введенный идентификатор папки.Для приведенного выше сценария были изменены run()
и getFolderTree()
.
function run(auth) {
var drive = google.drive({version: 'v3', auth: auth});
drive.files.get({fileId: "root", fields: "id"}, (err, {data}) => {
getFolderTree(drive, "", [], data.id);
});
}
function getFolderTree(drive, nextPageToken, folderList, rootId) {
drive.files.list({
pageToken: nextPageToken ? nextPageToken : "",
pageSize: 1000,
q: "mimeType='application/vnd.google-apps.folder'",
fields: "files(id,name,parents),nextPageToken",
}, (err, {data}) => {
if (err) return console.log('The API returned an error: ' + err);
const token = data.nextPageToken;
Array.prototype.push.apply(folderList, data.files);
if (token) {
getFolderTree(drive, token, folderList, rootId);
} else {
// Please input folder ID.
const inputId = "### Folder ID ###";
const folderId = rootId;
const folderTree = function c(folder, folderSt, res) {
let ar = folderList.filter(e => e.parents[0] == folder);
folderSt += folder + "#_aabbccddee_#";
let arrayFolderSt = folderSt.split("#_aabbccddee_#");
arrayFolderSt.pop();
res.push(arrayFolderSt);
ar.length == 0 && (folderSt = "");
ar.forEach(e => c(e.id, folderSt, res));
return res;
}(folderId, "", []);
let result = folderTree.filter(e => ~e.indexOf(inputId));
if (result.length > 2) result.shift();
// Output result.
console.log(result);
}
});
}
Для вышеупомянутого, когда folderId_2b
введено в inputId
, можно получить следующий результат.
[
["topFolderId","folderId_2b","folderId_3a"],
["topFolderId","folderId_2b","folderId_3b"]
]