移动一个文件夹中的所有文件
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':
我在 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':