Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 为每个编辑器自定义应用程序脚本加载项菜单_Google Apps Script_Google Sheets_Google Docs_Gsuite Addons - Fatal编程技术网

Google apps script 为每个编辑器自定义应用程序脚本加载项菜单

Google apps script 为每个编辑器自定义应用程序脚本加载项菜单,google-apps-script,google-sheets,google-docs,gsuite-addons,Google Apps Script,Google Sheets,Google Docs,Gsuite Addons,我有一个附加组件,以前只针对谷歌文档,我正在尝试扩展该功能集,以包括谷歌表单。在开发模式中,我可以设置一个条件来检测哪种文档类型是活动的(文档或工作表),然后显示相应的菜单。当我发布最新版本的加载项时,加载项菜单将停止在文档和工作表中工作 我猜这与“onOpen()”周围的权限有关,但我不确定如何处理这个问题。G套件市场允许您指定一个附加组件支持多个编辑器 以下是在开发中起作用的代码: function onOpen(e) { var ss = SpreadsheetApp.getActi

我有一个附加组件,以前只针对谷歌文档,我正在尝试扩展该功能集,以包括谷歌表单。在开发模式中,我可以设置一个条件来检测哪种文档类型是活动的(文档或工作表),然后显示相应的菜单。当我发布最新版本的加载项时,加载项菜单将停止在文档和工作表中工作

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

以下是在开发中起作用的代码:

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

如果我删除了有条件的内容,并且只包含特定于编辑器的菜单(docs for docs,sheets for sheets),菜单将正确显示。

如果是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();

}

关于陷阱错误的评论让我找到了解决方案。我将每个编辑器的菜单代码放在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) {
  } 

}

如果您认为这是权限问题,请尝试安装onOpenHello@Eli,在您的项目中,哪种类型的触发器是
onOpen
?请记住,simple
onOpen
会自动触发,而无需请求用户授权,这可能是您出现问题的原因。你有没有像@Cooper提到的那样尝试过使用可安装的触发器?干杯谢谢你们两位。我试过这条路,但不是解决办法。事实证明,我的条件检查抛出了一个错误,而解决方案的灵感来自@alan wells的下文——将菜单包装在try/catch块中。谢谢你,alan!这个建议使我找到了解决办法。我的原始代码抛出了一个错误。我将每个菜单项放在一个try/catch块中,现在它可以完美地工作了。