Скрипт Google Apps getId () самой глубокой папки в пути - PullRequest
0 голосов
/ 06 июня 2018

У меня есть строка, которая выглядит следующим образом:

2017\S\Smith, John\ProjectID23869

Папка 2017 года находится в родительской папке, чей идентификатор у меня есть.

var parentFolderId = DriveApp.getFolderById("xxxxxx12345");

Мне нужно получить идентификатор папки для ProjectID23869, и я думаю, что мне нужно развернуть папку по папке, а не просто найти по имени в корне.У нас десятки тысяч папок, и это занимает слишком много времени.

Я пробовал различные методы, но, похоже, не могу его получить.

Опять же, помощь очень ценится.Вы все великолепны.

1 Ответ

0 голосов
/ 06 июня 2018

В зависимости от того, как они работают с вашим Диском, есть 2 способа:

Способ # 1

DriveApp.getFoldersByName("your folder").next().getId();

Таким образом, вы находите свою папку черезвсе ваши файлы.

Way # 2

DriveApp.getFolderById("id for folder0")
  .getFoldersByName("folder1").next()
  .getFoldersByName("folder2").next()
  //...
  .getId()

Здесь код может выполняться медленнее в зависимости от количества файлов и серверов Google.Я рекомендую вам попробовать оба варианта и проверить, является ли производительность проблемой.Способ № 2 всегда возвращает только 1 результат, даже если строка projectID не является уникальной.Однако строка вашего пути не должна содержать ошибок.

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

Код для обоих способов

function onOpen() { // this is so you can run it from a Spreadsheet menu

  SpreadsheetApp.getUi()
  .createMenu("Deepest file")
  .addItem("easyNameFinder", "easyNameFinder") // Way #1
  .addItem("pathFinder", "pathFinder") // Way #2
  .addToUi();

}

function easyNameFinder() { // Way #1

  var name = SpreadsheetApp.getCurrentCell().getValue();
  var folderList = []
  var folders = DriveApp.getFoldersByName(name);
  while (folders.hasNext()) {// in case name is not unique
    var folder = folders.next();
    folderList.push(folder.getId() + " in " + folder.getParents().next().getName());
  }
  var id = "See below the " + folderList.length + " folder match(es) for " + name + "\n" + folderList.join("\n");
  Logger.log(id); // view logs with Ctrl + Enter
  SpreadsheetApp.getUi().alert(id); // an alert will appear on the active sheet
}

function pathIterator(query, folder) { // The loop for Way #2

  var folders = folder.getFoldersByName(query)
  if (folders.hasNext()) { // unfortunately, there could be more than one child folder with a given name. If that is the case, you will run into problems.
    var folder = folders.next();
    var name = folder.getName();
    Logger.log(name) // view logs with Ctrl + Enter in the Script editor
    if (folder) {
      Logger.log("we just found " + name + "!\n")
      return folder
    }; 
  } else return null;
}

function pathFinder() { // Way #2: main function

  var string = SpreadsheetApp.getCurrentCell().getValue();
  var array = string.split("\\")
  Logger.log(array);
  var mother = 'YOUR-PARENT-FILE-ID-HERE';
  var mainFolder = DriveApp.getFolderById(mother); 
  var folder = mainFolder;
  var error;

  array.forEach(function(value) {
    var recursion = pathIterator(value, folder)
    if (recursion) {folder = recursion}
    else {
      error = "Could not find folder \"" + value + "\" in " + folder
      Logger.log(error)
      SpreadsheetApp.getUi().alert(error);}
  })

  if (error) {
    return; // skipping the code below if some folder went unfound
  }

  var displayString = folder.getId() + "\nis the Id for the folder " + '"' + folder.getName() + '"'
  Logger.log(displayString); // view logs with Ctrl + Enter
  SpreadsheetApp.getUi().alert(displayString); // an alert will appear on the active sheet
}

Производительность через мои собственные 100 папок:

  • Способ № 1 (easyNameFinder): 0,495 секунд
  • Способ № 2 (pathFinder): 1,091 секунд
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...