Search code examples
google-apps-scriptgoogle-workspace

Batch move gDoc files but they convert to PDF? Why don't they retain mimeType?


Following code is to move native gDocs from one folder on a drive into another which has subfolders with student names. The original file has a version of the student name and ID which is rearranged by the getSubfolderName. That part works, the only issue is it returns PDF's instead of the original files.

function moveFilesToModifiedSubfolders() {
  var sourceFolderId = "source folder"; // Replace with the ID of your source folder
  var destinationFolderId = "destination folder to be modified by sub"; // Replace with the ID of your destination folder
  
  var sourceFolder = DriveApp.getFolderById(sourceFolderId);
  var destinationFolder = DriveApp.getFolderById(destinationFolderId);
  
  var files = sourceFolder.getFiles();
  
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    var subfolderName = getSubfolderName(fileName);
    
    var subfolder = destinationFolder.getFoldersByName(subfolderName);
    if (subfolder.hasNext()) {
       subfolder.next().createFile(file);

    } else {
      var newSubfolder = destinationFolder.createFolder(subfolderName);
        newSubfolder.createFile(file);

      
    }
  }
}
// used to match names to folders in another drive someone else created
function getSubfolderName(fileName) {
  var words = fileName.split(" ");
  if (words.length >= 2) {
    var modifiedName = words[1] + ", " + words[0];
    return modifiedName;
  } else {
    return fileName;
  }
}


Solution

  • Modification points:

    • About your current issue of the only issue is it returns PDF's instead of the original files., I guessed that the reason for this is due to that createFile is used for copying the file. In this case, makeCopy is required to be used.
    • But, from move native gDocs from one folder on a drive into another which has subfolders with student names., if you want to move instead of copy the files, it is required to use moveTo.

    But, unfortunately, I cannot understand your actual expected result of move native gDocs from one folder on a drive into another which has subfolders with student names.. So, in this answer, I would like to propose 2 patterns.

    Pattern 1:

    In this pattern, the files are copied. Please modify moveFilesToModifiedSubfolders as follows.

    function moveFilesToModifiedSubfolders() {
      var sourceFolderId = "source folder"; // Replace with the ID of your source folder
      var destinationFolderId = "destination folder to be modified by sub"; // Replace with the ID of your destination folder
      var sourceFolder = DriveApp.getFolderById(sourceFolderId);
      var destinationFolder = DriveApp.getFolderById(destinationFolderId);
      var files = sourceFolder.getFiles();
      while (files.hasNext()) {
        var file = files.next();
        var fileName = file.getName();
        var subfolderName = getSubfolderName(fileName);
        var subfolder = destinationFolder.getFoldersByName(subfolderName);
        if (subfolder.hasNext()) {
          //  subfolder.next().createFile(file);
          file.makeCopy(fileName, subfolder.next());
        } else {
          var newSubfolder = destinationFolder.createFolder(subfolderName);
          // newSubfolder.createFile(file);
          file.makeCopy(fileName, newSubfolder);
        }
      }
    }
    

    Pattern 2:

    In this pattern, the files are moved. Please modify moveFilesToModifiedSubfolders as follows.

    function moveFilesToModifiedSubfolders() {
      var sourceFolderId = "source folder"; // Replace with the ID of your source folder
      var destinationFolderId = "destination folder to be modified by sub"; // Replace with the ID of your destination folder
      var sourceFolder = DriveApp.getFolderById(sourceFolderId);
      var destinationFolder = DriveApp.getFolderById(destinationFolderId);
      var files = sourceFolder.getFiles();
      while (files.hasNext()) {
        var file = files.next();
        var fileName = file.getName();
        var subfolderName = getSubfolderName(fileName);
        var subfolder = destinationFolder.getFoldersByName(subfolderName);
        if (subfolder.hasNext()) {
          //  subfolder.next().createFile(file);
          file.moveTo(subfolder.next());
        } else {
          var newSubfolder = destinationFolder.createFolder(subfolderName);
          // newSubfolder.createFile(file);
          file.moveTo(newSubfolder);
        }
      }
    }
    

    References: