微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

6 分钟后 Google 脚本超时 答案:更多信息:代码更改:参考:

如何解决6 分钟后 Google 脚本超时 答案:更多信息:代码更改:参考:

我想列出团队驱动器(超过 3000 个文件夹)中存在的所有文件名称及其文件夹 ID。我正在使用 speedsheet 并在脚本中运行以下代码-

function listFilesInFolder(folderName) {

   var sheet = SpreadsheetApp.getActiveSheet();
   sheet.appendRow(['Name','File-Id']);


//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
    var folder = DriveApp.getFolderById('folder ID');
    var contents = folder.getFolders();

    var cnt = 0;
    var folder;

    while (contents.hasNext()) {
        var folder = contents.next();
        cnt++;

           data = [
                folder.getName(),folder.getId(),];

            sheet.appendRow(data);
    };
}

但这会导致错误超出最大执行时间,认情况下为 6 分钟。

我尝试从脚本应用程序添加触发器,但在触发后从头开始,脚本仍然在 6 分钟后结束。

如何添加一个从它离开的地方开始的触发器?

解决方法

答案:

这个脚本的缓慢部分是重复调用 sheet.appendRow()。您可以通过将结果推送到数组并在循环结束时设置值来加快速度,而不是在 while 循环的每次迭代中附加一行。

更多信息:

在短时间内对工作表进行大量更改时,使用 SpreadsheetApp 等内置服务通常会很慢。您可以通过尽可能减少对内置 Apps Script 服务的调用次数来解决此问题,依靠纯 JavaScript 进行处理。

代码更改:

function listFilesInFolder(folderName) {
   const sheet = SpreadsheetApp.getActiveSheet()

  //change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
  let folder = DriveApp.getFolderById('')
  let contents = folder.getFolders()

  let cnt = 0
  let data = [['Name','File-Id']]

  while (contents.hasNext()) {
    folder = contents.next()
    cnt++

    data.push([
      folder.getName(),folder.getId(),])
  }
  sheet.insertRows(sheet.getMaxRows(),data.length)
  sheet.getRange(2,1,data.length,2).setValues(data)
}

代码更改:

  • data 声明为使用标题行初始化的数组,而不是将其直接附加到工作表
  • 在循环的每次迭代中,当前文件夹的名称和 ID 作为新数据行附加到 data 数组。
  • 循环遍历所有文件夹后,工作表中的行数将增加 data 中的行数,以免出现越界错误
  • data 内的所有行都使用 setValues() 添加到工作表中。

在我的测试环境中,我进行了以下设置:

  • 包含 3424 个文件夹的驱动器文件夹

在 while 循环中使用 appendRow() 方法,执行耗时 1105.256 秒(或 18 分钟)

在循环外使用 push().setValues() 方法,执行时间为 4.478 秒。

希望对你有帮助!

参考:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。