如何使这个 google 脚本更有效率

How to make this google script more efficient

我得到这个脚本来进入一个文件夹并获取每个文件的密钥。

function listFilesInFolder(id) {

  var folder = DriveApp.getFolderById('');
  var contents = folder.getFiles();
  var file;
  var name;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Imported");
  var date;
  var size;

  sheet.clear();
  sheet.appendRow(["Name", "Data", "Size", "Id"]);


  while(contents.hasNext()) {
    file = contents.next();
    name = file.getName();
    date = file.getDateCreated()
    size = file.getSize()
    id = file.getId()

    data = [name, date, size, id]
    sheet.appendRow(data);
    
    //appendRow
  }
}; 

我的问题是整个文件夹的浏览时间太长,通常会在完成前达到 运行 时间限制。

该文件夹包含 1000 多个不同的文件,我们每天自动上传文件。

有什么方法可以使这个脚本更有效率吗?

我相信你的目标如下。

  • 您想使用 Google Apps 脚本检索特定文件夹下的文件列表。
  • 您想减少问题中当前脚本的处理成本。

修改点:

  • 在您的脚本中,appendRow 用于循环。在这种情况下,工艺成本会很高。 Ref
  • 而且,我认为在您的情况下,当使用驱动器 API 时,处理成本可能会降低一些。

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

在您使用此脚本之前,please enable Drive API at Advanced Google services

function listFilesInFolder(id) {
  var folderId = "###"; // Please set the folder ID. If you want to use "id" for this, you can use var folderId = id;
  
  // 1. Retrieve file list using Drive API.
  var ar = [["Name", "Data", "Size", "Id"]];
  var pageToken = "";
  do {
    const res = Drive.Files.list({corpora: "allDrives", includeTeamDriveItems: true, supportsAllDrives: true, maxResults: 1000, pageToken: pageToken, q: `'${folderId}' in parents`});
    ar = ar.concat(res.items.map(({title, createdDate, fileSize, id}) => [title, createdDate, fileSize || 0, id]));
    pageToken = res.nextPageToken;
  } while(pageToken);

  // 2. Put the file list to Spreadsheet.
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Imported");
  sheet.clear();
  sheet.getRange(1, 1, ar.length, ar[0].length).setValues(ar);
}

注:

  • 从你的问题来看,我无法了解你的具体情况。因此,在此修改后的脚本中,可以搜索您的 Google 驱动器和共享驱动器中的文件夹。

参考文献: