使用 Google 脚本在 Google Drive 中移动文件

问题描述 投票:0回答:9

我正在尝试使用通过 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 功能。

如果可能的话,我想要的是创建上述新文档,以便我可以使用脚本编辑内容,然后能够将该文件移动到共享文件夹。 (据我了解,目前没有“移动”功能,因此复制并删除旧的就足够了)。

google-apps-script google-sheets google-drive-api
9个回答
41
投票

如果我们复制文件并丢弃原始文件,则会更改文件 URL,并且文件共享设置也不会保留。

在云端硬盘中,可以使用 .addFolder() 服务的

DriveApp
方法将文件
添加到多个文件夹
。您可以将文件添加到目标文件夹,然后从直接父文件夹中删除文件。

function moveFiles(sourceFileId, targetFolderId) {
  var file = DriveApp.getFileById(sourceFileId);
  var folder = DriveApp.getFolderById(targetFolderId);
  file.moveTo(folder);
}

16
投票

这是我的第一篇文章!我知道这个问题已经被回答过几次了,但实际上我在处理我的项目时遇到了这个问题,并且在查看 Apps 脚本文档时,我找到了一种简洁的方法来做到这一点。 some1 答案的变体。

var file = DriveApp.getFileById(fileid);
DriveApp.getFolderById(folderid).addFile(file);
DriveApp.getRootFolder().removeFile(file);

希望有帮助!


5
投票

看起来现在有一个带有 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);
}

4
投票

FileFolder 类中没有直接方法将文件从 Google Drive 中的一个文件夹移动到另一个文件夹。正如您提到的,您可以复制文件 // 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

编辑:

再考虑一下鲁本的评论。我同意实施阿米特的答案是更好的做法。


3
投票

使用 File.moveTo(destination).

var newFileId = newDoc.getId();
var newFile = DriveApp.getFileById(newFileId);
newFile.moveTo(targetFolder);

1
投票

与之前的方法相比,更安全一点的方法:

  1. 如果您先删除文件的链接,那么您将无法添加文件。

  2. 如果文件已位于目标文件夹中,则 Amit 提供的方法 (https://stackoverflow.com/a/38810986/11912486) 仅删除文件。

所以,我建议使用以下方法:

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 骆驼风格

  • 多个位置验证


1
投票

该脚本将您的所有个人文件传输到共享磁盘(团队驱动器)。 保存文件夹结构。

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();
}

0
投票

试试这个:

var file = DriveApp.getFileById(newDoc.getId());
targetFolder.addFile(file);
//DriveApp.getFolderById('root').removeFile(file); // remove from root

0
投票

这个问题已得到解答,但这里的配置略有不同:

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);

}
© www.soinside.com 2019 - 2024. All rights reserved.