【问题标题】:Google Apps Script TeamDrive DriveApp.searchFolders and DriveApp.searchFiles does not return any resultsGoogle Apps 脚本 TeamDrive DriveApp.searchFolders 和 DriveApp.searchFiles 不返回任何结果
【发布时间】:2021-11-27 03:54:25
【问题描述】:

我有一些在 TeamDrive 上搜索文件和文件夹的 Google Apps 脚本代码。

我遇到的问题是,如果我的同事创建了一个文件或文件夹,当我运行我的脚本时它找不到该文件。如果我创建了一个文件,而我的同事运行了该脚本,那么即使我们都有权查看、编辑并且可以查看云端硬盘中的文件和文件夹,该脚本也找不到该文件。如果我们中的一个人编辑了另一个人制作的文件,那么它就会在搜索中可见。

在进行一些 android 开发时,我遇到了 Drive REST api 的类似问题。在Android中调用files().list()时,我花了一段时间才发现我必须设置以下内容才能使我的搜索每次都成功。

  1. .setSupportsTeamDrives(true)
  2. .setIncludeTeamDriveItems(true)
  3. .setCorpora("teamDrive")
  4. .setTeamDriveId(myFolder.getTeamDriveId())

我假设我的应用脚本代码遇到了同样的问题。

//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"

有没有办法设置支持团队驱动器?和 setIncludeTeamDriveItems?和 setTeamDriveId?在谷歌应用脚​​本中

【问题讨论】:

  • 看看Google Drive APIs REST v2你需要在开发者控制台中启用这个API。
  • 我应该能够用 DriveApp 完成同样的事情.....不应该吗?
  • 我不这么认为。

标签: google-apps-script google-drive-shared-drive


【解决方案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)
  }
}

我认为它们可能会有所帮助。

【讨论】:

  • 谢谢,我希望避免使用 REST api.......我想看看是否有 DriveApp 解决方案。但如果没有,谢谢!这将帮助我快速开始使用 REST 解决方案。
  • 我发现通过查看内容补全中 Apps 脚本可用的内容,可以大大增强学习如何使用 RESTful API 的能力。当然,格式化 optionalArg 对象仍然很难弄清楚,但是您可以查看 RESTful 文档以获取可选参数。如果您遇到问题,请尝试制作一个非常简洁的脚本来提出您的问题,并希望 Tanaike 或 tehhowch 能够帮助您。 Tanaike 和 tehhowch 为我提供了一些很好的答案和示例。
  • 感谢库珀!这基本上是我在 Java/Android 中所做的,并且在根据需要获取文件和文件夹的完整列表方面效果很好。奇怪的是,他们会有 DriveApp,而且它适用于 TeamDrive……但并不完全。他们真的应该更好地记录它,表明它真的只适用于个人驱动器帐户而不是 TeamDrive .....
  • 看起来这需要更新到已弃用的includeTeamDriveItems,请参阅developers.google.com/drive/api/v2/reference/files/…
【解决方案2】:

我刚刚使用 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'); 
        }
      }

【讨论】:

    【解决方案3】:

    我使用简单的 Apps 脚本代码来搜索共享驱动器中的文件夹:

    function searchFolderByTitle(title,ShDrId){
      var folders = DriveApp.searchFolders("title contains '"+title+"' and '"+ShDrId+"' in parents");
      while (folders.hasNext()) {
        var folder = folders.next();
        Logger.log(folder.getName());
      }
    }
    

    should use 运算符“in”而不是“=”与“parents”参数。

    【讨论】:

      猜你喜欢
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2015-04-21
      • 1970-01-01
      • 2021-02-15
      相关资源
      最近更新 更多