Google Script - Сравните имя файла с именем папки и переместите файл в папку, если имя совпадает - PullRequest
2 голосов
/ 13 января 2020

Я пытаюсь сравнить имена папок на моем диске Google с некоторыми именами файлов, а затем, если есть совпадение, переместить файл в соответствующую папку.

т.е. -

папки:
example1,
example2,
example3,

files:
example1.jpg (переместить в папку - example1),
example2.jpg (переместить в папку - example2) ,
example3.jpg (переместить в папку - example3)

Пока у меня есть два массива с именами папок и файлов, по которым я зацикливаюсь и сравниваю их.

Я борюсь со следующим битом - перемещением файла в папку.

Это то, что у меня так далеко ...

function folderAndFiles(){

  var fileArray = [];
  var folderArray = [];

  var dApp = DriveApp;
  var folderIter = dApp.getFoldersByName("files");
  var folder = folderIter.next();
  var fileIter = dApp.getFiles();
  var filesIter = folder.getFiles();



  while(filesIter.hasNext()) {
    var file = filesIter.next();
    var fileName = file.getName();
    fileArray.push(fileName)

  }

  fileArray.sort();
  var newFiles = fileArray.map(function(d) { return d.replace('.jpg', ''); });
  Logger.log(newFiles);



  var folderIterTwo = dApp.getFoldersByName("names");
  var folderTwo = folderIterTwo.next();
  var nameFolders = folderTwo.getFolders();



  while(nameFolders.hasNext()) {
    var folders =  nameFolders.next();
    var names = folders.getName();
    folderArray.push(names)

  }

  folderArray.sort();
  Logger.log(folderArray);



  for (var i = 0; i < folderArray.length; i++) {
    for (var j = 0; j < newFiles.length; j++) {
        if (folderArray[i] == newFiles[j]) {
         folderArray[i].addFile(fileArray[i]);
          Logger.log("Moved");
        }
    }
  }


}

Любой С благодарностью за помощь!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Попробуйте код ниже:

function folderAndFiles(){
  var files = [];
  var folderMap = {};

  var foldersParent = DriveApp.getFoldersByName("names").next();
  var filesParent = DriveApp.getFoldersByName("files").next();

  var filesIterator = filesParent.getFiles();
  var foldersIterator = foldersParent.getFolders();

  while(filesIterator.hasNext()) {
    var currentFile = filesIterator.next();
    files.push(currentFile);
  }

  while(foldersIterator.hasNext()) {
    var currentFolder =  foldersIterator.next();
    folderMap[currentFolder.getName()] = currentFolder;
  }

  for (var i=0; i<files.length; i++) {
    var file = files[i];
    var fileName = file.getName().replace('.jpg', '');
    var destinationFolder = folderMap[fileName];

    if (destinationFolder) {
      destinationFolder.addFile(files[i]);
      filesParent.removeFile(file);
      Logger.log("Moved");
    }
  }
}

Ход программы следующий:

  1. Создайте список со всеми файлами для перемещения.

  2. Создать словарь , который сопоставляет имена папок с фактическим объектом папки .

  3. Для каждого файла:

    1. Вычислить его имя (удалить расширение).
    2. Проверить, есть ли папка с таким именем.
    3. В случае, если есть, переместить соответствующий файл в эту папку.

Обратите внимание, что файл фактически перемещен - он добавляется в новую папку, но также удаляется из оригинальный. Если вы хотите просто скопировать его, удалите строку filesParent.removeFile(file); кода.

0 голосов
/ 13 января 2020

Это должно быть частичное решение, которое поможет вам реализовать остальное:

/**
 * @param {string} [parentFolderName] Name of the folder within which to search (defaults to Drive root)
 * @returns {Array <{ name: string, file: File }>} an array of objects with the properties 'name' (containing a string) and 'file' (containing the File object reference)
 */
function getNamedDriveFiles_(parentFolderName) {
  var parent = DriveApp.getRootFolder();
  if (parentFolderName) {
    var matches = DriveApp.getFoldersByName(parentFolderName);
    if (!matches.hasNext()) {
      throw new Error('No folder with name "' + parentFolderName + '"');
    }
    parent = matches.next();
  }
  const results = [];
  var iterator = parent.getFiles();
  while (iterator.hasNext()) {
    var file = iterator.next();
    // Store an object with the name of the file, and the File object itself
    results.push({ name: file.getName(), file: file });
  }
  return results;
}

function doStuff() {
  const files = getNamedDriveFiles_('my cool folder');
  files.sort(function (a, b) {
    return a.name < b.name;
  });
  // print filesizes
  files.forEach(function (obj) {
    Logger.log('Filename: "' + obj.name + '"; size: ' + obj.file.getSize());
  });
}

Вы должны иметь возможность реализовать аналогичную функцию для объектов вашей папки, а затем легко ссылаться на файл и папку. для данного имени файла и foldername.

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