Перемещение файлов на Google Диске с помощью Google Script
Я пытаюсь создать документы, используя информацию, размещенную в формах Google, а затем, когда документ будет создан, я хотел бы переместить документ в общую папку для просмотра.
На данный момент у меня есть сценарий, берущий всю информацию из связанной таблицы Google Forms.
Используя эту информацию, я использую следующий код для создания документа:
var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
var newDoc = DocumentApp.create(requestID + " - " + requestSummary);
Это создает документ успешно в моей корневой папке Google Drive, но я не могу переместить его туда, куда я хочу переместить.
Я видел много постов, предлагающих использовать такие вещи, как targetFolder.addFile (newDoc), но это не работает, аналогично я видел примеры, такие как newDoc.addToFolder (targetFolder), но опять же, это не работает для меня.
Кажется, что все онлайн-вопросы, которые люди уже задавали по этому поводу, используют предыдущие версии API, которые больше не применяются, и эти методы не применяются к новой функциональности DriveApp.
Что бы я хотел, если это возможно, создать новый документ, как указано выше, чтобы я мог редактировать содержимое с помощью сценария, а затем иметь возможность перемещать этот файл в общую папку. (Из того, что я понимаю, в настоящее время нет функции перемещения, поэтому достаточно сделать копию и удалить старую).
9 ответов
Если мы сделаем копию файла и удалим оригинал, это изменит URL-адрес файла, а также не сохранит настройки общего доступа к файлам.
В Drive можно добавить файл в несколько папок с помощью метода.addFolder() службы DriveApp. Вы можете добавить файл в целевую папку, а затем удалить файл из непосредственной родительской папки.
function moveFiles(sourceFileId, targetFolderId) {
var file = DriveApp.getFileById(sourceFileId);
file.getParents().next().removeFile(file);
DriveApp.getFolderById(targetFolderId).addFile(file);
}
Это мой первый пост! Я знаю, что на этот вопрос уже отвечали несколько раз, но на самом деле я столкнулся с этим вопросом, работая над своим проектом, и, просматривая документацию Apps Script, я нашел краткий способ сделать это. Вариант ответа some1.
var file = DriveApp.getFileById(fileid);
DriveApp.getFolderById(folderid).addFile(file);
DriveApp.getRootFolder().removeFile(file);
Надеюсь, поможет!
Похоже, что теперь есть функция moveTo() с Drive API (расширенные службы), которая упрощает перемещение файлов:
moveTo(пункт назначения)
Перемещает этот элемент в указанную папку назначения.
Текущий пользователь должен быть владельцем файла или иметь как минимум права на редактирование текущей родительской папки элемента, чтобы переместить элемент в папку назначения.
Вот код, который я использовал для перемещения всех файлов из папки "ввод снимка экрана" в папку "обработанный снимок экрана":
var inputFolder = DriveApp.getFolderById(SCREENSHOT_INPUT_FOLDER_ID);
var processedFolder = DriveApp.getFolderById(SCREENSHOT_PROCESSED_FOLDER_ID);
var files = inputFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
file.moveTo(processedFolder);
}
В классах " Файл" или " Папка" отсутствует прямой способ перемещения файлов из одной папки на Google Диске в другую. Как вы упоминали, вы можете скопировать файл в другую папку с помощью метода makeCopy(), а затем удалить его с помощью setTrashed (), код должен выглядеть следующим образом:
var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
var newDoc = DocumentApp.create(requestID + " - " + requestSummary); // Creates the Document in the user's Drive root folder
// Modify the new document here, example:
// var body = newDoc.getBody();
// body.appendParagraph("A paragraph.");
// newDoc.saveAndClose();
var driveFile = DriveApp.getFileById(newDoc.getId()); // Gets the drive File
driveFile.makeCopy(newDoc.getName(), targetFolder); // Create a copy of the newDoc in the shared folder
driveFile.setTrashed(true); // sets the file in the trash of the user's Drive
РЕДАКТИРОВАТЬ:
Вторую мысль и с учетом комментариев Рубена. Я согласен, что лучше реализовать ответ Амита.
Используйте File.moveTo(место назначения).
var newFileId = newDoc.getId();
var newFile = DriveApp.getFileById(newFileId);
newFile.moveTo(targetFolder);
Немного более безопасный подход по сравнению с предыдущими:
Если вы сначала удалите ссылку на файл, вы не сможете добавить файл.
Если файл уже находится в целевой папке, то подход, предоставленный Амитом ( /questions/9500928/peremeschenie-fajlov-na-google-diske-s-pomoschyu-google-script/9500936#9500936), удаляет только файл.
Итак, предлагаю использовать следующий подход:
function move_file(file_id, target_folder_id) {
var source_file = DriveApp.getFileById(file_id);
var source_folder = source_file.getParents().next();
if (source_folder.getId() != target_folder_id) {
DriveApp.getFolderById(target_folder_id).addFile(source_file);
source_folder.removeFile(source_file);
}
}
можно улучшить:
стиль верблюда javascript
проверка нескольких местоположений
Скрипт переносит все ваши личные файлы на общий диск (Team drive). Сохраняет структуру папок.
DRIVE_FOLDER_ID = '111aaa'; // Folder ID on the shared drive
function start() {
var files = DriveApp.searchFiles('"me" in owners');
while (files.hasNext()) {
var file = files.next();
newPath = fileMoveWithPath(file, DRIVE_FOLDER_ID);
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();
}
console.info("Old path: ", getFullPath(file));
if (folders.length > 0)
targetPath = makeNewPath(folders, DriveApp.getFolderById(root));
else
targetPath = DriveApp.getFolderById(root);
if (targetPath) {
targetFile = file.moveTo(targetPath);
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();
}
Попробуй это:
var file = DriveApp.getFileById(newDoc.getId());
targetFolder.addFile(file);
//DriveApp.getFolderById('root').removeFile(file); // remove from root
На этот вопрос ответили, но здесь немного другая конфигурация:
function moveFile(parameterObject) {
var currentFolderID,file,fileToMoveID,sourceFolder,targetFolder,targetFolderID;
fileToMoveID = parameterObject.fileToMoveID;
currentFolderID = parameterObject.currentFolderID;
targetFolderID = parameterObject.targetFolderID;
file = DriveApp.getFileById(fileToMoveID);//Get the file to move
if (!file) {
functionToHandleThisKindOfThing("there is no file");
return;
}
if (currentFolderID) {//The folder ID holding the current file was passed in
sourceFolder = DriveApp.getFolderById(currentFolderID);
} else {//No ID for the current folder
sourceFolder = file.getParents();
if (sourceFolder) {
if (sourceFolder.hasNext()) {
sourceFolder = sourceFolder.next();
}
}
}
targetFolder = DriveApp.getFolderById(targetFolderID);
targetFolder.addFile(file);
sourceFolder.removeFile(file);
}
function testCode() {
var o;
o = {
'fileToMoveID':"File ID of file to Move",
"targetFolderID":"ID of folder to Move to"
}
moveFile(o);
}