Перемещение файлов на 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);

Немного более безопасный подход по сравнению с предыдущими:

  1. Если вы сначала удалите ссылку на файл, вы не сможете добавить файл.

  2. Если файл уже находится в целевой папке, то подход, предоставленный Амитом ( /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);

}