代码之家  ›  专栏  ›  技术社区  ›  A. Masson

列出谷歌应用程序脚本项目

  •  1
  • A. Masson  · 技术社区  · 8 年前

    here . 但是我总是得到一个空的[]名单。我想我的令牌和范围都很好,因为我从Google OAuth2取回这个:

    { "access_token": "xxxxx", "expires_in": 3600, "refresh_token": "yyyyy",
    "scope": "https://www.googleapis.com/auth/drive.scripts https://www.googleapis.com/auth/drive.appdata https://www.googleapis.com/auth/drive",
    "token_type": "Bearer"
    }
    

    但当我使用mimeType筛选发出查询时(我只想得到google应用程序脚本列表):

    mimeType = 'application/vnd.google-apps.script'
    

    我只得到一个空的项目列表([]),即使我刚刚在谷歌工作表中创建了一个谷歌脚本:

    { "kind": "drive#fileList", "etag": "....", "selfLink": "https://www.googleapis.com/drive/v2/files?q=mimeType+%3D+'application/vnd.google-apps.script'", "incompleteSearch": false, "items": []}
    

    我猜app脚本的意思不是google脚本代码,而是google工作表的一部分。。。感谢任何帮助:)

    1 回复  |  直到 8 年前
        1
  •  3
  •   Tanaike    8 年前

    关于检索容器绑定脚本类型的项目的文件列表并从项目中导出每个脚本,请检查以下答案。

    检索容器绑定脚本类型的项目的文件列表

    导出项目中的脚本

        2
  •  3
  •   Cooper    6 年前

    一个拼凑的工作周围,以获得一个独立的和绑定的项目ID列表

    我把这个贴在这里是因为在过去的几天里我浏览了这个页面好几次,如果有其他人真的想得到他们项目的完整列表,并且不介意为了得到它而跳过几个圈套,那么这可能对他们很有用。

    我找到了一种方法来获取我所有的应用程序脚本项目文件ID。虽然不漂亮,但我把1393个都绑定起来了。我进入googledeveloperhub,发现我的项目id可以在属性名中找到 data-script-id="project id" <div class="uBvHbd"

    UltraEdits脚本语言:

    function getDocumentPaths() {
      UltraEdit.outputWindow.write('File Paths:');
      for(var i=0;i<UltraEdit.document.length;i++) {
        UltraEdit.outputWindow.write('[' + i + ']: ' + UltraEdit.document[i].path);
      }
    }
    
    function getFileNames() {
      var nA=[];
      var fnToIdx={fnA:[]};
      for(var i=0;i<UltraEdit.document.length;i++) {
        var p=UltraEdit.document[i].path;
        var pA=p.split(/\\/);
        var fn=pA[pA.length-1].split('.')[0];
         fnToIdx.fnA.push(fn);
         fnToIdx[fn]=i;
      }
       UltraEdit.outputWindow.write('FileNames: \r\n' + fnToIdx.fnA.join('\r\n'));
       return fnToIdx;
    }
    
    function getScriptIdsIndex() {
      for(var i=0;i<UltraEdit.document.length;i++) {
        if(UltraEdit.document[i].isName('ScriptIds')) {
          return i;
        }
      }
    }
    
    function getFileIndexByName(name) {
      var name=name||'ScriptIds';
      if(name) {
        for(var i=0;i<UltraEdit.document.length;i++) {
          if(UltraEdit.document[i].isName(name)) {
            return i;
          }
        }
      }else{
        UltraEdit.messageBox("Invalid or Missing Inputs at getFileIndexByName().","Alert")
      }
    }
    
    function getAllFileIndices(obj) {
      UltraEdit.outputWindow.write('File Indices:');
      var fnIndicesA=[]
      for(var j=0;j<obj.fnA.length;j++) {
        fnIndicesA.push({name:obj.fnA[j] , index:obj[obj.fnA[j]]})
      }
      var_dump(fnIndicesA);
    }
    
    function updateWorkingTabs(index) {
      UltraEdit.outputWindow.write('Index: ' + index);
      UltraEdit.document[index].selectAll();
      UltraEdit.document[index].copy();
      var workingTabsA=[];
      for(var i=0;i<UltraEdit.document.length;i++) {
        if(UltraEdit.document[i].path.slice(0,-1)=='Edit') {
          UltraEdit.document[i].paste();
          workingTabsA.push(i);
        }
      }
      return workingTabsA;
    }
    
    function findAllIds() {
      var fnToIndex=getFileNames();
      UltraEdit.document[fnToIndex['ScriptIds']].selectAll();
      UltraEdit.document[fnToIndex['ScriptIds']].copy();
      var s=UltraEdit.clipboardContent;
      var re=/data-script-id="[^"]+"/g;
      var matchA=s.match(re);
      UltraEdit.document[fnToIndex['FileIds']].selectAll();
      UltraEdit.document[fnToIndex['FileIds']].cut();
      for(var i=0;i<matchA.length;i++) {
        UltraEdit.document[fnToIndex['FileIds']].write(matchA[i].slice(16,-1)  + '\r\n');
      }
    }
    
    function removeDuplicates() {
      var fnToIndex=getFileNames();
      UltraEdit.document[fnToIndex['FileIds']].selectAll();
      UltraEdit.document[fnToIndex['FileIds']].copy();
      var fnA=UltraEdit.clipboardContent.split('\r\n');
      if(!fnA[fnA.length-1]) {
        fnA.pop();
      }
      var uA=[];
      for(var i=0;i<fnA.length;i++) {
        if(uA.indexOf(fnA[i])==-1) {
          uA.push(fnA[i]);
        }
      }
      var s='';  
      for(var i=0;i<uA.length;i++) {
        if(i>0){
          s+='\r\n';
        }
        s+=uA[i];
      }
      UltraEdit.document[fnToIndex['FileIds']].selectAll();
      UltraEdit.document[fnToIndex['FileIds']].cut();
      UltraEdit.document[fnToIndex['FileIds']].write(s);
     }
    
    UltraEdit.outputWindow.clear();
    //UltraEdit.open('E:\\Projects\\ScriptIds\\ScriptIds.txt');
    //var ScriptIds_idx=getScriptIdsIndex();
    //var wtA=updateWorkingTabs(ScriptIds_idx);
    
    //findAllIds()
    
    removeDuplicates();
    

    我在googleapps脚本中运行这两个例程,从googleapps脚本API获取脚本信息,这样我就可以知道哪些是独立的,哪些是容器绑定的。对于容器绑定,我可以得到容器的文件名和id。

    function getInfo(projectId) {
      var projectId=projectId||pid;
      var rObj={'ProjectId':projectId};
      var params = {muteHttpExceptions:true,headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()}};
      try {
        var url=Utilities.formatString('https://script.googleapis.com/v1/projects/%s',projectId);
      }
      catch(e) {
        return rObj['Error']=e;
      }
      var resp=UrlFetchApp.fetch(url,params);
      var data=JSON.parse(resp.getContentText());
      if(data.hasOwnProperty('parentId')) {
        var pFile=DriveApp.getFileById(data.parentId)
        var parentName=pFile.getName();
        var pfldrA=[];
        var pFolders=pFile.getParents();
        while(pFolders.hasNext()) {
          var folder=pFolders.next();
          pfldrA.push({id:folder.getId(),name:folder.getName()});
        }
        rObj['ProjectName']=data.title;
        rObj['ParentName']=parentName;
        rObj['ParentId']=data.parentId;
        rObj['ParentFolders']='';
        rObj['ParentFolderIds']='';
      //var html=Utilities.formatString('<br /><b>Project Name:</b>%s<br /><b>ParentName:</b> %s<br /><b>ParentId:</b> %s',data.title,parentName,data.parentId);
      //html+=Utilities.formatString('<br /><b>Parent Folders:</b>');
        for(var i=0;i<pfldrA.length;i++) {
          if(i>0) {
            rObj.ParentFolders+=', ';
            rObj.ParentFolderIds+=', ';
          }
          //html+=Utilities.formatString('<br /><b>Name:</b> %s <b>Id:</b> %s',pfldrA[i].name,pfldrA[i].id);
          rObj.ParentFolders+=pfldrA[i].name;
          rObj.ParentFolderIds+=pfldrA[i].id;
        }
      }else{
        rObj['ProjectName']=data.title;
        //var html=Utilities.formatString('<br /><b>StandAlone Project</b><br /><b>Project Name:</b>%s<br /><b>ProjectId:</b>%s',data.title,projectId);
      }
      //Logger.log(data);
      //var userInterface=HtmlService.createHtmlOutput(html);
      //SpreadsheetApp.getUi().showModelessDialog(userInterface, "Project Info");
      return rObj;
    }
    
    function updateProjects() {
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getSheetByName('Projects');
      var idx={hA:[],hr:1}
      idx.hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
      idx.hA.forEach(function(e,i){idx[e]=i;});
      var lr=sh.getLastRow();
      var sr=getColumnHeight(1,sh,ss) + 1;
      var cnt=25;
      setGlobal('count',cnt);
      if(lr-sr+1<cnt) {
        cnt=lr-sr+1;
      }
      if(sr>=lr) {
        setGlobal('count',0);
        return;
      }
      //Item    ProjectId   ProjectName ParentId    ParentName  ParentFolders   ParentFolderIds
      var rg=sh.getRange(sr,1,cnt,sh.getLastColumn());
      var vA=rg.getValues();
      for(var i=0;i<vA.length;i++) {
        if(!vA[i][idx.Item] && vA[i][idx.ProjectId]) {
          var pObj=getInfo(vA[i][idx.ProjectId]);
          if(!pObj.hasOwnProperty('Error') && pObj.hasOwnProperty('ParentId')) {
            vA[i][idx.Item]=i+sr;
            vA[i][idx.ProjectName]=pObj.ProjectName;
            vA[i][idx.ParentId]=pObj.ParentId;
            vA[i][idx.ParentName]=pObj.ParentName;
            vA[i][idx.ParentFolders]=pObj.ParentFolders;
            vA[i][idx.ParentFolderIds]=pObj.ParentFolderIds;
          }else if(!pObj.hasOwnProperty('Error') && !pObj.hasOwnProperty('ParentId')){
            vA[i][idx.Item]=i+sr;
            vA[i][idx.ProjectName]=pObj.ProjectName;
            vA[i][idx.ParentName]='Standalone Project';
          }else{
            vA[i][idxItem]=i+sr;
            vA[i][idx.ProjectName]=(pObj.hasOwnProperty('Error'))?pObj.Error:"Unknown Problem";
          }
          Utilities.sleep(1000);
        }
      }
      rg.setValues(vA);
    }
    

    稍后我会回来在代码中添加一些注释。它不漂亮,但我现在有一个清单,我所有的项目,在哪里找到它们和他们的容器的名称,如果他们有一个。我要感谢@Tanaike提供的应用程序脚本库。它真的帮助我弄清楚了如何访问Apps脚本API,结果发现它比我想象的要容易得多。

    enter image description here

    推荐文章