触发器或按钮将 Google Drive 中的子子文件夹名称输入 Google Sheets

问题描述 投票:0回答:1

我的目标是:

  • 要么:创建触发器自动输入/更新子文件夹的名称作为Google表格中的单元格每次gdrive文件夹中发生更改即文件夹/文件上传到gdrive文件夹
  • 或者:
  • 创建一个按钮来执行可以实现相同目标的多个功能。
目标1

是创建一个触发器,将自动执行多个函数,如下所示:

var folderId = 'folderId'; function listFolders(){ getFolderTree(folderId, false); }; function listAll(){ getFolderTree(folderId, true); }; function getFolderTree(folderId, listAll) { try { var parentFolder = DriveApp.getFolderById(folderId); var file, data, sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Resources"); sheet.clear('A1'); sheet.appendRow(["Name"]); getChildFolders(parentFolder.getName(), parentFolder, data, sheet, listAll); } catch (e) { Logger.log(e.toString()); } }; function getChildFolders(parentName, parent, data, sheet, listAll) { var childFolders = parent.getFolders(); while (childFolders.hasNext()) { var childFolder = childFolders.next(); // Logger.log("Folder Name: " + childFolder.getName()); data = [ childFolder.getName() ]; sheet.appendRow(data); var files = childFolder.getFiles(); while (listAll & files.hasNext()) { var childFile = files.next(); // Logger.log("File Name: " + childFile.getName()); data = [ parentName + "/" + childFolder.getName() + "/" + childFile.getName(), childFile.getName() ]; // Write sheet.appendRow(data); } getChildFolders(parentName + "/" + childFolder.getName(), childFolder, data, sheet, listAll); } }; function appendToColumn() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Resources"); var data = "End"; //Get the column where you want to append the data var range = sheet.getRange("A1:A").getValues().flat(); var row = range.filter(String).length; Logger.log(row); sheet.getRange(row+1,2).setValue(data); }
我的预期流程如下图所示:

Folder gets uploaded to gdrive folder Sub-subfolder preview Sub-subfolder names gets input to google sheets by trigger

但我还没有找到可安装触发器或简单触发器的全面答案。

目标2

是创建一个按钮来执行上述功能,我的期望是只使用:

function button { [script above] }
并完成它。

我之前读过

here,你可以让一个函数执行多个函数,但我使用的函数似乎有点不同,因此我不能只一起输入一串函数。

google-apps-script google-sheets button triggers google-drive-api
1个回答
0
投票
gs:

function executeFunctionByName(func) { this[func](); } function getProjectFunctionNames() { const vfilesA=getGlobal('sbfiles').split(','); const scriptId="1JO1n6EpiKlORws9J-icjffuKdGX6l-4vgYmRJtUTdg88efz7hwatg_09"; const url = "https://script.googleapis.com/v1/projects/" + scriptId + "/content?fields=files(functionSet%2Cname)"; const options = {"method":"get","headers": {"Authorization": "Bearer " + ScriptApp.getOAuthToken()}}; const res = UrlFetchApp.fetch(url, options); let html=res.getContentText(); //SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html), "Project Functions"); let data=JSON.parse(res.getContentText()); let funcList=[]; let files=data.files; files.forEach(function(Obj){ if(vfilesA.indexOf(Obj.name)!=-1) { if(Obj.functionSet.values) { Obj.functionSet.values.forEach(function(fObj){ funcList.push(fObj.name); }); } } }); //SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(funcList.join(', ')), "Project Functions"); return funcList; }
html:

<br /><input type="button" value="run1()" onClick="execFunc1();" /><select id="func1"></select> <script> $(function(){ google.script.run .withSuccessHandler(function(vA){ let idA=["func1","func2","func3","func4"]; idA.forEach(function(id){ updateSelect(vA,id); }); }) .getProjectFunctionNames(); } function updateSelect(vA,id){ var id=id || 'sel1'; var select = document.getElementById(id); select.options.length = 0; vA.unshift(""); for(var i=1;i<vA.length;i++){ select.options[i] = new Option(vA[i],vA[i]); } } function execFunc1() { var funcname=$('#func1').val(); google.script.run.executeFunctionByName(funcname); } </script>
演示:

© www.soinside.com 2019 - 2024. All rights reserved.