如何在工作表重命名时更新 Google Sheet 加载项侧边栏下拉列表?

How to update Google Sheet Add-on sidebar dropdown list when sheets are renamed?

我正在创建一个 Google Sheet 插件来比较电子表格中的 2 列。用户可以从侧边栏的下拉列表中选择 2 列所在的工作表。打开侧边栏时,使用侧边栏中的以下代码填充下拉列表 html:

  <select id="sheet1">
    <? var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets(); ?>
    <? for(var i=0;i<sheets.length;i++) { ?>
    <option><?= sheets[i].getName()?></option>
    <? } ?>  
    };
  </select>

但是,如果用户在边栏打开时重命名任何 google 工作表,则列表不会更新。我不确定更新下拉列表的最佳方式是什么。我对在下拉列表旁边放置一个 'Update sheet names' 按钮的想法持开放态度,如果这比必须监视电子表格的每个更改以使其动态发生更好的话。我今天尝试了很多可能的解决方案但都没有成功!非常感谢收到所有建议。

答案:

虽然使用 onChange() 触发器可以重新加载边栏,但没有直接的方法可以做到这一点。

更多信息:

根据文档:

An installable change trigger runs when a user modifies the structure of a spreadsheet itself—for example, by adding a new sheet or removing a column.

重命名 sheet 时,事件对象中 OTHERchangeType 会触发 onChange() 事件。当 onChange() 检测到这种情况时,您可以将边栏设置为重新加载。

代码:

function onChange(e) {
  if (e.changeType == "OTHER") {
    showSidebar();
  }  
}

function showSidebar() {
  var html = HtmlService.createTemplateFromFile('Page').evaluate()
      .setTitle('Sidebar title')
      .setWidth(300);
  SpreadsheetApp.getUi().showSidebar(html);
}

设置可安装触发器:

在编辑 > 当前项目的触发器菜单项之后,您将在 G Suite 开发人员中心打开一个新页面。点击右下方的+ Add Trigger按钮,设置触发设置如下:

  • 选择要运行的函数:onChange
  • 选择应 运行 的部署:Head
  • Select 事件来源:From spreadsheet
  • Select 事件类型:On change

然后按保存。

注意: 对 Spreadsheet 结构的任何更改, 除了以下列表,也会触发侧边栏重新加载:

  • EDIT: 范围的内容被改变
  • INSERT_ROW - 一行插入到 sheet
  • INSERT_COLUMN - 将一列插入 sheet
  • REMOVE_ROW - 从 sheet 中删除一行(与清除不同)
  • REMOVE_COLUMN - 从 sheet
  • 中删除一列
  • INSERT_GRID - 新的 sheet 添加到 Spreadsheet
  • REMOVE_GRID - 新的 sheet 从 Spreadsheet
  • 中删除
  • FORMAT - 编辑范围的格式(显示格式、背景颜色、字体等)

参考文献: