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 = [
'user1@gmail.com',
'user22@gmail.com',
'user333@gmail.com',
'user4444@gmail.com'
];
// находит файлы для переноса, делает нужные проверки и запускает перенос
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();
}