移动一个文件夹中的所有文件

Move all files from one folder

我在 Google 驱动器中的应用程序脚本非常糟糕......我很沮丧。 我需要你的帮助。

我的根驱动器中有这样的文件夹:

students  
__kev  
___math  
___english  
__donald  
___math  
___english  
__tony  
___math  
___english  
  
transfer 
__math  

我想自动执行一个操作:将“传输”文件夹中的所有内容复制或移动到每个学生文件夹。

我可以在 PowerShell 上或 bash 使用同步客户端轻松完成此任务,但我现在需要它直接在驱动器上。

有什么想法吗?我想用工具脚本在文件上添加菜单。

这应该符合您的需要。改编自:this site。更改两个文件夹的id。

function start() {

  var transfertFolder = DriveApp.getFolderById("xxxxxxx-YhSCZXh1PDeqpE8mXjHHJJF");
  var studentFolder = DriveApp.getFolderById("xxxxxxx_cQgd3DZV9Ukt4yI_-jTS_86Z").getFolders();

  while (studentFolder.hasNext()){
    const student = studentFolder.next()
    copyFolder(transfertFolder,student)
  }
}

function copyFolder(source, target) {

  var folders = source.getFolders();
  var files = source.getFiles();

  while (files.hasNext()) {
    var file = files.next();
    file.makeCopy(file.getName(), target);
  }

  while (folders.hasNext()) {
    var subFolder = folders.next();
    var folderName = subFolder.getName();
    var targetFolder = target.createFolder(folderName);
    copyFolder(subFolder, targetFolder);
  }

}

算法很简单,但是有一个窍门。如果目标文件夹中已有同名文件,您需要决定脚本应该做什么。默认情况下 Google Drive 允许在一个文件夹中有多个同名文件,这可能会造成混淆。

我的脚本检查目标文件夹并在复制前删除同名文件(假设只有一个文件)。

function main() {

  const root_folder_ID  = "###"; // here is ID of your folder
  const root_folder     = DriveApp.getFolderById(root_folder_ID);
  const transfer_folder = root_folder.getFoldersByName("transfer").next(); // transfer folder

  // get array of subjects from transfer folder
  const subjects_generator = transfer_folder.getFolders();
  var subjects = [];
  while (subjects_generator.hasNext()) {
    var subj = subjects_generator.next();
    subjects.push(subj);    
  }

  // get students folders (a generator)
  const students_folder = root_folder.getFoldersByName("students").next();
  const students = students_folder.getFolders();
  
  // copy all subject folders (with content) into students folders
  while(students.hasNext()) {
    var student = students.next();
    for (var s in subjects) {
      Logger.log("folder '" + subjects[s] + "' started to copy to '" + student + "'");
      copy_folder(subjects[s], student);
      Logger.log("---");
    }
  }

}


function copy_folder(source_folder, target_folder) {

  // pick or create subject subfolder within target folder
  try {
    var subfolder = target_folder.getFoldersByName(source_folder.getName()).next();
  } catch(e) {
    var subfolder = target_folder.createFolder(source_folder.getName());
  }

  // get all files from source folder
  var files = source_folder.getFiles();

  // copy the files into the subfolder
  while(files.hasNext()) {

    var file = files.next();
    var file_name = file.getName();

    // try to remove old file with the same name in the target folder
    try {
      var old_file = subfolder.getFilesByName(file_name).next();
      old_file.setTrashed(true);
      Logger.log("old file '" + old_file + "' was removed")
    } catch(e) {}

    file.makeCopy(file.getName(), subfolder);
    Logger.log("file '" + file + "' is copied")
  }

}

要 运行 这个脚本,你必须在 Google 驱动器的某处创建一个新文档,进入菜单 'Tools' 并单击 'Script Editor'。

然后您需要将脚本文本粘贴到编辑器中并单击 'Run' 图标:

当然,首先您需要将您的文件夹 ID 粘贴到脚本的第二行。

或者,您可以在文档中制作自定义菜单,然后 运行 从那里制作脚本,无需脚本编辑器。

要制作自定义菜单,只需在脚本编辑器中的脚本末尾(或开始)添加此函数即可:

// custom menu
function onOpen() {
  DocumentApp.getUi().createMenu('Scripts')
  .addItem(' Copy files', 'main')
  .addToUi();
}

您将在重新加载文档后获得自定义菜单 'Script':