Как избежать создания нового файла путем подсчета количества файлов в папке

У меня есть программное обеспечение на моем компьютере, где, когда я запускаю отчеты с него, автоматически выдает папку с 4 файлами CSV. Каждый раз, когда я запускаю отчет, я получаю новую папку с 4 новыми файлами. Эти папки и файлы автоматически синхронизируются с одной из моих папок в GDrive. У меня есть следующий сценарий, настроенный для того, чтобы взять 4 таблицы и объединить их в 1 новый лист в той же папке после загрузки файла. Я планирую настроить сценарий для запуска по событию, основанному на времени, он выполняет итерацию по всем своим подпапкам и объединяет файлы в 1 файл.

Я пытаюсь выяснить, как убедиться, что файл уже был создан для этой папки, что он пропускает эту папку. У меня есть следующий код, но он не работает, и несколько файлов все еще создаются. Моя первоначальная мысль заключалась в том, чтобы подсчитать базовое количество файлов, которые у меня есть в папке, и если оно больше этого числа, скрипт не должен запускаться. Я считаю, что в моем коде оператора if есть ошибка.

/* Head Master Info >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */

/* Top Level Google Drive Folder ID (not absolute root, just the top of the directory 
you want to work from)*/
var TopDriveFolderID = "0B2rN5b8fW77ldXZXOXFLZGlSamc";
var BaseNumberOfFilesInFolder = 5;

/* End Head Master Info >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/

/* Body >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/

/* Functions to iterate through all sub folders */
function listFolders() {
  var parentFolder = DriveApp.getFolderById(TopDriveFolderID);
  var childFolders = parentFolder.getFolders();
  var cnt = 0;

  while(childFolders.hasNext()) {

    var child = childFolders.next();
    //    Logger.log(child.getName() + " |Drive_ID: " + child.getId());
    var newSpreadSheetChildId = child.getId();
    // **the newSpreadSheetChildId Variable is also the folder ID,
    //    hence they are used interchangeably **

    /* SpreadSheet Combiner >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>*/    

    /* Name of combined Spreadsheet*/
    var newSpreadSheetName = DriveApp.getFolderById(newSpreadSheetChildId).getName();

    /* Name of Folder to be looked up*/
    // var masterFolder = "reports";

    /* Retrieve the desired folder */
    //var myFolder = DriveApp.getFoldersByName(masterFolder).next();
    var myFolder = DriveApp.getFolders().next();

    /* Get all spreadsheets that resided on that folder */
    var spreadSheets = myFolder
       .getFilesByType("application/vnd.google-apps.spreadsheet");
    var spreadSheetName = myFolder.getName();
    //    Logger.log(spreadSheetName);

    /* Create the new spreadsheet that you store other sheets */  
    var newSpreadSheet = SpreadsheetApp.create(newSpreadSheetName);


    /* Iterate over the spreadsheets over the folder */
    while(spreadSheets.hasNext()) {

      cnt++;
      Logger.log(cnt + "early");

      var sheet = spreadSheets.next();

      /* Open the spreadsheet */
      var spreadSheet = SpreadsheetApp.openById(sheet.getId());

      if (cnt > BaseNumberOfFilesInFolder) {

        /* Get all its sheets */
        for(var y in spreadSheet.getSheets()) {
          Logger.log(cnt + "late");
          /* Copy the sheet to the new merged Spread Sheet */
          spreadSheet.getSheets()[y].copyTo(newSpreadSheet);

          /* In order to move the file to the folder we want, and because 
          google considers the SpreadSheet a Google Spreadsheet
          instead of a file, we have to convert the SpreadSheet to a file in
          order to move it. Thats what the next 2 lines of code do.*/
          var getNewSSid = newSpreadSheet.getId();
          var SStoGFile = DriveApp.getFileById(getNewSSid);
          /* Actually moving the file*/
          DriveApp.getFolderById(newSpreadSheetChildId).addFile(SStoGFile);
          /* Deleting the duplicate file that's created in the process*/
          var rootFolder = DriveApp.getRootFolder();
          DriveApp.getRootFolder().removeFile(SStoGFile)

        }
      }  else {
        continue;
      }

      /* End SpreadSheet Combiner >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>*/       


      getSubFolders(child); 

    }

  }

  function getSubFolders(parent) {
    parent = parent.getId();
    var childFolder = DriveApp.getFolderById(parent).getFolders();
    while(childFolder.hasNext()) {
      var child = childFolder.next();
      Logger.log(child.getName());
      getSubFolders(child);
    }
    return;
  }
  /* End iterate through Sub Folders */

}  

person Zac Henson    schedule 15.10.2016    source источник
comment
Я вставил несколько разрывных строк, чтобы избежать горизонтальной полосы прокрутки для удобства чтения. Также удален фрагмент Javascript / HTML / CSS, поскольку скрипт Google Apps здесь не работает.   -  person Rubén    schedule 15.10.2016


Ответы (2)


Я думаю, что вы правы относительно оператора if. Попробуйте изменить:

