使用 Apps 脚本将文件从一个文件夹复制到另一个文件夹
Copy files from one folder to another on Drive with Apps Script
团队成员将内容(无论文件类型如何)上传到云端硬盘上的文件夹中。我需要使用触发器自动将此内容复制到另一个文件夹,并能够从那里移动它。
我不是原始内容的所有者,因此无法使用“MoveFile”功能。
我已经尝试过将文件自动复制到目标文件夹中,并且可以使用以下代码:
function CopyFiles() {
var srcFldr = DriveApp.getFolderById("***ID***");
var srcFiles = srcFldr.getFiles();
var desFldr = DriveApp.getFolderById("***ID***");
var desFiles = desFldr.getFiles();
var dfnA = [];
while (desFiles.hasNext()) {
var df = desFiles.next();
dfnA.push(df.getName());
}
while (srcFiles.hasNext()) {
var sf = srcFiles.next();
if (dfnA.indexOf(sf.getName()) == -1) {
sf.makeCopy(sf.getName(), desFldr);
}
}
}
但是,我需要全天将此复制的内容移动到其他文件中,但每次我这样做时,同一个文件都会使用新触发器复制回上面的目标文件夹,从而创建一个永久循环。
有没有办法:
- 尽管不是这些文件的所有者,但仍要从原始源文件夹中移动文件?
- 仅在上传或修改时复制内容一次?
或者 3) 另一种更好、更聪明的方法?
感谢您的帮助!
我建议采用以下工作流程:
- 对于复制到目标文件夹的每个文件,存储
fileId
。您可以为此使用 Properties Service。
- 将文件从一个文件夹复制到另一个文件夹时,请检查
fileId
之前是否已存储。
代码片段:
function CopyFiles() {
var srcFldr = DriveApp.getFolderById("***ID***");
var srcFiles = srcFldr.getFiles();
var desFldr = DriveApp.getFolderById("***ID***");
var desFiles = desFldr.getFiles();
var dfnA = [];
var key = "fileIDs";
var scriptProperties = PropertiesService.getScriptProperties();
var property = scriptProperties.getProperty(key); // Retrieve fileIDs property
// Get array of fileId, or empty array if no file has been copied before:
var arrayIDs = property ? JSON.parse(property) : [];
while (desFiles.hasNext()) {
var df = desFiles.next();
dfnA.push(df.getName());
}
while (srcFiles.hasNext()) {
var sf = srcFiles.next();
// Check not only file name, but also whether fileId has been stored before:
if (dfnA.indexOf(sf.getName()) == -1 && arrayIDs.indexOf(sf.getId()) == - 1) {
sf.makeCopy(sf.getName(), desFldr);
arrayIDs.push(sf.getId()); // Add fileId to array of IDs
}
}
scriptProperties.setProperty(key, JSON.stringify(arrayIDs)); // Store updated array
}
参考:
团队成员将内容(无论文件类型如何)上传到云端硬盘上的文件夹中。我需要使用触发器自动将此内容复制到另一个文件夹,并能够从那里移动它。
我不是原始内容的所有者,因此无法使用“MoveFile”功能。
我已经尝试过将文件自动复制到目标文件夹中,并且可以使用以下代码:
function CopyFiles() {
var srcFldr = DriveApp.getFolderById("***ID***");
var srcFiles = srcFldr.getFiles();
var desFldr = DriveApp.getFolderById("***ID***");
var desFiles = desFldr.getFiles();
var dfnA = [];
while (desFiles.hasNext()) {
var df = desFiles.next();
dfnA.push(df.getName());
}
while (srcFiles.hasNext()) {
var sf = srcFiles.next();
if (dfnA.indexOf(sf.getName()) == -1) {
sf.makeCopy(sf.getName(), desFldr);
}
}
}
但是,我需要全天将此复制的内容移动到其他文件中,但每次我这样做时,同一个文件都会使用新触发器复制回上面的目标文件夹,从而创建一个永久循环。
有没有办法:
- 尽管不是这些文件的所有者,但仍要从原始源文件夹中移动文件?
- 仅在上传或修改时复制内容一次?
或者 3) 另一种更好、更聪明的方法?
感谢您的帮助!
我建议采用以下工作流程:
- 对于复制到目标文件夹的每个文件,存储
fileId
。您可以为此使用 Properties Service。 - 将文件从一个文件夹复制到另一个文件夹时,请检查
fileId
之前是否已存储。
代码片段:
function CopyFiles() {
var srcFldr = DriveApp.getFolderById("***ID***");
var srcFiles = srcFldr.getFiles();
var desFldr = DriveApp.getFolderById("***ID***");
var desFiles = desFldr.getFiles();
var dfnA = [];
var key = "fileIDs";
var scriptProperties = PropertiesService.getScriptProperties();
var property = scriptProperties.getProperty(key); // Retrieve fileIDs property
// Get array of fileId, or empty array if no file has been copied before:
var arrayIDs = property ? JSON.parse(property) : [];
while (desFiles.hasNext()) {
var df = desFiles.next();
dfnA.push(df.getName());
}
while (srcFiles.hasNext()) {
var sf = srcFiles.next();
// Check not only file name, but also whether fileId has been stored before:
if (dfnA.indexOf(sf.getName()) == -1 && arrayIDs.indexOf(sf.getId()) == - 1) {
sf.makeCopy(sf.getName(), desFldr);
arrayIDs.push(sf.getId()); // Add fileId to array of IDs
}
}
scriptProperties.setProperty(key, JSON.stringify(arrayIDs)); // Store updated array
}