March 25, 2022

Перенос всех своих файлов на Общие диски Гугла

Transfer google drive files to shared drive (team drive) — App Google Script
Гугл закрывает Google G Suite и люди переезжают в иные места, а чтобы перенести файлы между доменами или разными пространствами Google Workspace необходимо залить файлы на общий диск.

DRIVE_FOLDER_ID = '111aaa'; // Идентификатор папки на общем диске куда переносим

// Перенос не всех файлов, а общих с другими колегами
// если хоть один пользователь имеет права на редактирование документа, то доступ будет передан иначе будет пропущен
var CHECK_EDITORS = false;
var EDITORS = [  
  '[email protected]',
  '[email protected]',
  '[email protected]',
  '[email protected]'
];

// находит файлы для переноса, делает нужные проверки и запускает перенос
function move() {
  
  var files = DriveApp.searchFiles('"me" in owners');
  while (files.hasNext()) {
    var file = files.next();

    // console.info("Old path: ", getFullPath(file));

    var fileEditors = file.getEditors().map(function(x) { return x.getEmail().toLowerCase(); });
    if (!CHECK_EDITORS || fileEditors.some(function(e){return EDITORS.indexOf(e) != -1;}) ) {
      newPath = fileMoveWithPath(file, DRIVE_FOLDER_ID);
      if (newPath)
        console.info("New path: ", getFullPath(newPath));
    }
  }
}

// Перенос файла с предварительным
function fileMoveWithPath(file, root) {
  var folders = [],
      parent = file.getParents();

  // Проходим по иерархии папок текущего файла до корня
  while (parent.hasNext()) {
    parent = parent.next();
    folders.push(parent);
    parent = parent.getParents();
  }

  if (folders.length > 0)
    targetPath = makeNewPath(folders, DriveApp.getFolderById(root));
  else
    targetPath = DriveApp.getFolderById(root);

  if (targetPath) {
    try {
      targetFile = file.moveTo(targetPath);
    } catch (e) {
      console.error("Error path: ", getFullPath(file));
      return;
    }
    return targetFile;
  };
  return;
}

// рекурсивно создает полный путь из массива. Работает справа налево. Возвращает конечную папку.
function makeNewPath(folders, newroot) {
  var f = folders.pop();
  var query = "'" + newroot.getId() + "' in parents and title = '" + f.getName() + "' and mimeType='application/vnd.google-apps.folder' "
  var targetFolder = DriveApp.searchFolders(query);
  if (targetFolder.hasNext()) 
    targetFolder = targetFolder.next()
  else
    targetFolder = newroot.createFolder(f.getName());

  if (folders.length > 0) 
    return makeNewPath(folders, targetFolder)
  else
    return targetFolder;
}

// Возвращает строку полного пути к файлу или папке
function getFullPath(file) {
  var folders = [],
      parent = file.getParents();
  while (parent.hasNext()) {
    parent = parent.next();
    folders.push(parent.getName());
    parent = parent.getParents();
  }
  if (folders.length) {
    return
     '> /' + folders.reverse().join("/") + '/' + file.getName();
  }
  return '> /' + file.getName();
}