if (cnt > BaseNumberOfFilesInFolder) {

to

if (cnt >= BaseNumberOfFilesInFolder) {
person Ed Nelson    schedule 15.10.2016
comment
Я попытался увеличить BaseNumberOfFilesInFolder до 5, а затем использовать оператор ›=, но безуспешно. - person Zac Henson; 17.10.2016
comment
Моя функция logger.log (), которую я использую для своей переменной cnt, ничего не регистрирует. Я думаю, что проблема в моем javascript. У кого-нибудь есть идеи? - person Zac Henson; 17.10.2016
comment
Посмотрите этот ответ от Сэнди Гуд stackoverflow.com/questions/30328636/ Я бы добавил var fname = theFolder.getName () после var files = theFolder.getFiles (); чтобы убедиться, какой файл вы подсчитываете. Если я понимаю ваш код, вы хотите объединить файлы, только если их 4 в папке. - person Ed Nelson; 17.10.2016

Вот код, который я придумал, и он выполняет то, что я упоминал выше.

/* Head Master Info >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */

/* Top Level Google Drive Folder ID */
var TopDriveFolderID = "0B2rN5b8fW77ldXZXOXFLZGlSamc";
var BaseNumberOfFilesInFolder = 4;

/* End Head Master Info >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/

/* Body >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/

/* Functions to iterate through all sub folders */
function listFolders() {
  var parentFolder = DriveApp.getFolderById(TopDriveFolderID);
  var childFolders = parentFolder.getFolders();
  while(childFolders.hasNext()) {
    var child = childFolders.next();
    //    Logger.log(child.getName() + " |Drive_ID: " + child.getId());
    var newSpreadSheetChildId = child.getId();
    // **the newSpreadSheetChildId Variable is also the folder ID,
    //    hence they are used interchangeably **
    
    /* SpreadSheet Combiner >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/    
    
    /* Name of combined Spreadsheet*/
    var newSpreadSheetName = DriveApp.getFolderById(newSpreadSheetChildId).getName();
    
    /* Name of Folder to be looked up*/
    // var masterFolder = "reports";
    
    /* Retrieve the desired folder */
    //var myFolder = DriveApp.getFoldersByName(masterFolder).next();
    var myFolder = DriveApp.getFolders().next();
    
    /* Get all spreadsheets that resided on that folder */
    var spreadSheets = myFolder.getFilesByType("application/vnd.google-apps.spreadsheet");
    var spreadSheetName = myFolder.getName();
    //    Logger.log(spreadSheetName);
    
    /* Create the new spreadsheet that you store other sheets */  
    var newSpreadSheet = SpreadsheetApp.create(newSpreadSheetName);
    
    /* Check if a file needs to be created or if one already exists*/  
    var theFolder = DriveApp.getFolderById(newSpreadSheetChildId);
    var files = theFolder.getFiles();
    var fname = theFolder.getName();
    
    var cnt = 0;
    var file;
    
    /* Check the quantity of files in a folder to see if you need to combine the sheets and create a file*/  
    while (files.hasNext()) {
      cnt++;
      file = files.next();
      //Logger.log(file.getName());
      if (cnt > BaseNumberOfFilesInFolder) {
        Logger.log("File already exists")
        break;
      } 
      ;
    };
    
    // If a file needs to be created this checks it and creates it
    Logger.log(cnt);
    if (cnt > BaseNumberOfFilesInFolder){
      Logger.log("No file needs to be created")
    }else{
      /* Iterate over the spreadsheets over the folder */
      while(spreadSheets.hasNext()) {
        
        var sheet = spreadSheets.next();
        
        /* Open the spreadsheet */
        var spreadSheet = SpreadsheetApp.openById(sheet.getId());
        
        
        /* Get all its sheets */
        for(var y in spreadSheet.getSheets()) {
          
          /* Copy the sheet to the new merged Spread Sheet */
          spreadSheet.getSheets()[y].copyTo(newSpreadSheet);
          
          
          /* In order to move the file to the folder we want and because 
          google considers the SpreadSheet a Google Spreadsheet
          instead of a file, we have to convert the SpreadSheet to a file in
          order to move it.Thats what the next 2 lines of code do.*/
          var getNewSSid = newSpreadSheet.getId();
          var SStoGFile = DriveApp.getFileById(getNewSSid);
          /* Actually moving the file*/
          DriveApp.getFolderById(newSpreadSheetChildId).addFile(SStoGFile);
          /* Deleting the duplicate file that was created in the process*/
          var rootFolder = DriveApp.getRootFolder();
          DriveApp.getRootFolder().removeFile(SStoGFile);
          
        }
      }  
      Logger.log("New File was created with the name - " + newSpreadSheetName)
    }
  };
  
  
  /* End SpreadSheet Combiner >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/       
  
  
  getSubFolders(child); 
  
}


function getSubFolders(parent) {
  parent = parent.getId();
  var childFolder = DriveApp.getFolderById(parent).getFolders();
  while(childFolder.hasNext()) {
    var child = childFolder.next();
    Logger.log(child.getName());
    getSubFolders(child);
  }
  return;
}
/* End iterate through Sub Folders */

person Zac Henson    schedule 17.10.2016