【问题标题】:Customizing the apps script add-ons menu for each editor为每个编辑器自定义应用程序脚本插件菜单
【发布时间】:2020-04-02 19:13:29
【问题描述】:

我有一个以前只针对 Google 文档的插件,我正在尝试扩展该功能集以包括 Google 表格。在开发模式下,我可以设置一个条件来检测哪种文档类型处于活动状态(文档或工作表),然后显示相应的菜单。当我发布最新版本的插件时,插件菜单在文档和表格中都停止工作。

我猜这与“onOpen()”周围的权限有关,但我不确定如何处理这个问题。 G Suite Marketplace 允许您指定插件支持多个编辑器。

这是在开发中工作的代码:

function onOpen(e) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var doc = DocumentApp.getActiveDocument();

  if(ss != null && ss != undefined) {
    var sheetsUI = SpreadsheetApp.getUi();
    sheetsUI.createAddonMenu()
      .addItem('Name', 'function')
      .addToUi();
  }

  if(doc != null && doc != undefined) {
    var docsUI = DocumentApp.getUi();

    docsUI.createAddonMenu()
    .addItem('Name', 'function')
    .addToUi();
  }  
}

如果我删除有条件的东西,并且只包括编辑器特定的菜单(文档的文档,工作表的工作表),菜单会正确显示。

【问题讨论】:

  • 如果您认为这是权限问题,请尝试可安装的 onOpen
  • 您好@Eli,您的项目中的onOpen 是哪种类型的触发器?请记住,简单的onOpen 触发器会自动触发,而不需要用户授权——这可能是您的问题的原因。您是否尝试过使用可安装的触发器,就像@Cooper 提到的那样?干杯!
  • 感谢你们俩。我尝试了这条路线,但这不是解决方案。事实证明,我的条件检查抛出了一个错误,解决方案的灵感来自@alan wells 下面的 - 将菜单包装在 try/catch 块中。

标签: google-apps-script google-sheets google-docs gsuite-addons


【解决方案1】:

关于捕获错误的评论使我找到了解决方案。我将每个编辑器的菜单代码放在 try/catch 块中,现在它可以工作了。

function onOpen(e) {

  try{
    var docsUI = SpreadsheetApp.getUi();
    docsUI.createAddonMenu()
    .addItem('Sheets menu item name', 'function')
    .addToUi();
  } catch(e) {
  }

  try{
    var docsUI = DocumentApp.getUi();
    docsUI.createAddonMenu()
    .addItem('Docs menu item name', 'function')
    .addToUi();
  } catch(e) {
  } 

}

【讨论】:

    【解决方案2】:

    您不希望用户需要批准对其表格的访问权限,如果它是一个文档插件,反之亦然。如果附加组件没有其中一个权限,那么您的代码会抛出错误,因此您需要使用try/catch 来捕获错误

    function onOpen(e) {
      var docUI,thisIsA_Sheet;
    
      try{
        docUI = SpreadsheetApp.getUi();
        thisIsA_Sheet = true;
      }catch(e){
        //Do nothing
      }
    
      if (!thisIsA_Sheet) {//This is not a Google Sheet
        try{
          docUI = DocumentApp.getUi();
        }catch(e){
          //Do nothing
        }
      }
    
      docUI.createAddonMenu()
        .addItem('Name', 'function')
        .addToUi();
    
    }
    

    【讨论】:

    • 谢谢你,艾伦!这个建议使我找到了解决方案。我的原始代码抛出错误。我将每个菜单项放在一个 try/catch 块中,现在它可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    相关资源
    最近更新 更多