与仅搜索直接文件夹中的文件的DriveApp.getFilesByType()方法不同,我也尝试搜索子文件夹中的文件。
找到关于它的bloggpost,并且按原样运行。 但是我的脚本需要将结果推送到数组中。到目前为止,我可以将文件推送到阵列,但我没有获取子文件夹的文件。
我有3个功能:
trigger_GetDriveFiles
byte
GetDriveFiles (已评论的部分是失败的地方)
function trigger_GetDriveFiles(){
var folder = DriveApp.getFolderById("0B2XfBTL5aSGMZTNwTDlwT2JqNjg");
var filesJSObj = GetDriveFiles(folder);
for(var i in filesJSObj){
if(filesJSObj.hasOwnProperty(i)){
Logger.log(bulkFile(i, filesJSObj[i]));
}
}
}
bulkFile
function GetDriveFiles(folder) {
var files = {};
var fileIt = folder.getFiles();
while (fileIt.hasNext()) {
var f = fileIt.next();
var owner = f.getOwner().getEmail();
var id = f.getId();
if (owner != "admin.fileshare@domain.com"){
if (!files[owner]) {
files[owner] = [];
}
// push the file to the owner's array
files[owner].push(id);
}
}
/*
// Get all the sub-folders and iterate, This is the part not wokring!
var folderIt = folder.getFolders();
while(folderIt.hasNext()) {
fs = GetDriveFiles(folderIt.next());
for (var i = 0; i < fs.length; i++) {
files.push(fs[i].id)
}
}*/
return files;
}
答案 0 :(得分:1)
问题在于数据结构不一致。代码注释部分使用files
将files.push
视为数组。在其余的代码中,它是一个对象,其中键是所有者的电子邮件。
files
作为这样一个对象的另一个问题是该函数必须合并对象属性,即messy。我建议将结构更改为files
作为对象数组{id: id, file: file}
。这很容易连接,并且在完成工作之后,结果数组可以转换为具有键所有者的对象。我在末尾添加了转换位convertToObj
。
function trigger_GetDriveFiles() {
var folder = DriveApp.getFolderById('your_id');
Logger.log(convertToObj(GetDriveFiles(folder)));
}
function GetDriveFiles(folder) {
var files = [];
var fileIt = folder.getFiles();
while (fileIt.hasNext()) {
var f = fileIt.next();
var owner = f.getOwner().getEmail();
var id = f.getId();
if (owner != "admin.fileshare@domain.com"){
files.push({'id': id, 'owner': owner});
}
}
var folderIt = folder.getFolders();
while (folderIt.hasNext()) {
files = files.concat(GetDriveFiles(folderIt.next()));
}
return files;
}
convertToObj函数与Google云端硬盘无关;它只是对JS对象和数组的操作。
function convertToObj(files) {
var filesObj = {};
for (var i = 0; i < files.length; i++) {
var owner = files[i].owner;
if (!filesObj[owner]) {
filesObj[owner] = [];
}
filesObj[owner].push(files[i].id);
}
return filesObj;
}