有没有办法将操作按钮从一个 Google 工作表文件复制到另一个工作表文件?

Is there a way to duplicate an action button from one Google sheets file to another?

TL;DR:我正在寻找一种使用现有 google 脚本向云端硬盘文件夹中所有未来添加的文件添加操作按钮的方法。

大家好,
我有一个 Google-apps 脚本,用于检查 Google Drive 文件夹中文件数的变化,并在发生变化时将某个脚本应用于它(所有脚本都在同一个项目中,所有文件格式相同)。
我决定要在其中一张工作表中添加一个操作按钮,以根据用户的请求应用特定的过滤器。

我正在寻找一种方法将此操作按钮添加到所有未来添加的文件中。 我想到了下一个可能的实现:

  1. 使用脚本创建绘图 - 我找不到生成新绘图的方法。
  2. 使特定范围可点击 - 也找不到这样做的方法
  3. 向文件的工具栏添加菜单 - 我抛出一个异常,无法从当前上下文中调用 SpreadsheetApp.newMenu()

是否有人实现了类似的东西并且可以提供帮助?
谢谢!

至于菜单,你可以试试这个:

function onOpen() { //[OPTIONAL] Created a custom menu "Timestamp" on your Spreadsheet, where you can run the script
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('Whatever you want it to be called') //keep the ''
      .addItem('Function Description', 'function call') //for the function, don't use ()
      .addSubMenu(ui.createMenu('submenu name') //only if needed
        .addItem('Function Description','function call')
        .addSeparator() //aestethics only
        .addItem('Function Description','function call')
    .addToUi();
}

即时工具栏

这里有几个函数可以让您构建一个边栏,让您可以即时访问各种 html 控件,包括可以通过 google.script.run 调用任何服务器端函数的按钮。

第一个函数启动边栏,它提供对各种工具的即时访问,这些工具可以使用 html 创建。

function launchSideBarButtons() {
  const ss = SpreadsheetApp.getActive();
  let html = '<html><head><style>input {margin: 2px 5px 1px 0;}</style></head><body>';
  html += '<input type="text" id="txt1" placeholder="Enter Folder Id" value="folderid" />';//Change the folderid to the default folder that you wish to check on enter a new folder id at the time just prior to execution
  html += '<br><input type= "text" id="txt2" placeholder="Display Number Files" readonly />';
  html += '<br><input type="button" value="Check Folder" onClick="checkFolder();" />';
  html += '<script>';
  html += 'function checkFolder() { let id=document.getElementById("txt1").value;google.script.run.withSuccessHandler(function(l){document.getElementById("txt2").value=l;}).checkMyFolder(id);}';
  html += 'console.log("My Code")';
  html += '</script></body></html>';
  SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle("Instant Tool Bar"));
}

该函数是服务器端函数,实际打开文件夹并统计文件数。

function checkMyFolder(id) {
  const folder = DriveApp.getFolderById(id);
  if (folder) {
    const files = folder.getFiles();
    let n = 0;
    while (files.hasNext()) {
      let file = files.next();
      n++;
    }
    return n;
  } else {SpreadsheetApp.getUi().alert("Check folder id")}
}

此函数创建一个可安装的 onMyNewOpen() 触发器,它会在电子表格打开时启动侧边栏,这样您就不必为了单击按钮而必须浏览菜单。它的设置是无论你运行多少次它都只会创建一个触发器。

function onMyNewOpen() {
  if (ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == "launchSideBarButtons").length == 0) {
    ScriptApp.newTrigger("launchSideBarButtons").forSpreadsheet(SpreadsheetApp.getActive()).onOpen().create();
  }
}

对话: