【问题标题】:Exceeded maximum execution time error in google apps script超过谷歌应用程序脚本中的最大执行时间错误
【发布时间】:2023-03-14 22:33:01
【问题描述】:

我正在尝试在 google 应用程序脚本中运行此脚本。它以递归方式将文件夹中的所有文件及其大小、名称、url 等列出到电子表格中。脚本没有问题,但问题是我在一个包含数千个文件的文件夹上运行它,而谷歌脚本只允许几分钟的最大运行时间,所以每次几分钟后我都会收到错误消息,说超出了最大执行时间谷歌脚本。

这个问题有什么解决方法吗?我很好,即使我必须在谷歌应用脚​​本之外的某个地方运行这段代码,如果这是唯一的出路,但我再次被告知它不可能在谷歌脚本之外执行这段代码。

function start() {
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  sheet.appendRow(["Name", "Date", "Size", "URL", "Download", "Description", "Type", "Folder", "Folder Slug"]);
  var folders = DriveApp.getFolderById('FOLDER_ID');
  var folder = folders.getFolders();
  if (folder.hasNext()) {

    // 1. Retrieve the file list and put to an array.
    // 2. Sort the array by the file size.
    var list = processFolder(folder).sort((a, b) => a[2] < b[2] ? 1 : -1);

    // 3. Put the array to the Spreadsheet.
    sheet.getRange(2, 1, list.length, list[0].length).setValues(list);
  } else {
    Browser.msgBox('Folder not found!');
  }

  function processFolder(folder, list = []) {
    while (folder.hasNext()) {
      var f = folder.next();
      var contents = f.getFiles();
      addFilesToSheet(contents, f, list);
      var subFolder = f.getFolders();
      processFolder(subFolder, list);
    }
    return list;
  }

  function addFilesToSheet(files, folder, list) {
    var folderName = folder.getName();
    while (files.hasNext()) {
      var file = files.next();
      list.push([
        file.getName(),
        file.getDateCreated(),
        Math.round(10 * file.getSize() / 1073741824) / 10, // Modified from file.getSize() / 1073741824,
        file.getUrl(),
        "https://docs.google.com/uc?export=download&confirm=no_antivirus&id=" + file.getId(),
        file.getDescription() || "",
        file.getMimeType(),
        folderName
      ]);
    }
  }
}

【问题讨论】:

    标签: javascript google-apps-script google-drive-api google-sheets-api google-apps


    【解决方案1】:

    我过去使用 Patrick Martinent 的连续执行库解决了这个问题:

    https://gist.github.com/patt0/8395003

    基本思路是:

    • 设置您的函数,使其可以顺利终止和恢复
    • 设置时间触发器以重新运行函数
    • 运行它直到它接近执行超时并优雅退出
    • 允许触发器重新启动函数
    • 重复直到完成,然后移除触发器

    【讨论】:

    • 您好,我尝试使用该库,但不幸的是我无法成功。它需要任何改变吗?问是因为我可以看到它已经快 6 年了,所以有些东西很可能会被贬值
    • 如果它不再起作用,您可以使用相同的原则来安排和管理您的脚本
    • 你遇到了什么错误?可能与权限有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多