1

我有一个以前只针对 Google Docs 的插件,我正在尝试扩展功能集以包括 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();
  }  
}

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

4

2 回答 2

1

如果它是 Docs 插件,您不希望用户需要批准对其表格的访问权限,反之亦然。如果附加组件没有对其中之一的权限,那么您的代码将引发错误,因此您需要使用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();

}
于 2020-04-02T20:18:09.800 回答
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) {
  } 

}
于 2020-04-03T13:16:57.783 回答