首页 > 解决方案 > 使用 Apps 脚本将文件从一个文件夹复制到云端硬盘上的另一个文件夹

问题描述

团队成员将内容(无论文件类型如何)上传到云端硬盘上的文件夹中。我需要使用触发器自动将此内容复制到另一个文件夹中,并能够从那里移动它。

我不能使用“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);
    }
  }
}

但是,我需要全天将此复制的内容移动到其他文件中,但每次我这样做时,同一个文件都会使用新触发器复制回上面的目标文件夹,从而创建一个永久循环。

有没有办法:

  1. 尽管不是这些文件的所有者,但从原始源文件夹中移动文件?
  2. 在上传或修改时只复制一次内容?

或者 3) 另一种更好、更聪明的方法?

谢谢你的帮助!

标签: google-apps-scriptcopymovefile

解决方案


我建议以下工作流程:

  • 对于复制到目标文件夹的每个文件,将fileId. 您可以为此使用属性服务
  • 将文件从一个文件夹复制到另一个文件夹时,请检查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
}

参考:


推荐阅读