我有一些 Google Apps脚本代码,用于在TeamDrive上搜索文件和文件夹。
我遇到的问题是,如果文件或文件夹是由我的同事创建的,则在我运行脚本时找不到该文件。如果我创建了文件,并且我的同事运行了脚本,则即使我们俩都有权查看,编辑并可以看到云端硬盘中的文件和文件夹,该脚本也找不到文件。如果我们中的一个人编辑另一个人制作的文件,则在搜索中可以看到该文件。
在进行一些Android开发时,我遇到了Drive REST API的类似问题。在Android中,当调用files()。list()时,我花了一段时间才发现必须设置以下内容才能使搜索每次成功。
我认为我的应用程序脚本代码遇到了同样的问题。
//Create the N Google docs files
function CreateNFiles(){
var spreadsheet = SpreadsheetApp.getActive();
var Nmain = spreadsheet.getSheetByName("Nmain")
var spreadsheetId = spreadsheet.getId();
var pdfDir = "Form Data";
var TemplatesFolder = null;
//Check and see if there is a 'Form Data' folder
var NFolderId = null;
var RFolderId = DriveApp.getFileById(spreadsheetId).getParents().next().getId();
var files = DriveApp.searchFolders('parents="'+RFolderId+'" and trashed=false');
while (files.hasNext()) {
var myfile = files.next();
if(myfile.getName() == pdfDir){
NOFolderId = myfile.getId();
}
}
https://developers.google.com/apps-script/reference/drive/drive-app#searchFiles(String)
这是指
https://developers.google.com/drive/api/v3/search-parameters#examples_for_teamdriveslist
所以我有可能使用
corpora =“ teamDrive”
是否可以设置setSupportsTeamDrives?和setIncludeTeamDriveItems?和setTeamDriveId?在Google Apps脚本中
答案 0 :(得分:1)
以下是我为满足自己的需要而正在努力的几个功能。它们仍在进行中,但是一个可以在团队驱动器文件夹中文件夹,另一个可以在团队驱动器文件夹中查找项目。设置Logger.log以显示项目编号,标题,ID和mimeType。
此文件可以找到项目(文件或文件夹)。您可以按类型区分它们。
function findItemsInTeamDriveFolder(teamDriveId,folderId){
var teamDriveId=teamDriveId || '0AFN5OZjg48ZvUk9PVA';
var folderId=folderId || '1LK76CVE71fLputdFAN-zuL-HdRFDWBGv';
var options={
"corpora":"teamDrive",
"includeTeamDriveItems":true,
"orderBy":"folder",
"q":Utilities.formatString('\'%s\' in parents',folderId),
"supportsTeamDrives":true,
"teamDriveId":teamDriveId
};
var files=Drive.Files.list(options);
var data=JSON.parse(files);
for(var i=0;i<data.items.length;i++){
Logger.log('\nItem: %s - Title: %s - Id: %s - Type:%s - Trashed: %s\n',i+1,data.items[i].title,data.items[i].id,data.items[i].mimeType,data.items[i].explicitlyTrashed?'true':'false');
}
}
这只是在一个文件夹中找到文件夹。它不是可重入的,它只是一级协议,但是目前这就是我所需要的。
function findFoldersInATeamDriveFolder(teamDriveId,folderId){
var teamDriveId=teamDriveId || '0AAc6_2qyI7C0Uk9PVA';
var folderId=folderId || '1HenWOXTSCg96iAvA0ZkgEA9EGKlch4fz';
var optionalArgs={
"corpora":"teamDrive",
"includeTeamDriveItems":true,
"orderBy":"folder",
"q":Utilities.formatString('\'%s\' in parents and mimeType = \'application/vnd.google-apps.folder\'',folderId),
"supportsTeamDrives":true,
"teamDriveId":teamDriveId
}
var list=Drive.Files.list(optionalArgs)
var data=JSON.parse(list);
for(var i=0;i<data.items.length;i++){
Logger.log('\nItem: %s - Title: %s - Id: %s - Type: %s - Trashed;%s\n',i+1,data.items[i].title,data.items[i].id,data.items[i].mimeType,data.items[i].explicitlyTrashed?'true':'false');
findItemsInTeamDriveFolder(teamDriveId,data.items[i].id)
}
}
我认为它们可能会有所帮助。
答案 1 :(得分:0)
我只是使用Coopers代码列出了共享驱动器中的文件。我添加了代码以查找teamdriveID。有两件事花费了我一些时间,可能对其他人有所帮助:默认情况下,文件数限制为100。所以我在这里将其更改为200。另外,选项文件中包含已删除的文件(非常令人困惑),因此我使用了if语句将其过滤掉-我确信这可以做得更优雅,但这可行:)
var resource = {
'value': 'emailstring',
'type': 'user',
'role': 'writer'
}
var teamDriveId
// If you have several Team Drives, loop through and give access
var TeamDrive = Drive.Teamdrives.list();
for(var i = 0; i < TeamDrive.items.length; i++) {
if(TeamDrive.items[i].name == "foldernamestring") {
// This ID may also be a single file inside a Team Drive
teamDriveId = TeamDrive.items[i].id;
Logger.log("found "+TeamDrive.items[i].name);
}
}
var options={
"corpora":"teamDrive",
"maxResults":200,
"includeTeamDriveItems":true,
"supportsTeamDrives":true,
"teamDriveId":teamDriveId
};
var files=Drive.Files.list(options);
var data=JSON.parse(files);
var nritems= data.items.length
Logger.log("nritems "+nritems);
for(var i=0;i<nritems;i++){
if (data.items[i].explicitlyTrashed == false){
Logger.log('\nItem: %s - Title: %s - Id: %s - Type:%s - Trashed: %s\n',i+1,data.items[i].title,data.items[i].id,data.items[i].mimeType,data.items[i].explicitlyTrashed?'true':'false');
}
}