function getDriveFolder(path)问题

时间:2018-06-01 05:42:27

标签: google-apps-script

我成功使用ctrlq.org中的以下代码在Google云端硬盘中创建文件夹:

function go() {    
    var path = "//main//parent//child//grandchild”;
    var folder = getDriveFolder(path);    
    Logger.log(folder.getUrl());    
}

function getDriveFolder(path) {
  
  var name, folder, search, fullpath;
  
  // Remove extra slashes and trim the path
  fullpath = path.replace(/^\/*|\/*$/g, '').replace(/^\s*|\s*$/g, '').split("/");
  
  // Always start with the main Drive folder
  folder = DriveApp.getRootFolder();
  
  for (var subfolder in fullpath) {
    
    name = fullpath[subfolder];
    search = folder.getFoldersByName(name);
    
    // If folder does not exit, create it in the current level
    folder = search.hasNext() ? search.next() : folder.createFolder(name);
    
  }
  
  return folder;
  
}

我在其中一张纸上遇到错误。在创建最后一个文件夹(孙子)之后,还会创建一个附加文件夹。

该文件夹的名称是: function(search){if(search ==“”){return false; } for(var i = 0; i< this.length; i ++){if(this [i] == search){return i; } return -1;}

是的,这就是在使用这个电子表格的函数创建的每个路径末尾创建的文件夹的名称。这让我疯了。

通过反复试验,我发现在我的项目中使用以下代码会导致创建这个附加文件夹。

以下是导致问题的代码:

Array.prototype.findIndex = function(search){
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if (this[i] == search) return i;

  return -1;
} 

是否可以重写getDriveFolder以防止这种情况发生?也许只是过滤掉这个名字?我试着无济于事。非常感谢您的帮助。

我最终自己解决了这个问题。它可能不是最好的解决方案,但它确实有效。我添加了以下代码来过滤掉错误的文件夹名称。

if(folderName.indexOf("function (search") > -1) {
    var folderParent = DriveApp.getFolderById(folderID).getParents().next();
    DriveApp.getFolderById(folderID).setTrashed(true);
    folder = folderParent;

1 个答案:

答案 0 :(得分:0)

因为您有extended the native Array object,所以for (var subfolder in fullpath)循环有一个额外的可枚举属性 - 即findIndex属性。

您可以通过检查最终枚举循环中subfolder的值(或只是记录它)来验证有问题的可枚举属性的名称:

console.log({enumerated_thing: fullpath, current_enumerable: subfolder});
name = ...

修复方法是使用由String[](和not property enumeration)创建的path.replace.split的显式迭代:

for (var i = 0; i < fullpath.length; ++i) {
  var name = fullpath[i];
  ...
}