遍历文件夹和子文件夹并重命名文件

时间:2018-12-10 14:47:01

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

对于“原因”管理,我需要重命名Google驱动器中的一堆文件。当我说“一堆”时,我在说数千。我正在编写一种方法来执行此操作。

到目前为止,我已经设法编写了一些代码,使我可以在文件夹结构的一级重命名文件。可以说文件夹结构为:

\Folder 1
   \Folder 2
   \Folder 2.2
       \Folder 3

此代码重命名了文件夹2和文件夹2.2中的所有文件(给定文件夹1的ID),但没有重命名文件夹1或文件夹3中的文件。我也不知道文件夹结构中有多少级。 / p>

我认为应该有一种方法可以让此代码的文件重命名为独立功能,并为顶层文件夹下的每个文件夹调用它。我只是不知道该怎么做。

我所拥有的如下:

function renameFile() {
 var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Main");
  var lastRow = sourceSheet.getLastRow();
  var filePaths = sourceSheet.getRange(4, 1, 1, 1).getValues(); 

  var pre = sourceSheet.getRange("C4").getValue(); 
  var folder = DriveApp.getFolderById(filePaths);

  var contents = folder.getFiles();
  var folders = folder.getFolders();
  var ver = 1;

  while (folders.hasNext()) {
    var subFolder = folders.next();
    var subFolderID = subFolder.getId();
    var nextSubFolder = DriveApp.getFolderById(subFolderID);
    var subFiles = subFolder.getFiles();
    var subFolders = subFolder.getFolders();

    while (subFiles.hasNext()) {
      var file = subFiles.next();
      var curID = file.getId();
      var curName = file.getName();
      var fileToRename = DriveApp.getFileById(curID);

      var newName = pre + " " + curName + " Version " + ver;

      fileToRename.setName(newName);
    }
  }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

  • 您要重命名特定文件夹下的所有文件。
    • 您要将文件从原始名称重命名为pre + " " + curName + " Version " + ver
    • prever的值是恒定的。
  • 特定文件夹下有多种文件夹结构。

如果我的理解是正确的,那么该修改如何?我认为您的情况有几个答案。因此,请将此视为其中之一。

修改点:

  • 脚本中有几个脚本中未使用的变量。
  • 在脚本中,仅检索第一级的文件。
    • 例如,在检索文件夹时,需要递归检索检索到的文件夹中的文件夹。

修改后的脚本:

function renameFile() {
  // Added
  var renameFiles = function(id) {
    var files = DriveApp.getFolderById(id).getFiles();
    while (files.hasNext()) {
      var file = files.next();
      var curID = file.getId();
      var curName = file.getName();
      var newName = pre + " " + curName + " Version " + ver;
      file.setName(newName);
    }
    var ids = [];
    var folders = DriveApp.getFolderById(id).getFolders();
    while (folders.hasNext()) {
      ids.push(folders.next().getId());
    }
    if (ids.length > 0) ids.forEach(function(id) {renameFiles(id)});
  }

  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Main");
  var filePaths = sourceSheet.getRange(4, 1).getValue(); // Modified
  var pre = sourceSheet.getRange("C4").getValue(); 
  var ver = 1;
  renameFiles(filePaths); // Added
}

注意:

  • 我建议您在运行此脚本之前,先使用示例文件夹和文件对其进行测试。
  • 该脚本假设如下。
    • filePaths是文件夹ID。即,文件夹ID放在单元格“ A4”中。
  • 如果文件夹中有很多文件,则可能超过the limitation of script runtime (6 min / execution)
    • 当时,请尝试以下方法。
      1. 划分文件夹并为每个文件夹运行脚本。
      2. 首先,将检索所有文件。下一步,它使用Batching Requests重命名所有文件名。因为“批处理请求”通过异步处理起作用,所以可以降低处理成本。我认为上述修改过的脚本和this answer会对此有所帮助。

参考:

如果我误解了你的情况,请告诉我。我想修改它。