创建个人 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'];
}
问题的简短版本:
使用 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'];
}