【问题标题】:Google Sheets custom menu pass a variable to function [duplicate]Google表格自定义菜单将变量传递给函数[重复]
【发布时间】:2021-11-08 05:56:13
【问题描述】:

我正在关注this question 中的解决方案,但是当我单击其中一个生成的按钮时,我收到此错误: 未找到脚本函数:test1。

const flags = {};
flags["test1"] = "data";
flags["test2"] = "data";

function onOpen(){
  var ui = SpreadsheetApp.getUi();

  Object.keys(flags).forEach(function (flag) {
    this[flag] = function () {
      addToFlagInteract(flag);
    }
  });

  var flagMenu = ui.createMenu('Flag');
  var flagSubMenu = ui.createMenu('Add to Flag');

  Object.keys(flags).forEach(function (flag) {
    flagSubMenu.addItem(flag,flag);
  });

  flagMenu.addSubMenu(flagSubMenu).addToUi();
}

function addToFlagInteract(flag){
  //Do something
}

【问题讨论】:

  • this 会回答你的问题并解释田池的回答吗?
  • @TheMaster 从您的评论中,我注意到我忘记了the thread。我认为这个问题和它是一样的。所以,我删除了我的答案。因为我认为this thread可以很好地解释OP的问题。
  • @Tanaike 不需要删除。即使我们将其作为重复项关闭也可能会有所帮助。不过,在您的回答中,一个小问题是onOpen 在触发 onOpen 时会运行两次,对吗?另外,我认为 OP 错过了您在末尾添加 onOpen() 的部分。
  • @TheMaster 是的。我认同。当我看到这个问题时搜索了重复的问题,不幸的是,我找不到它。关于run twice,例如,为了将onOpen作为全局运行,const sample = (_ => onOpen())()被放入脚本编辑器,当电子表格打开时,sampleonOpen按顺序运行。因此,我建议将onOpen() 设置为全局。并且,感谢您的编辑。我重新打开了它。
  • @TheMaster 我认为你是对的。在放入一行onOpen();和一行const sample = (_ => onOpen())()的情况下,两种情况都是一样的。当电子表格打开时,函数 put as global 运行,然后,function onOpen(){} 运行。通过这个流程,我认为 onOpen 运行了 2 次。当 onOpen 安装为可安装触发器时,onOpen 运行 4 次。当打开Spreadsheet时OP不想运行2次,例如function onOpen(e) {if (e) return; do something }onOpen();onOpen只运行一次。

标签: google-apps-script google-sheets


【解决方案1】:
  • 我认为在您的脚本中,当使用自定义菜单运行该功能时,test1test2 的功能没有安装。

  • 通过全局执行onOpen(),当从自定义菜单运行test1的功能时,运行onOpen()。至此,函数test1就安装好了,就可以运行了。

修改脚本:

//Same globals 
function onOpen(){
  //Same script in original post
}

function addToFlagInteract(flag){
  //Do something
}

onOpen(); // <--- Added

【讨论】:

  • 我不太明白您所说的“已安装”是什么意思。另外,onOpen 是一个全局函数,我可以通过调试器确认函数 test1 和 test2 也是全局函数。
  • @DrDaNkk 感谢您的回复。我带来的不便表示歉意。我认为在您的onOpen 中,创建了test1test2 的函数并将其放入Google Apps 脚本的this。但是在你的脚本中,当test1 从自定义菜单运行时,函数test1 没有被放置。这样,就会发生这样的错误。所以我提出了上面的修改。对了,我看不懂Additionally, onOpen is a global function and I can confirm that the functions test1 and test2 are also global functions by checking the debugger.,可以问一下具体情况吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多