【问题标题】:How to avoid creating a new file by counting the number of files in a folder如何通过计算文件夹中的文件数来避免创建新文件
【发布时间】:2016-10-15 06:39:00
【问题描述】:

我的计算机上有一个软件,当我从中运行报告时,它会自动输出一个包含 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 */

}  

【问题讨论】:

  • 为了便于阅读,我插入了几条断线以避免水平滚动条。还删除了由于 Google Apps 脚本不在此处运行而被截断的 Javascript/HTML/CSS。

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


【解决方案1】:

我认为你对 if 语句是正确的。尝试改变:

if (cnt > BaseNumberOfFilesInFolder) {

if (cnt >= BaseNumberOfFilesInFolder) {

【讨论】:

  • 我尝试将“BaseNumberOfFilesInFolder”增加到 5,然后使用 >= 运算符,但没有成功。
  • 我在我的 cnt 变量上运行的 logger.log() 函数没有记录任何内容。我认为我的 javascript 有问题。有人有什么想法吗?
  • 查看 Sandy Good stackoverflow.com/questions/30328636/… 的答案我会在 var files = theFolder.getFiles(); 之后添加 var fname=theFolder.getName()以确保您正在计算什么文件。如果我理解您的代码,您只想在文件夹中有 4 个文件时合并这些文件。
【解决方案2】:

这是我想出的代码,我上面提到的。

/* 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 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2012-05-09
    • 2016-02-25
    • 2021-11-15
    相关资源
    最近更新 更多