【问题标题】:How to create a folder if it doesn't exist?如果文件夹不存在如何创建?
【发布时间】:2014-11-24 23:05:34
【问题描述】:

如果文件夹不存在,我会尝试创建它,但代码每次运行时都会创建一个新文件夹。我不知道我的代码是否正确。

这是我的代码:

var alumnopath = DocsList.getFolderById ('0Bzgw8SlR34pUbFl5a2tzU2F0SUk');
var alumno2 = alumno.toString();
Logger.log(alumno2);
try {
  var folderalumno =  alumnopath.getFolder(alumno2);
  if (folderalumno == undefined){
    var folderalumno =  alumnopath.createFolder(alumno2);
  }
  else {
    var folderalumno =  alumnopath.getFolder(alumno2);
  }
}
catch(e) {
  var folderalumno =  alumnopath.createFolder(alumno2);
}
folderalumno.createFile(pdf.getAs('application/pdf')).rename(  alumno +  " , " + fechafor);

感谢您的帮助!!

【问题讨论】:

  • DocsList 已弃用。

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


【解决方案1】:

截至 2016 年 8 月的 Google Apps 脚本代码

var par_fdr = DriveApp.getFolderById(123456789A); // replace the ID
var fdr_name = "child_fdr";

try {
  var newFdr = par_fdr.getFoldersByName(fdr_name).next();
}
catch(e) {
  var newFdr = par_fdr.createFolder(fdr_name);
}

【讨论】:

  • 我也是这样做的,但是我发现 getFoldersByName(fdr_name).next() 在没有匹配项时没有返回错误。我最终在 try: 部分添加了“var name=newFdr.getName()”以强制失败。这似乎解决了我的问题,但我仍然不太确定为什么需要它。
  • 谢谢!我用谷歌搜索了一段时间才终于找到这个答案,现在我的脚本可以工作了。
【解决方案2】:

当您使用 try/catch 结构时,您实际上不需要 if 条件。 try/catch 结构处理文件夹本身不存在的情况。

试试这样:

var alumnopath = DocsList.getFolderById ('0Bzgw8SlR34pUbFl5a2tzU2F0SUk');
var alumno2 = alumno.toString();
Logger.log(alumno2);
try{
  var folderalumno =  alumnopath.getFolder(alumno2);
}
catch(e) {
  var folderalumno =  alumnopath.createFolder(alumno2);
}
folderalumno.createFile(pdf.getAs('application/pdf')).rename(  alumno +  " , " + fechafor);

【讨论】:

  • 在 2020 年将这个答案与 V8 引擎一起使用,请注意将 'var folderalumno' 替换为 'let' 或 'const' 会产生关闭问题...在 'try' 之前声明 folderalumno 并分配try-catch 中的值。
【解决方案3】:

如果其他人遇到此问题,您可以像这样使用三元运算符(根据需要替换“Name_of_Folder”字符串):

var alumnopath = DriveApp.getFoldersByName("Name_of_Folder");
var folderalumno = alumnopath.hasNext() ? 
    alumnopath.next() : DriveApp.createFolder("Name_of_Folder");

【讨论】:

    【解决方案4】:

    Google 已更改其脚本。我知道这是一篇旧帖子,但这是我能想到的当前最佳答案:

    function getFolder(parent_folder,folder_name){
      var folders = parent_folder.getFolders();     
      while (folders.hasNext()) {
        var folder = folders.next();
        if(folder_name == folder.getName()) {         
          return folder;
        }
      }
      return false;
    }
    
    var parent_folder = DriveApp.getFolderById(//id\\);
    var folderName = getFolders(parent_folder,name);
    if (folderName === false){
      folderName =  outputfolderId.createFolder(name);
    }
    

    希望这对其他人有帮助!

    【讨论】:

      【解决方案5】:

      如果有人仍在寻找这个问题的答案并且想要创建文件夹(如果它不存在)这里是我创建的函数。

      这个函数接受两个输入值:

      • base_folder - 在其中执行搜索的文件夹 ID 或 false 以搜索驱动器根文件夹中的文件夹
      • folder_name - 您正在搜索的文件夹名称

      有些东西是可以调整的,但是我已经用这个来创建文件夹结构基本文件夹->年->月->日。

      function checkFolders(base_folder, folder_name) {
        if (base_folder){ //Checks if is specified main folder
          var folders = DriveApp.getFolderById(base_folder).getFolders(); //Getting folder list from specified location
        } else { //If not specified folder we take all Drive folders
         var folders = DriveApp.getFolders(); //Getting all folders in Drive
        }
      
        var folder_exist = false, folder; //By default folder don`t exists till we check and confirm that it exists
      
        while(folders.hasNext()){ //Looping through all folders in specified location while we have folders which to check
          folder = folders.next(); //Taking next folder to check if it is folder that we are looking for
          if(folder.getName() == folder_name){ //Checking it`s name
           folder_exist = folder.getId(); //If folder is found we assign its ID to our return variable
          } //If folder don`t exists we have already assigned false to return value
        }
      
        if (!folder_exist) { //Checks if folder don`t exists than we need to create it
          if(base_folder){ //Checking where we should create folder
            DriveApp.getFolderById(base_folder).createFolder(folder_name); //If base folder is specified than we create there folder
          } else {
            DriveApp.createFolder(folder_name); //If base folder not specified than we create folder in Drive root folder
          }
         folder_exist = checkFolders(base_folder, folder_name); //Now run self again to check if folder was created and if it is created than we get folder ID
        }
      
        return folder_exist; //Returning false if our folder is not created or folder ID if folder exists and is created
      }
      

      这就是我使用这个功能的方式:

      function createFolderStructure() {
       var base_folder_id, year_folder_id, month_folder_id, day_folder_id, date, day, month, year;
      
       date = new Date(); //Creates new Date object
       day = date.getDate(); //Extract day number in month
       month = date.getMonth(); //Extract month number, first month number is 0
       year = date.getFullYear(); //Extract year number
      
       base_folder_id = checkFolders(false, "My base folder"); //Check if base folder is created, if created return folder ID, if not, than create it and return it ID
       year_folder_id = checkFolders(base_folder_id, year); //Check if year folder is created, if created return folder ID, if not, than create it and return it ID
       month_folder_id = checkFolders(year_folder_id, month); //Check if month folder is created, if created return folder ID, if not, than create it and return it ID
       day_folder_id = checkFolders(month_folder_id, day); //Check if day folder is created, if created return folder ID, if not, than create it and return it ID, ID can be used to save files in this folder
      }
      

      【讨论】:

      • 尝试了此代码并按预期工作,但问题是它需要 4 倍的时间,而且驱动器中的文件夹越多可能需要更长的时间。不确定是否有人可以解决这个问题:/
      • 抱歉,但在我的情况下,它将每天创建最多 24 个文件夹,而不是同时创建。我不确定这是否与您驱动器中的文件夹数量有关。我看到这可以改进。也许 DriveApp.getFolders() 需要很多时间。我会进行一个函数调用,并给出一个日期对象或数组,其中包含日、月、年,并且只获取一次文件夹。我认为它会加快,不知道它会快多少。如果您仍然需要这方面的帮助,明天我可以尝试更新此功能,您可以检查它是否运行得更快。
      猜你喜欢
      • 2018-09-05
      • 2011-03-13
      • 1970-01-01
      • 2011-06-21
      • 2011-01-19
      • 2016-06-26
      • 2017-06-28
      • 2013-11-05
      相关资源
      最近更新 更多