创建一个按钮来执行多个功能/运行脚本

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

我需要帮助制作一个按钮,该按钮可以输入/更新谷歌驱动器文件夹中子子文件夹的名称作为谷歌表格中的单元格。

我从 stackoverflow 借用了一个关于上述主题的脚本,它工作得很好,但我在使用按钮执行上述脚本或一系列函数时遇到了麻烦。

如上所述的脚本:

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

我需要一种方法来执行所述脚本/函数,而不必一直打开 Google Web Apps 菜单。

javascript google-apps-script google-sheets button 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.