【问题标题】:Automatically delete files from specific folder自动删除特定文件夹中的文件
【发布时间】:2021-01-19 03:55:37
【问题描述】:

我只是想知道有没有办法让这个脚本 (https://www.cirriustech.co.uk/blog/how-to-auto-tidy-files-in-google-drive/) 在我的驱动器中的特定文件夹上运行。

我有一个使用谷歌表单和表格制作的项目,在谷歌表单中有一个上传表单,文件保存到特定文件夹。我的主文件夹(项目)有子文件夹,其中一个是文件存储的位置。我需要一个脚本,它会在一段时间内删除此文件夹中的文件。

我试图找到任何可以以这种方式工作的脚本,我觉得上面的链接越来越接近我的需要。任何有用的帮助或不同的脚本都会对我有很大帮助。

添加:这是代码

function GetFilesByDate() {
  var arrFileIDs = [];

  var Threshold = new Date().getTime()-3600*1000*24*7;
    // 30 is the number of days 
    //(3600 seconds = 1 hour, 1000 milliseconds = 1 second, 24 hours = 1 day and 30 days is the duration you wanted
    //needed in yr-month-day format

  var CullDate = new Date(Threshold);
  var strCullDate = Utilities.formatDate(CullDate, "GMT", "yyyy-MM-dd");
  console.info(strCullDate);

  var FileID = "";
  var FileName = "";

  //Create an array of file ID's by date criteria
  var files = DriveApp.searchFiles(
     'modifiedDate < "' + strCullDate + '"');

  while (files.hasNext()) {
    var file = files.next();
    var FileID = file.getId();
    var FileName = file.getName();

    if (FileName.indexOf('.mp4') > -1 ) {
    arrFileIDs.push(FileID);
    console.info('FileID: ' + FileID);
    console.info('Last Updated: ' + file.getLastUpdated());
    console.info('Filename: ' + FileName);
    }
  }

  return arrFileIDs;
  console.info('FileIDs Array: ' + arrFileIDs);
};

function DeleteFilesByDate() {
  var arrayIDs = GetFilesByDate();

  for (var i=0; i < arrayIDs.length; i++) {
    console.info('arrayIDs[i]: ' + arrayIDs[i]);
    //This deletes a file without needing to move it to the trash
    var DelResponse = Drive.Files.remove(arrayIDs[i]);
  }
};

我想要完成的是这个。我有来自谷歌表单上传的文件,我希望根据上传日期(上传后 7 / 8 天等)删除这些文件

【问题讨论】:

  • 您能添加您正在处理的代码吗?不要仅仅依赖外部链接,所有相关信息都应该在问题中。另外,说明你想要完成什么,你面临什么具体问题,你尝试了什么等等。看看stackoverflow.com/help/how-to-ask
  • 我已经添加了它们,TIA。
  • 所以,如果我理解正确的话,每次提交 Google 表单时,一些文件都会上传到某个云端硬盘文件夹,并且您希望在特定时间后以编程方式删除这些文件(7天,例如)。这是正确的吗?
  • 是的,先生,正确

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


【解决方案1】:

您只需要从文章中修改脚本中的搜索查询以检查父母属性。

  var files = DriveApp.searchFiles('modifiedDate < "' + strCullDate + '" and "' + parentFolderId + '" in parents');

其中 parentFolderId 是文件夹的 ID,而不是名称。

【讨论】:

  • 感谢您的回答,假设我的文件夹位于 Root>folder>subfolder>subsubfolder。我只是想删除子文件夹里面的东西,如何让它工作?
  • @bidtpirai 所以你想从你的主文件夹中的所有子文件夹(和子子文件夹等)中删除所有文件(不是文件夹)?
  • @lamblichus 我只想删除特定文件夹中的所有文件,先生。
  • @bidtpirai 那你有对应的folderId吗?
  • 您可以在浏览驱动器或通过文件夹名称搜索时从url中获取文件夹id,但文件夹名称不是唯一的。有大量在线资源可帮助您实施任一解决方案。
【解决方案2】:

从特定文件夹中删除文件:

如果您只想删除特定文件夹中的文件,您可以执行以下操作:

  • 检索folderId。文件夹的ID 对应文件夹 URL 的最后一段,如下所示:
https://drive.google.com/drive/folders/{FOLDER_ID}
  • 修改您的搜索查询以添加{FOLDER_ID} in parents
var files = DriveApp.searchFiles('modifiedDate < "' + strCullDate + '" and "' + {FOLDER_ID} + '" in parents');

注意ID 也可以通过编程方式检索,如果您知道名称并且此名称是唯一的,使用 DriveApp.getFoldersByName(name)(如果名称不是唯一的,您应该遍历 @ 987654322@为了找到你想要的文件夹):

DriveApp.getFoldersByName(name).next();

从所有子文件夹中删除文件:

如果要删除主文件夹中所有子文件夹中的文件,可以执行以下操作:

  • 根据您的主文件夹的folderID,使用递归检索此文件夹中的所有子文件夹(不仅是直接子文件夹,还包括“子子文件夹”等)。有关如何执行此操作的一个示例,请参阅this answer
  • 根据在上一步中检索到的文件夹 ID 列表,构建将用于 DriveApp.searchFiles(params)search query,为每个文件夹 ID 添加 "PARENT_FOLDER_ID" in parents,如果有多个文件夹 ID,则使用 operator or文件夹。由于您必须遍历一个数组并不断追加到单个输出字符串,因此使用reduce 是一个不错的选择,如下所示。我建议在此查询中添加title contains ".mp4",而不是稍后根据此条件进行过滤。

以下是您可以使用的可能脚本(我没有包含DeleteFilesByDate,因为据我了解,此函数不需要修改)。

代码sn-p:

function GetFilesByDate() {
  const Threshold = new Date().getTime()-3600*1000*24*7;
  const CullDate = new Date(Threshold);
  const strCullDate = Utilities.formatDate(CullDate, "GMT", "yyyy-MM-dd");
  const folderID = "YOUR_FOLDER_ID"; // Add your main folder ID here
  const folder = DriveApp.getFolderById(folderID);
  const folderIDs = recurseFolder(folder, [folderID]);
  const query = getSearchQuery(folderIDs, strCullDate);
  const files = DriveApp.searchFiles(query);
  let fileIDs = [];
  while (files.hasNext()) fileIDs.push(files.next().getId());
  return fileIDs;
};

function getSearchQuery(folderIDs, strCullDate) {
  let query = 'modifiedDate < "' + strCullDate + '" and title contains ".mp4"';
  query = folderIDs.reduce((acc, folderId, i) => {
    if (folderIDs.length === 1) {
      return acc + ' and "' + folderId + '" in parents';
    } else {
      switch (i) {
        case 0:
          return acc + ' and ("' + folderId + '" in parents';
        case folderIDs.length - 1:
          return acc + ' or "' + folderId + '" in parents)';
        default:
          return acc + ' or "' + folderId + '" in parents';
      }
    }
  }, query);
  return query;
}

function recurseFolder(folder, list){
  const subfolders = folder.getFolders();
  while (subfolders.hasNext()){
    const subfolder = subfolders.next();
    list.push(subfolder.getId());
    list = recurseFolder(subfolder, list);
  }
  return list;
}

参考:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多