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

时间:2016-08-06 21:29:40

标签: google-apps-script google-sheets google-drive-api

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

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

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

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

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

我看过很多帖子建议使用像targetFolder.addFile(newDoc)这样的东西,但这不起作用,同样我看过像newDoc.addToFolder(targetFolder)这样的例子但是这对我来说不起作用

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

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

8 个答案:

答案 0 :(得分:16)

如果我们复制该文件并删除原件,则会更改文件URL,并且不会保留文件共享设置。

在云端硬盘中,可以使用DriveApp服务的.addFolder()方法add a file to multiple folders。您可以将文件添加到目标文件夹,然后从直接父文件夹中删除该文件。

function moveFiles(sourceFileId, targetFolderId) {
  var file = DriveApp.getFileById(sourceFileId);
  file.getParents().next().removeFile(file);
  DriveApp.getFolderById(targetFolderId).addFile(file);
}

答案 1 :(得分:9)

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

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

希望它有所帮助!

答案 2 :(得分:2)

FileFolder类中没有直接方法将文件从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

修改

在第二个想法并考虑到鲁本的评论。我同意实施Amit的答案是一种更好的做法。

答案 3 :(得分: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骆驼样式

  • 多个位置验证

答案 4 :(得分:1)

Drive API似乎有一个moveTo()函数(高级服务),可以轻松移动文件:

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

答案 5 :(得分:0)

试试这个:

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

答案 6 :(得分: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);

}

答案 7 :(得分:0)

使用File.moveTo(destination)

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