Попытка создать Google Drive Script для копирования и перемещения файлов - PullRequest
0 голосов
/ 24 января 2020

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

Моя проблема: Моя компания работает для многих других компаний (например, прилагается фотография иерархии дисков). Каждая компания, с которой мы работаем, получает собственную папку, которая вложена в папку «Рубашки для других компаний». Мы помещаем все их активы в эти папки (логотипы, макеты, цитаты).

Мы хотим создать скрипт он просмотрит отдельные папки компании и возьмет любой файл, который начинается со слова Mock, автоматически скопирует его и поместит в database folder, показанный на рисунке ниже.

Вот сценарий, который есть до сих пор. Но у меня возникают проблемы с попаданием в подпапки (ford tshirts and designs). Не только это, но если он запускается каждый день, сценарий будет дублировать файлы, которые он дублировал в прошлом, которые я хочу избегать.

Сценарий:

Function getTheFiles() {

	var dApp = DriveApp;
	var folderIter = dApp.getFolderByName("Shirts for other companies");
	var folder = folderIter.next();
	var filesIter = folder.getFiles();
	var dataBase = folder.getFoldersByName("database1").next();

	var i = 1;

	while(filesIter.hasNext()) {
		var file = filesIter.next();
		var filename = file.getName();
		
		if(filename = "mocking") {
			file.makeCopy(dataBase);
		}

		logger.log(filename);
		i++;
	}

Ответы [ 2 ]

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

Если я вас правильно понял, вы хотите:

  • Скопировать все файлы из разных подпапок в папку «Рубашки для других компаний», которые начинаются со слова mock, чтобы Database folder (который также находится в главной папке).
  • Избегайте многократного копирования файлов.

Если это так, вы можете сделать следующее:

  • Поиск всех файлов в каждой подпапке главной папки, которые начинаются с mock, за исключением файлов внутри Database folder. Для этого вы перебираете все файлы в каждой подпапке (после проверки подпапка не называется Database folder. Для каждого файла вы проверяете, что имя начинается с mock, используя метод substring .
  • Чтобы отслеживать, какие файлы копируются, и, таким образом, избегать дублирования, вы можете использовать PropertiesService , который может хранить пары ключ-значение. Идентификатор каждого скопированного файла копируется в скрипт свойство, а затем, при следующем запуске сценария, он проверяет, есть ли идентификатор в свойстве. В этом случае файл не копируется снова. Следует отметить, что свойства сценария могут хранить только строки, поэтому что массивы необходимо преобразовывать в строку каждый раз, когда мы хотим сохранить новый идентификатор (через toString , и обратно в массив, через split .

Функция, описанная ниже, выполняет все эти функции (более подробно см. Встроенные комментарии):

function copyFiles() {
  var mainFolder = DriveApp.getFoldersByName("Shirts for other companies").next();
  var folders = mainFolder.getFolders(); // Get folder iterator from main folder 
  var databaseFolderName = "Database folder"; // You database folder name
  var databaseFolder = mainFolder.getFoldersByName(databaseFolderName).next(); // Get databse folder
  var idsArray = []; // Array to store the ids of the copied files
  while (folders.hasNext()) { // Iterate through each folder in the main folder
    var folder = folders.next();
    if (folder.getName() !== databaseFolderName) { // Check current folder is not the database folder
      var files = folder.getFiles();
      while (files.hasNext()) { // Iterate through each file in each subfolder
        var file = files.next();
        if (file.getName().substring(0, 4).toLowerCase() === "mock") { // Check that file name starts with "mock"
          // Get ids of the files that were copied in previous executions:
          var key = "copied-ids";
          var scriptProperties = PropertiesService.getScriptProperties();
          var ids = scriptProperties.getProperty(key);
          if (ids) idsArray = ids.split(",");
          else ids = "";
          // Get current file id:
          var id = file.getId();
          // Check that current file id is not in properties (not copied before):
          if (idsArray.indexOf(id) === -1) {
            file.makeCopy(databaseFolder); // Copy file to database folder
            idsArray.push(id); // Add file id to the array of copied files
          }
          ids = idsArray.toString();
          scriptProperties.setProperty(key, ids);
        }
      }
    }
  }
}

Ссылка:

Надеюсь, это поможет.

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

Эта функция будет выполнять поиск файлов на всем диске Google, начинающихся с буквы Mock, и помещать имя, URL, идентификатор, тип (папку или файл) в активную электронную таблицу и вкладку с именем MoclList;

function getAllMocks() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('MocksList');
  sh1.clearContents();
  sh1.appendRow(['Name','Url','Id','Type']);
  getFnF();
  SpreadsheetApp.getUi().alert('Process Complete')
}

var level=0;
function getFnF(folder) {
  var folder= folder || DriveApp.getRootFolder();
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('MocksList');
  var files=folder.getFiles();
  while(files.hasNext()) {
    var file=files.next();
    if(file.getName().toLowerCase().slice(0,4)=='mock') {
      var firg=sh.getRange(sh.getLastRow() + 1,level + 1);
      firg.setValue(file.getName());
      firg.offset(0,1).setValue(Utilities.formatString('=HYPERLINK("%s","%s")',file.getUrl(),'FILE: ' + file.getName()));
      firg.offset(0,2).setValue(file.getId());
      firg.offset(0,3).setValue('File');
    }
  }
  var subfolders=folder.getFolders() 
  while(subfolders.hasNext()) {
    var subfolder=subfolders.next();
    var forg=sh.getRange(sh.getLastRow() + 1,level + 1);
    forg.setValue(subfolder.getName());
    forg.offset(0,1).setValue(Utilities.formatString('=HYPERLINK("%s","%s")',subfolder.getUrl(),'FOLDER: ' + subfolder.getName()));
    forg.offset(0,2).setValue(subfolder.getId());
    forg.offsert(0,3).setValue('Folder');
    //level++;
    getFnF(subfolder);
  }
  //level--;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...