Функция getDriveFolder (путь) Проблема - PullRequest
0 голосов
/ 01 июня 2018

Я успешно использую следующий код из 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

Да, это буквально имя папки, созданной в конце каждого пути, созданного функцией с этой одной электронной таблицей.Это сводило меня с ума.

Путем проб и ошибок я обнаружил, что наличие следующего кода в моем проекте приводит к созданию этой дополнительной папки.

Вот код, который вызываетпроблема:

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 голосов
/ 01 июня 2018

Поскольку у вас есть расширение собственного Array объекта , ваш цикл for (var subfolder in fullpath) имеет дополнительное перечисляемое свойство, а именно свойство findIndex.

Вы можете проверить имя нарушающего перечисляемого свойства, проверив значение subfolder в последнем цикле перечисления (или просто зарегистрировав его):

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

Исправление заключается в использованииявная итерация String[], созданная path.replace.split, а не перечислением свойств ):

for (var i = 0; i < fullpath.length; ++i) {
  var name = fullpath[i];
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...