如何加速数百次调用DriveApp.getFolderById(id)

时间:2014-06-17 20:18:10

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

我注意到folder = DriveApp.getFolderById(id);花费了很多时间,我想知道是否有更快的方法可以通过ID检索数百个文件夹。

我在scriptProperties中存储了有关pathes和folder-Ids的信息。如果不进行构建,树大约需要45秒。

如果我使用它并提供一个虚拟的名称(=方法C),整个函数(包含下面的代码加上其他代码)只需不到1秒钟。

如果我使用方法A(文件夹= DriveApp.getFolderByid(id))以正常方式获取文件夹的名称315次,则需要27秒。

我可以通过(有效地)删除对具有多个父项(=方法B)的文件夹的getFolderById调用来优化它,但仍需要22秒。

使用DriveApp.getFolders()并在循环(=方法D)之前准备名称将时间减少到大约4秒。可行,但仍然很长。

   for (var i=1; i<numPathes; i++)
   { // Create treeItems using pathes generated
      var folderPath   = pathes[i];
      var arrPathes    = folderPath.split(underscore);
      var numArrPathes = arrPathes.length;

      var folderIndex = arrPathes[--numArrPathes];
      var parentIndex = arrPathes[--numArrPathes];

      var folderId   = folderIds[folderIndex];

   ///////////// Alternatives
   // Method A) --> takes 27 seconds
      var folder     = DriveApp.getFolderById(folderId);
      var folderName = folder.getName();         // The normal way

   // Method B) --> takes 22 seconds
      var folderName = folderNames[folderIndex]; // Prepared before the current loop

   // Method C) --> takes 1 second  (just for reference)
      var foldeName = folderId;   // Obtained by folder.getId() before (= dummy)

   // Method D) --> takes 4 seconds
      var folderName = folderNames[folderId]; // Prepared using DriveApp.getFolders) 

   // Method E) --> takes 1 second
      var folderName = folderNames[folderId]; // Using cacheService (mentioned by Zig Mandel)
   ///////////// End alternatives


      var txtFolder = underscore + folderId + underscore + folderPath;
      var chk = appLocal.createCheckBox(folderName).setValue(status)
                        .setId(chkPrefix + txtFolder).setName(chkPrefix + txtFolder)
                        .addClickHandler(onChangeStatusChkTreeItem);
      var tri = appLocal.createTreeItem(chk).setId(triPrefix + txtFolder);
      treeItems[i] = tri;
      treeItems[parentIndex].addItem(tri);
   }

   tree.addItem(treeItems[0]); // Add the root to the tree --> all treeItems will be added as well

所以我的问题是,是否有一种方法可以快速获得数百次getFolderId(id)调用?我考虑缓存,但是如何?

对我而言,似乎GAS缺少从ids到文件夹的(快速?)地图。

修改-1

我实现了缓存,将文件夹ID映射到文件夹名称(方法E)。 目前我使用触发器每5小时50分钟开始更新缓存和scriptProperties。 我将在程序运行时使用触发器在后台实现数据验证,更新缓存并在需要时重建树。

这种方法可以在几秒钟内显示包含数百个文件夹的树,而无需用户等待UI出现。

1 个答案:

答案 0 :(得分:0)

没有办法改善谷歌apis的通话时间 但是,如果文件夹名称不经常更改,则可以通过将文件夹ID(属性)映射到文件夹名称(缓存值)将它们缓存在公共缓存(请参阅缓存服务)中长达6小时。 不要使用getAllFolders,因为它有一个最大限制,可能无法全部获取。