将 Google 云端硬盘文件夹内容列出到仅包含新文件的 Google 表格

问题描述 投票:0回答:2

希望了解如何改进循环的使用。目前,我需要将 google 驱动器文件夹中的名称和 URL 列出到工作表中,这是我拥有的代码:

现有代码

function wthFolderContents() {
  var folder_id = 'myFolderID';
   
  var folders = DriveApp.getFolderById(folder_id)
  var contents = folders.getFiles();
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("SheetName");
  sheet.clearContents()
  sheet.appendRow( ['name', 'link'] );
  
  var file;
  var name;
  var link;
  var row;
  while(contents.hasNext()) {
    file = contents.next();
    name = file.getName();
    link = file.getUrl();
    sheet.appendRow ( [name, link] );

使用此代码,每次运行脚本时,内容都会被清除,然后重新列出。我正在寻找一种动态执行此操作的方法/仅更新新文件,以便脚本运行更有效。

我尝试过以下方法

新代码

function wthFolderContents2() {
  var folder_id = '1vBzucZsb0SMOoHSWGtkUF-5QLQr5Fh1C';
   
  var folders = DriveApp.getFolderById(folder_id)
  var contents = folders.getFiles();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("WHTCert");
  var lastRow = sheet.getLastRow()
  var existing = sheet.getRange(1,1,lastRow,1).getValues()

      
  for(i=1;i<lastRow;i++) {
      
    var existingFilename = existing [i][0]
    Logger.log(existingFilename)

      while(contents.hasNext()) {
      var file;
      var name;
      var link; 

      file = contents.next();
      name = file.getName();
      link = file.getUrl();   
    
        if (!name == existingFilename) {
        sheet.appendRow ( [name, link] );     
  }
  }
  }

我无法让它工作,不知道我到底哪里出了问题。希望有人能指出我正确的方向!

干杯

google-apps-script google-sheets google-drive-api
2个回答
1
投票

我相信您的目标如下。

  • 您希望减少脚本的处理成本。

修改要点:

  • 在您的脚本中,使用了
    appendRow
    。在这种情况下,工艺成本将会变高。 参考
  • 文件搜索是循环运行的。这样的话,加工成本就会变高。

在您的情况下,您似乎想检索特定文件夹下的文件列表。在这种情况下,我认为当使用Drive API时,可以降低流程成本。在这个答案中,我想建议在您的脚本中使用 Drive API。当这反映在你的脚本中时,它会变成如下所示。

使用Drive API时,可以检索所有值。所以,我认为你的第一个过程可能可以使用。

修改后的脚本:适用于 Drive API v2

在使用此脚本之前,请在高级 Google 服务中启用 Drive API v2。

function wthFolderContents2() { var folder_id = '1vBzucZsb0SMOoHSWGtkUF-5QLQr5Fh1C'; // Retrieve file list. var q = `'${folder_id}' in parents and trashed = false and mimeType != '${MimeType.FOLDER}'`; var fileList = [['name', 'link']]; var pageToken = ""; do { var obj = Drive.Files.list({ q, maxResults: 1000, pageToken, fields: "nextPageToken,items(id,title)", corpora: "allDrives", supportsAllDrives: true, includeItemsFromAllDrives: true }); if (obj.items.length > 0) { fileList = [...fileList, ...obj.items.map(({ id, title }) => [title, `https://docs.google.com/presentation/d/${id}/edit?usp=drivesdk`])]; } pageToken = obj.nextPageToken; } while (pageToken); // Put the values to Spreadsheet. var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("WHTCert"); sheet.clearContents(); sheet.getRange(1, 1, fileList.length, fileList[0].length).setValues(fileList); }

    运行此脚本时,将从特定文件夹中检索文件列表(文件名和 URL)。并且,将检索到的值保存到“WHTCert”表中。
修改后的脚本:

适用于 Drive API v3

现阶段启用Drive API时,默认启用v3版本。所以,也许可以使用以下脚本。

在使用此脚本之前,

请在高级 Google 服务中启用 Drive API v3。 function wthFolderContents2() { var folder_id = '1vBzucZsb0SMOoHSWGtkUF-5QLQr5Fh1C'; // Retrieve file list. var q = `'${folder_id}' in parents and trashed = false and mimeType != '${MimeType.FOLDER}'`; var fileList = [['name', 'link']]; var pageToken = ""; do { var obj = Drive.Files.list({ q, pageSize: 1000, pageToken, fields: "nextPageToken,files(id,name)", corpora: "allDrives", supportsAllDrives: true, includeItemsFromAllDrives: true }); if (obj.files.length > 0) { fileList = [...fileList, ...obj.files.map(({ id, name }) => [name, `https://docs.google.com/presentation/d/${id}/edit?usp=drivesdk`])]; } pageToken = obj.nextPageToken; } while (pageToken); // Put the values to Spreadsheet. var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("WHTCert"); sheet.clearContents(); sheet.getRange(1, 1, fileList.length, fileList[0].length).setValues(fileList); }

参考资料:

    文件:Drive API v2 的列表
  • 文件:Drive API v3 的列表

0
投票

函数 wthFolderContents() 函数 wthFolderContents2()

© www.soinside.com 2019 - 2024. All rights reserved.