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