繁体   English   中英

使用 Google Script 在 Google 云端硬盘中移动文件

[英]Moving Files In Google Drive Using Google Script

我正在尝试使用通过 Google forms 发布的信息创建文档,然后在创建文档后我想将文档移动到共享文件夹中供人们查看。

目前,我有脚本从 Google Forms 链接的电子表格中获取所有信息。

使用该信息,我使用以下代码创建文档:

  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var newDoc = DocumentApp.create(requestID + " - " + requestSummary);

这在我的 Google 云端硬盘根文件夹中成功创建了文档,但我似乎无法将其移动到我想移动到的位置。

我看到很多帖子建议使用 targetFolder.addFile(newDoc) 之类的东西,但这不起作用,同样我看到了 newDoc.addToFolder(targetFolder) 之类的示例,但这对我来说同样不起作用。

似乎人们已经问过的所有在线问题都使用不再适用的以前的 API 版本,这些方法不适用于新的 DriveApp 功能。

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

如果我们制作文件的副本并将原始文件删除,它将更改文件 URL,并且文件共享设置也不会保留。

在 Drive 中,可以使用DriveApp服务的.addFolder()方法将文件添加到多个文件夹 您可以将文件添加到目标文件夹,然后从直接父文件夹中删除该文件。

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

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

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

希望有帮助!

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

编辑:

再次考虑并考虑到鲁本的评论。 我同意实施 Amit 的答案是更好的做法。

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

与以前的方法相比,一种更安全的方法:

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

  • 多地点验证

试试这个:

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

}

使用File.moveTo(destination)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM