为什么当我创建一个菜单时,它说“不能从这个上下文调用SpreadsheetApp.newMenu()。”

时间:2017-10-12 05:10:09

标签: google-apps-script google-sheets google-apps

我部署了一个网络应用,可以在电子表格打开时调用该功能来创建新菜单。 以下是我写的部分

function onOpen(){
  var url = "https://script.google.com/a/slt.org.au/macros/s/AKfycby2pFGHc3qWaxnD4WGTLMEAPMUocohzH_-OsUPxwqi8kmWfRZs8/exec";
  var currentSpreadsheet = SpreadsheetApp.getActive().getId();
  var requestAction = "onOpen";
  UrlFetchApp.fetch(url+"?requestAction="+requestAction);
}

在我的网络应用中,我写了

function onOpen(currentSpreadsheet) {
  //Adds custom menu
SpreadsheetApp.openById(currentSpreadsheet);
  var menu = [{name: "Add row", functionName: "addRow"},
             {name: "Generate Invoice", functionName: "generateInvoice"}];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu);
}

我有一个测试,我确信电子表格ID已转移到该函数中,但它给出了一个错误“无法从此上下文调用SpreadsheetApp.newMenu()。”

我也试过

function onOpen(currentSpreadsheet) {
      //Adds custom menu
      var menu = [{name: "Add row", functionName: "addRow"},
                 {name: "Generate Invoice", functionName: "generateInvoice"}];
      SpreadsheetApp.openById(currentSpreadsheet).addMenu("Custom", menu);
    }

仍然无法正常工作。那么这意味着addMenu只能用于独立脚本或内置脚本吗?但不是在谷歌网络应用程序?

当我尝试使用addMenu()时,会发生所有错误。

1 个答案:

答案 0 :(得分:0)

您的脚本在Web应用程序的上下文中运行,但onOpen()触发器仅在绑定到Docs / Sheet / Form文件的脚本中运行。简而言之,您无法通过网络应用将onOpen()函数传递或安装到电子表格中。

来自documentation

  

要使用简单的触发器,只需创建一个使用其中一个的函数   这些保留的函数名称:

     当用户打开电子表格,文档或表单时,

onOpen(e)会运行   他或她有权编辑。 ...