创建个人 files/folders 并立即使用他们的 ID? (Google 驱动 API)

Created individual files/folders and immediately use their Ids? (Google Drive API)

问题的简短版本:

使用 Javascript,我想在一个结构中创建文件夹,确认 any/all/none 个文件夹是否已经存在。因此,给定文件夹名称“A”、“B”、“C”和“D”,创建“A”,将其放入根目录,然后创建“B”,并将其放入“A”,依此类推。问题是,无论我如何构建它,所有文件夹都是异步插入的,这意味着它们没有各自的 ParentIds,它们都在根目录中结束。

长版在制品:

我正在尝试一次创建三个(或更多)文件夹,它们都在同一路径上。

比如我要文件路径为State\City\Street。我首先将文件夹按所需顺序排列在数组中(请注意,在我的最终项目中,这些文件夹不会被硬编码,而是根据他们正在查看的用户和销售人员记录动态命名)。

const filePath = ["State", "City", "Street"];

然后我将它传递给这个方法,该方法假设一次创建一个文件夹,使用先前文件夹的 Id 作为它的 parentId。

        function createFolder() {

            var parentFolderId = "root";

            for (let i = 0; i < filePath.length; i++) {

                    var folderMetadata = {
                        'name' : filePath[i],
                        'mimeType' : 'application/vnd.google-apps.folder',
                        'parents': [parentFolderId]
                    }
                    gapi.client.drive.files.create({
                        resource: folderMetadata,
                    }).then(function(response) {
                        switch(response.status){
                            case 200:
                                var file = response.result;
                                parentFolderId = file.Id;
                                console.log(i + ' file.Id= ' + file.Id);
                                break;
                            default:
                                console.log('Error creating the folder, ' + response);
                                break;
                        }
                    });
             }
        }

但是,所有文件夹都是在函数完成后创建的,在“parentFolderId = file.Id;”之前line 运行,所以他们都被放入 root.

我意识到我可以创建所有文件夹,查询它们,然后重新排列它们。但是,我的项目的下一部分是动态确定这些文件夹中的 any/all 是否已经存在,并且文件夹结构可能会有很大差异。

好的,稍微调整一下,@Alessandro 在 上的解决方案对我有用:

  • 为了便于阅读,我颠倒了方法的顺序。
  • 我合并了一个 FOR 循环,因为我的文件结构将深入许多文件夹。循环通过包含文件路径中的文件夹名称的字符串数组。
  • 我注意到 (!parent) 没有正确返回,因为它是“未定义”,而不是“空”。此外,当找不到现有文件夹时期望“null”是至关重要的,所以我将 parentId 默认为“root”,因为我知道我的第一个文件夹将始终位于 root
  • 变量 newFolderId 保存 found/created 文件夹的值,并传递给 parentId 用于 FOR 循环的下一次迭代
  • 最后,我将“'parent': parent”更新为“'parents' : [parent]”。那个“s”和那些括号似乎是必要的,否则每个创建的文件夹都放在根目录下。
        async function buildFilePath() {

            console.log("buildFilePath()");

            var parentId = "root";

            for (let i = 0; i < filePath.length; i++)  {
                var folderName = filePath[i];

                newFolderId = await getFolder(folderName, parentId);
                console.log(folderName + " id is " + newFolderId + ", parentId is " + parentId);
                if (newFolderId == null) {
                    newFolderId = await createFolder(folderName,parentId);
                    console.log ("created new folder " + folderName + " with Id " + parentId);
                } else {
                    // parentId = newParentId;
                    console.log (folderName + " already exist, move on to next.");
                }
                parentId = newFolderId;
            }
        }
        async function getFolder(name, parent) {

            const res = await gapi.client.drive.files.list({
                'pageSize': 1,
                'fields': "nextPageToken, files(id, name, mimeType, parents)",
                'q': "mimeType='application/vnd.google-apps.folder' \
                            and '" + parent + "' in parents \
                            and name = '" + name + "' \
                            and trashed = false"
            });
            return res.result.files.length > 0 ? res.result.files[0]['id'] : null;
        }
        async function createFolder(name, parent) {

            if (!parent) parent = 'root';

            var fileMetadata = {
                'name': name,
                'mimeType': 'application/vnd.google-apps.folder',
                'parents': [parent]
            };
            const res = await gapi.client.drive.files.create({
                'resource': fileMetadata,
                'fields': 'id'
            });
            return res.result['id'];
        }