Как найти всю иерархию родительских папок для файла Google Drive? - PullRequest
0 голосов

Я могу использовать Google Drive API для этого:

drive.files.get(
  {
    fields: "parents",
    fileId: "######"
  },
  (err, results) => {
    ...
  }
);

Однако я могу получить только идентификатор папки, на один уровень выше от файла.

Как можноЯ получаю всю иерархию родительских папок, в которых содержится файл Google Диска, папку, в которой находится папка, папка, в которой находится эта папка и т. Д.

1 Ответ

0 голосов
/ 20 мая 2018

Как насчет этого метода?Я думаю, что есть несколько решений для вашей ситуации.Поэтому, пожалуйста, подумайте об этом как об одном из них.К сожалению, все папки, включая подпапки в папке, не могут быть получены с помощью files.get Drive API.И когда q используется для files.list Drive API, 'folder ID' in parents получает только папки с идентификатором папки.Папки в подпапке в идентификаторе папки не могут быть получены.Поэтому в этом методе я использовал следующий поток:

  1. Получить все папки на Google Диске.
    • В этом примере сценария, если количество папок на вашем Google Диске меньше 1000, все папки извлекаются одним вызовом API.Если количество папок от 1000 до 2000, используются 2 вызова API.
  2. Создание дерева папок с использованием списка всех папок.

Примерскрипт:

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

Этот скрипт создает массив следующим образом.

[
  ['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"]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...