【问题标题】:Google Drive - How to List all Files in a specified folderGoogle Drive - 如何列出指定文件夹中的所有文件
【发布时间】:2015-05-24 20:36:04
【问题描述】:

您好,我被这种情况困住了,我尝试了许多不同的方法,但我无法得到我想要的。

情况: 我在谷歌驱动器上托管的文件夹中有大量文件。 例如,用于报告的单个客户端文件夹有 2000-10000 个文件(这只会变得更大),我希望能够列出这些文件以及标题和文件 ID 以及父文件夹 ID,以便我可以创建文件的直接链接. 据我了解,我可以用谷歌驱动器做到这一点:drive-api-client-php 我已经设置了一个项目并有一个客户端 ID 和客户端密码,我已经下载了 subversion composer 和 google-api 和 drive-api-client-php 并使用 XAMPP

到目前为止我做了什么: 我浏览了谷歌的文档并观看了他们提供的教程视频。 我已经尝试过他们在网页上提供的google sample,这是我需要的开始。 这将列出具有 ID 和标题或您选择的任何字段的文件夹中的文件 - 这里的两个问题是您无法指定您想要结果的文件夹,并且结果的最大数量限制为 1000。我在需要 10,000 个。

我还查看了一些谷歌应用程序脚本here,它似乎像 excel 中的 vba 一样用于提取文件 ID 和标题等,但这也仅限于结果的最大数量,然后出现超时问题。这正是我想要的结果类型,没有任何限制。

我的问题是: 在谷歌驱动器的指定文件夹中列出 10,000 个带有标题的文件 ID 的选项是什么,以及从开始到结束的过程是什么,因为我觉得我可能会在早期错过一个基本点,这会影响我的结果可能性。 我对此很灵活,我可以在提取数据后处理数据,首先获取数据对我来说是关键。 期待您的回复,非常感谢。 我希望这足够清楚并且有意义。

【问题讨论】:

    标签: php google-apps-script google-api google-drive-api xampp


    【解决方案1】:

    在 Apps 脚本中尝试此代码:您需要编辑此代码,并替换您的文件夹 ID。在 Google Drive 中打开一个文件夹,在浏览器地址栏中,您会看到:

    https://drive.google.com/drive/folders/Your_Folder_ID_Here
    

    复制文件夹 ID,并在下面的代码中替换它。高级 Google 服务必须在两个地方显式启用,即在 Apps 脚本中和在您的开发者控制台上。

    //This requires the Drive API To be turned on in the Advanced Google Services
    function listFilesInFolder() {
      var query = 'trashed = false and ' +
          "'Your Folder ID Here' in parents";
    
      var filesInFolder, pageToken;
    
      do {
        filesInFolder = Drive.Files.list({
          q: query,
          maxResults: 100,
          pageToken: pageToken
        });
        if (filesInFolder.items && filesInFolder.items.length > 0) {
          for (var i = 0; i < filesInFolder.items.length; i++) {
            var thisFile = filesInFolder.items[i];
            //Logger.log('%s (ID: %s)', thisFile.title, thisFile.id);
            //To Do - Output content to file
            . . . . Code to output content . . . . 
          }
        } else {
          Logger.log('No files found.');
        }
        pageToken = filesInFolder.nextPageToken;
      } while (pageToken);
    }
    

    如果您正在寻找用 PHP 编写的代码,则需要使用不同的代码。

    【讨论】:

    • 嗨桑迪,这非常好,简单,接近我需要的。但是记录器变得太大,所以我将结果导出到谷歌表......现在我的问题是超过了最大执行时间
    • 这看起来可能有潜力,但需要它从超时的地方循环并从那里重新开始......
    • function runMe() { var startTime= (new Date()).getTime(); //在这里做一些工作 var startRow = ScriptProperties.getProperty("start_row"); for(var ii = startRow; ii = MAX_RUNNING_TIME) { ScriptProperties.setProperty("start_row", ii) ScriptApp.newTrigger("runMe") .timeBased() .at(new Date(currTime+REASONABLE_TIME_TO_WAIT)) .create();休息; } 其他 { doSomeWork(); } } //在这里做更多的工作 }
    • 是的,日志被截断。如果您想出了一个完整的有效示例,请随时发布答案。我很乐意投票。
    【解决方案2】:

    这就是我想出的,感谢上面的代码和我找到的一些其他代码的帮助,将两者放在一起,它就可以满足我的需求。 它可能对其他人有用。

    谢谢

    function listFilesInFolder() {
    var MAX_FILES = 2000; //use a safe value, don't be greedy
    var id = 'FOLDER_ID_HERE'; 
    var scriptProperties = PropertiesService.getScriptProperties();
    var lastExecution = scriptProperties.getProperty('LAST_EXECUTION');
    var sheet = SpreadsheetApp.getActiveSheet();
    var data;
    if( lastExecution === null )
    lastExecution = '';
    
    var continuationToken = scriptProperties.getProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN');
      var iterator = continuationToken == null ?
      DriveApp.getFolderById(id).getFiles() : DriveApp.continueFileIterator(continuationToken);
    
    
     try { 
       for( var i = 0; i < MAX_FILES && iterator.hasNext(); ++i ) {
       var file = iterator.next();
       var dateCreated = formatDate(file.getDateCreated());
        if(dateCreated > lastExecution)
         processFile(file);
        data = [
           i,
           file.getName(),
           file.getId()
          ];        
    
        sheet.appendRow(data);
    }
    } catch(err) {
     Logger.log(err);
    }
    
    if( iterator.hasNext() ) {
     scriptProperties.setProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN', iterator.getContinuationToken());
     } else { // Finished processing files so delete continuation token
     scriptProperties.deleteProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN');
     scriptProperties.setProperty('LAST_EXECUTION', formatDate(new Date()));
     }
     }
    
    function formatDate(date) { return Utilities.formatDate(date, "GMT", "yyyy-MM-dd HH:mm:ss"); }
    
    function processFile(file) {
    var id = file.getId();
    var name = file.getName();
    //your processing...
    Logger.log(name);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多