How do I locate the path of the folder in which the current script file is located?

后端 未结 5 857
小鲜肉
小鲜肉 2020-12-21 09:46

How do I locate the path of the current folder? I just want to be able to get the path of the folder so that I can manipulate the files in the folder without typing the path

相关标签:
5条回答
  • 2020-12-21 10:20

    Thanks to Corey's answer and to Thomas'one, here is a "full featured" version that shows the folder tree in the logger and every parents id as well... just for fun ;-)

    function getScriptFolderTree() {
      var thisScript = getThisScriptInDrive();
      var names = []
      var Ids = []
      var folder = thisScript.getParents()[0];
      while (folder.getName() != "Root"){
          names.unshift(folder.getName());
          Ids.unshift(folder.getId());
        var parents = folder.getParents();
           var folder = parents[0];
      }
    Logger.log('Root/'+names.join().replace(/,/g,'/'))  
    Ids.unshift(DriveApp.getRootFolder().getId())
    Logger.log(Ids)  
    }
    
    
    function getThisScriptInDrive() {
      return DriveApp.getFileById("poiuytrezazertyujhgfdsdcvcxyydryfhchfh");
    }
    

    enter image description here

    (ID's are truncated intentionally)

    Note that this script is working nicely but it strangely stops working if the 'random string' is modified... I imagine that the search engine in drive doesn't like the change but I have no serious explanation (comments welcome) but after a few minutes it works again ;-)

    0 讨论(0)
  • 2020-12-21 10:21

    I was able to get the folder containing the script that was running:

    //
    // PrintScriptFolder -- print the name of the folder in which the running script resides.
    //
    function PrintScriptFolder()
    {
      var scriptId = ScriptApp.getScriptId();
      console.info('scriptId = ' + scriptId);
      
      var file = DriveApp.getFileById(scriptId);
      var folders = file.getParents();
      if (folders.hasNext())
      {
        var folder = folders.next();
        var name = folder.getName();
        console.info('script folder name = ' + name);    
      }  
    }
    

    The trick is using ScriptApp to get the ID of the running script. From there it's pretty straightforward: use DriveApp to get the file ID, getParents() to get a list of (one) parent folder, next() to get it, and getName() to get its name.

    0 讨论(0)
  • 2020-12-21 10:29

    For a Spreadsheet I found this to work:

    thisFileId = SpreadsheetApp.getActive().getId();
    var thisFile = DriveApp.getFileById(thisFileId);
    var parentFolder = thisFile.getParents()[0].getName();
    
    0 讨论(0)
  • 2020-12-21 10:32

    You could do this:

    function myFunction() {
      var thisScript = getThisScriptInDrive();
      var folder = thisScript.getParents()[0];
      while (folder.getName() != "Root"){
        var parents = folder.getParents();
        for (var i in parents){
          var folder = parents[i];
          Logger.log(folder.getName());
        }
      }
    }
    
    
    function getThisScriptInDrive() {
      return DocsList.find("`<jj!?=(<DW+.W/m7SBF:sgu/@B(&Cs3:{ajA~ys@KmN4&]ujhpZ~z[Tv?+dk}MpK,8pY=w&dny8N'74:.9H:~uCgY=7pRt4[Tn5")[0];
    }
    

    This only works good if the folder has only 1 parent because it only takes 1 path.

    edit: Thanks to Corey G

    0 讨论(0)
  • 2020-12-21 10:37

    Add a function like this to your script

    function getThisScriptInDrive() {
      return DriveApp.find("some unique string that wont be anywhere else")[0];
    }
    

    This will search Drive and find this script itself because it contains that string - right there in the function call! - no need to declare it anywhere else. As long as you use an obscure enough string - i'd recommend mashing a few hundred chars on your keyboard - it will be unique across drive and therefore just work.

    Once you have a File for this script, you can call getParents() etc.

    0 讨论(0)
提交回复
热议问题