Как получить и сохранить структуру файлов и папок в электронной таблице Google с помощью скрипта apps? - PullRequest
0 голосов
/ 29 марта 2019

Я знаю, что этот вопрос задавался ранее, но я пытаюсь немного углубиться в проблему. У меня есть этот скрипт скрипт приложения, который я взял в Интернете, и я использую его в электронной таблице Google, чтобы сканировать список папок.

Короче говоря, у меня есть (общая) структура папок с вероятностью более 1000 подпапок, которые содержат подпапки, которая выглядит примерно так:

ГЛАВНАЯ ПАПКА

  • ПАПКА 1

    • ФАЙЛ 1.1
    • ПОДПИСАТЕЛЬ 1.A
      • СУБФИЛЬ 1.A.2
      • СУБФИЛЬ 1.А.3
  • ПАПКА 2

    • ФАЙЛ 2.1
    • ПОДЛОЖКА 2.А
      • SUBFILE 2.A.2
      • SUBFILE 2.A.3
  • ПАПКА 3

    • ФАЙЛ 3.1
    • ПОДПИСАТЕЛЬ 3.A
      • СУБФИЛЬ 3.A.2
      • СУБФИЛЬ 3.А.3 ...

Я пытаюсь исправить 2 вещи: 1) Моя функция явно ломается при запуске, потому что там слишком много папок и файлов. Я не думаю, что это связано с ограничением строк в электронной таблице. Поэтому в идеале мне нужно было бы вручную пакетировать 200 папок в основной папке, запустить функцию и повторить процедуру. Любой намек на то, как этого избежать и как потенциально, вывести временные результаты в первую электронную таблицу и создать новую электронную таблицу, если это проблема с кэшированием?

2) Я не могу получить информацию о подпапках и файлах, которые в ней содержатся. Кто-нибудь может помочь адаптировать код, чтобы углубиться в иерархию папок? Нужна ли здесь какая-то функция цикла?

С помощью приведенного ниже кода, который я использовал и тестировал несколько раз, я могу получить только папки 1,2,3 и файлы 1.1, 2.1, 3.1 ... но не подпапки или подпапки.

Исправление этой функции сэкономило бы мне недели ручной работы. Любая помощь приветствуется. Заранее спасибо за помощь.

function getAndListFilesInFolder() {
  var arr,f,file,folderName,subFolders,id,mainFolder,name,own,sh,thisSubFolder,url;

  sh = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  sh.getRange(1, 1, 100, 10).clear({contentsOnly: true})

  id = "FOLDER ID HERE";
  arr = [["FILE NAME", "URLs", "OWNER","FOLDER"]];


  mainFolder = DriveApp.getFolderById(id);
  subFolders = mainFolder.getFolders();
  folderName = mainFolder.getName();

  f = mainFolder.getFiles();

  while (f.hasNext()) {
    file = f.next();
    name = file.getName()
    url = file.getUrl()
    own = file.getOwner().getName()

    arr.push([name, url, own, folderName]);
  };

  while (subFolders.hasNext()) {
    thisSubFolder = subFolders.next();
    f = thisSubFolder.getFiles();
    folderName = thisSubFolder.getName();

    while (f.hasNext()) {
      file = f.next();
      name = file.getName()
      url = file.getUrl()
      own = file.getOwner().getName()

      arr.push([name, url, own,folderName]);  
    };
  };

  sh.getRange(1,1, arr.length, arr[0].length).setValues(arr);
  sh.getRange(2,1, arr.length, arr[0].length).sort(1);


  //var second = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2")
  //second.activate()
}

1 Ответ

0 голосов
/ 29 марта 2019

Причина, по которой вы не видите ни одной из подпапок, заключается в том, что вы фактически не добавляете их в свой массив (arr) в любое время.

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

Изучение рекурсивных и рекурсивных функций.

Вот краткий пример, который вы могли бы расширить, и ему понадобятся некоторые настройки, так как я пишу это с головы до головы:

  function getFilesFromFolder(folder){
    var arr = [];
    arr.push([folder.getName(),folder.getUrl(),folder.getOwner().getName()])
    var subfolders = folder.getFolders();
    var files = folder.getFiles():

    while(files.hasNext()){
      arr.push(/*file details*/);
    }

    //recurse into subfolders here.
    while(subFolders.hasNext()){    
      arr.concat(getFilesFromFolder(subFolders.next());  //notice how we call the function from within itself.
    }

    return arr;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...