Есть ли способ архивировать файлы и папки в определенную папку на Google Диске и сохранить путь к папке?

Я использую Google Диск и хочу заархивировать все файлы, синхронизированные с моим компьютером, которые старше определенного периода времени. В результате заархивированные файлы исчезнут с моего компьютера при следующей синхронизации.

Я нашел несколько сценариев для перемещения файла, но кажется сложным переместить файл и сохранить структуру пути, как если бы он был перемещен с помощью команды robocopy/powershell локально на компьютере.

есть идеи, возможна ли такая функция с помощью скриптов Google Apps?

Пока я еще не интегрировал функцию копирования/удаления. Я получаю путь к папке, и я думаю, должен быть способ проверить, существует ли путь в месте назначения, и если нет, создать подпапки?

function FilesModifiedLastWeek(){

// Find files modified last week

  var today     = new Date();
  var oneDayAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);  
  var startTime = oneDayAgo.toISOString();

  // The magic search expression
  var search = '(trashed = true or trashed = false) and (modifiedDate > "' + startTime + '")';
  var files  = DriveApp.searchFiles(search);

  // Loop through all the files in the search results
  while( files.hasNext() ) {

    var file = files.next();

    var fileName    = file.getName();
    var parentFolder = file.getParents();
    folders = [];

    //Get full path
    while (parentFolder.hasNext()) {
      parentFolder = parentFolder.next();
      var title = parentFolder.getName();
      folders.push(parentFolder.getName());
      parentFolder = parentFolder.getParents();
    }
    var fileURL     = file.getUrl();
    var dateCreated =  Utilities.formatDate(file.getDateCreated(), "Europe/Zurich", "yyyy-MM-dd HH:mm");
    Logger.log("Filename: " + fileName + " Folder path: " + folders.reverse().join("/") + " File creation date:" + dateCreated);
  }
}

Дополнительный момент, это способ исключить папку «Архив» из поиска? :)


person poypoy    schedule 28.11.2019    source источник
comment
Не могли бы вы уточнить, что вы подразумеваете под сохранением пути к папке? Где он должен храниться?   -  person Anton Dementiev    schedule 28.11.2019
comment
Привет, я имею в виду, что если файл, который нужно переместить, если он находится в My Compter/LambdaFolder/AlphaSubFolder/Myfile.pdf, я бы хотел сохранить этот файл в Archive/LambdaFolder/AlphaSubFolder/Myfile.pdf   -  person poypoy    schedule 28.11.2019
comment
Метод getFoldersByName(name) можно вызвать для экземпляра класса Folder, чтобы получить все дочерние папки. Если FolderIterator, возвращаемый этим методом, возвращает true после вызова hasNext(), папка уже существует, если нет — ее необходимо создать (это также означает, что весь путь не существует). Вы можете повторить этот процесс для всего пути, а затем переместить файл в последнюю папку и удалить его из предыдущего родителя. Это позволит вам переместить файл, не копируя его. Это то, что вы ищете?   -  person Anton Dementiev    schedule 28.11.2019


Ответы (1)


Этого можно добиться с помощью расширенных служб Диска и одной дополнительной функции в вашем коде. .

Мы будем использовать команду исправления для добавления и удаления родительского папки.

Необязательные параметры запроса

addParents string Разделенный запятыми список родительских идентификаторов для добавления.

removeParents string Список разделенных запятыми родительских идентификаторов, которые нужно удалить.

Код такой:

function placeFileInFolders(file, folders) {
  var archiveFolder = DriveApp.getFoldersByName("Archive Folder").next();
  
  var lastFolder = archiveFolder;
  for (var i=0; i<folders.length; i++) {
    if (lastFolder.getFoldersByName(folders[i]).hasNext()) {
      lastFolder = lastFolder.getFoldersByName(folders[i]).next();
    } else {
      lastFolder = lastFolder.createFolder(folders[i]);
    }
  }
  var newFile = Drive.Files.patch({}, file.getId(), {
    addParents: lastFolder.getId(),
    removeParents: file.getParents().next().getId()
  });
}

И вы можете использовать его следующим образом:

    //...
    Logger.log("Filename: " + fileName + " Folder path: " + folders.reverse().join("/") + " File creation date:" + dateCreated);
    placeFileInFolders(file, folders.reverse());
    //...

Улучшения

Поделился со мной

Я также добавил один дополнительный случай, когда ваш код сможет обрабатывать файлы, которыми я поделился.

    //...
    if (!parentFolder.hasNext()) {
      folders.push("Shared With Me");
    }
    while (parentFolder.hasNext()) {
    //...

Удалить пустые папки

Этот скрипт не удаляет папки, все содержимое которых перемещено в Архив.

person ZektorH    schedule 28.11.2019
comment
Пришлось изменить: //... placeFileInFolders(file, folders); ...// В противном случае работает как шарм! 2 балла: - Есть ли шанс исключить архивную папку из первоначального поиска? - Пустые папки не удаляются, как вы упомянули. Сложно будет добавить эту фичу с учетом всего пути? Хорошая мысль для совместного со мной! :) - person poypoy; 28.11.2019
comment
@poypoy, вы можете использовать пользовательские свойства, а затем исключить их из поискового запроса с помощью и (нет (свойства имеют «архив»). Чтобы удалить пустые папки, вам нужно будет после перемещения файла проверить, не пуста ли предыдущая родительская папка. - person ZektorH; 29.11.2019
comment
Спасибо за информацию. Я пробовал не устанавливать свойства и получаю ошибку q в файлах.HasNext(). Я предполагаю, что некоторые кавычки не настроены должным образом в свойстве поиска. Это правильный способ использовать это? var search = '(удалено = true или удалено = false) и (modifiedDate › ' + startTime + ') и (not(свойства заархивированы))'; - person poypoy; 29.11.2019
comment
Если вы хотите использовать кавычки внутри строки, не забудьте их экранировать. Это означает, превратиться в \. Это нужно сделать только для внутренних котировок. var search = "(trashed = true or trashed = false) and (modifiedDate > \"" + startTime + "\") and (not(properties has \"archived\"))"; - person ZektorH; 29.11.2019
comment
спасибо за понимание. Однако та же ошибка остается. Я изменил запрос как таковой, и теперь он делает то, что я искал :) var search = "(trashed = true or trashed = false) and (modifiedDate > \"" + startTime + "\") and (not \"root\" in parents)"; Ура - person poypoy; 02.12.2019