如何将文件复制并移动到Google Apps脚本中的文件夹?

use*_*396 2 move google-apps-script

有没有办法复制和重命名文件并将该副本移动到特定文件夹而不在根文件夹中有第二个副本?我已经使用了复制,重命名,按不同顺序移动的组合,但每次,我仍然最终得到了根驱动器重命名文件的副本.这是默认的吗?至少可以说是令人讨厌的.

Ser*_*sas 7

编辑:我看了你的原始问题(编辑前),从那里我理解你对文件和文件夹在Google云端硬盘中如何工作的困惑.

当您复制文件时,您会在根文件夹中获得一个新文件,当您将此新文件添加到另一个文件夹时,您必须将其视为在此文件上粘贴标签而不创建任何新副本.

您实际上可以在根文件夹和其他文件夹中看到该文件,但它是具有2个不同标签的完全相同的文件!(你确实注意到,因为你试图删除它并看到它在两个地方都被删除了)

您必须要做的唯一事情是将新文件放在其文件夹中,而不是在根目录中显示它以删除"根标签".

这就是谷歌驱动器的工作方式.当你考虑它并与本地硬盘存储器进行比较时,它就变得合乎逻辑:当你在同一个逻辑驱动器上将文件从一个文件夹移动到另一个文件夹时,你不会移动数据(即磁盘上的字节),而只是告诉它磁盘操作系统,该文件位于地图上的其他位置.

因此,将Google云端硬盘视为一个(非常)大型磁盘机,数十亿个文件无法移动,但您可以根据需要添加多个标签;-)(最重要的标签是您的Google帐户ID!)

在你描述的情况下玩这些标签只需尝试这个简单的功能:

function copyAndMove(file,folder){
var newfile=file.makeCopy('copy of '+file.getName());// here you can define the copy name the way you want...
newfile.addToFolder(folder);//  add the copy to the folder
newfile.removeFromFolder(DocsList.getRootFolder());// and remove it from your root folder
}
Run Code Online (Sandbox Code Playgroud)

测试它只需使用2个必需参数:对象和你可以从许多不同方法获得filefolder对象,请参阅DocsList文档,了解如何获取它的详细信息,但我想你已经知道了;-)


Riy*_*eed 6

在新版本的Google Apps脚本中,您需要完成以下任务:

file.makeCopy("new name", folder);
Run Code Online (Sandbox Code Playgroud)


jua*_*gan 3

是的,谷歌没有提供移动方法,这有点奇怪。但是,考虑到驱动器的工作原理以及一个文件可以属于多个文件夹,您编写自己的动作是有道理的。这是我写的一个简单的移动函数:

// Moves a file to a new folder by removing all current
// parent folders and then adding the new one.
function moveFileTo(fileObj, folderObj) {
  // Attempt the move only if folderObj has a value.
  // Otherwise, the file will be left without a folder.
  // (Lost files can be found in the "All items" area.)
  if (folderObj) {
    var folders = fileObj.getParents();
    for (var i = 0; i < folders.length; i++) {
      fileObj.removeFromFolder(folders[i]);
    }
    fileObj.addToFolder(folderObj);
    return true;
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

基本上,像这样使用它:

var file = DocsList.getFileById(fileID);
var folder = DocsList.getFolder('Some folder name');

// Make a backup copy.
var file2 = file.makeCopy('BACKUP ' + Utilities.formatDate(new Date(), Session.getTimeZone(), 'yyyy-MM-dd') + '.' + file.getName());
// Move the backup file.
if (moveFileTo(file2, folder)) {
  ...
Run Code Online (Sandbox Code Playgroud)

我应该注意到这个简单的函数就是这么简单。它假设您可以删除所有父文件夹——拥有的或共享的。如果您不小心,这可能会对不同用户的不同共享文件夹中的共享文件产生意想不到的后果。然而,它似乎不会删除未与该脚本的用户共享的父文件夹——这很好。无论如何,更好地控制事情的一种明显的替代方法是指定“来自”文件夹和“到”文件夹。