繁体   English   中英

列出 Google 应用脚本项目

[英]List Google app script projects

我正在尝试使用 此处记录的 Google Drive File API 列出我所有的 google 脚本文件。 但是我总是得到一个空的 [] 列表。 我认为我的令牌和范围很好,因为我从 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'

即使我刚刚在 Google Sheet 中创建了一个 google 脚本,我也只会返回一个空的项目列表 ([]):

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

我猜 app-script 的意思不是谷歌脚本代码,它是谷歌表的一部分......感谢任何帮助:)

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

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

  • 遗憾的是,目前还无法检索到容器绑定脚本类型的项目文件列表,而可以使用Drive API 的drive.files.list 检索独立类型的项目文件列表。

导出项目中的脚本

  • 当您想从容器绑定脚本类型和独立类型的项目中导出每个脚本时,您可以使用Google Apps Script API 来完成
    • 这可能会成为适合您情况的 GAS 示例脚本。 在这里
    • 你也可以使用这样的 GAS 库来做到这一点

一个拼凑而成的工作区,以获取独立和绑定项目 ID 的列表

我把这个贴在这里是因为我在过去几天里多次浏览这个页面,以防其他人真的想得到他们项目的完整列表并且不介意跳过几个箍得到它然后这可能对他们有用。

我找到了一种方法来获取我所有的 Apps 脚本项目文件 ID。 它不是很漂亮,但我把 1393 个都绑定了,并且是独立的。 我进入 Google Developer Hub 并注意到我的项目 ID 可以在属性名称data-script-id="project id" ,通过继续向下翻到列表底部,我能够保留该页面寻找更多的页面,直到没有剩下的页面。 然后我进入 Chrome 开发人员工具,我找到了包含所有具有上述属性的 div 的 div,对我来说,这个名为<div class="uBvHbd"并且我复制了整个 div 并尝试将它粘贴到一个 ascii 文件中我的 Google 帐户,但我发现这是一个问题,所以我打开了 UltraEdit 的副本并将其粘贴到那里。 我玩了一段时间的正则表达式,花了一天时间重新训练自己使用 UltraEdit 文档模型和它们的 Javascript 引擎版本,并开发了以下例程,使我能够构建完整的 projectid 列表。

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();

输入文件为 24 MB,输出列表为 81KB,在我的笔记本电脑上运行的脚本用了不到 5 秒的时间来去除 ID 并删除重复项(也没有找到)。

我在 Google Apps Script 中运行这两个例程以从 Google Apps Script 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 脚本库。 它确实帮助我弄清楚了如何访问 Apps Script API,结果证明它比我想象的要容易得多。

部分最终名单一览:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM