【问题标题】:How to make this google script more efficient如何让这个谷歌脚本更高效
【发布时间】:2021-08-11 10:52:18
【问题描述】:

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

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 Drive 并在本地同步所有文件。这样您就可以通过系统工具、Python 脚本、node.js 等在本地处理它们。
  • 虽然我不确定这是否是您情况的直接解决方案,但我提出了一个修改后的脚本作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您所期望的方向,我深表歉意。

标签: performance google-apps-script google-sheets processing-efficiency


【解决方案1】:

我相信你的目标如下。

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

修改点:

  • 在您的脚本中,appendRow 在循环中使用。在这种情况下,处理成本会很高。 Ref
  • 而且,我认为在您的情况下,使用 Drive 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 Drive 和共享 Drive 中的文件夹都可以被搜索到。

参考资料:

【讨论】:

  • 这正是我想要完成的!
  • 完美运行!感谢您抽出宝贵时间详细解释最佳解决方案。
  • @OPS Maheras 欢迎您。谢谢你让我知道。我很高兴你的问题得到了解决。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。我认为您的问题和解决方案将对他们有用。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
  • @OPS Maheras 感谢您的回复。
猜你喜欢
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多