在哪个对象上调用.addToUI

时间:2018-06-06 15:14:16

标签: javascript google-apps-script

我是javascript和google g-suite javascript编程的新手;但有软件开发经验(例如在vb.net中)。

我试图理解以下函数定义,特别是最后一个.addToUI()方法。

我的理解是SpreadsheetApp.getUI()返回一个调用了.createMenu()的UI对象。我想这会返回一个菜单对象(我认为),然后调用.addItem(),这也可能返回一个菜单对象,所以初始UI对象如何接收.addToUI()方法。

非常感谢解释链接方法如何在这里起作用。

谢谢,

function onOpen() {
  SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
      .createMenu('Custom Menu')
      .addItem('Show alert', 'showAlert')
      .addToUi();
}

1 个答案:

答案 0 :(得分:1)

构造Menu对象时需要了解它来自哪个Ui实例,因此调用Menu#addToUi()不需要参数。

就链接MenuaddItemaddSeparator方法而言,它们实际上会返回相同底层对象数据的句柄。也就是说,它们确实创建了一个新的对象句柄,因此它们之间的严格相等将返回false。 还有其他可链接的方法可以将句柄返回到不同的底层对象,例如您可能期望的那些,例如像Spreadsheet#copy这样的方法 - 句柄是新的底层对象,它是原始对象的深层副本,可以单独更新。

所以要打破它,这个功能:

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("some menu name")
    .addItem('title','function called')
    .addSeparator()
    .addItem('title 2', 'function called')
    .addToUi();
}

在功能上等同于以下内容:

function onOpen() {
  // Create a reference to the single Ui class that is active for the user this is running for.
  var ui = SpreadsheetApp.getUi(); 
  // Create a new Menu object, which knows which Ui instance it came from
  var menu = ui.createMenu("some menu name");
  // Bind a new reference to that same object by assigning the return value of the class method
  var sameMenuAsAbove = menu.addItem('title', 'function called');
  // Because these are object instance methods that mutate the object, they don't have to be chained
  sameMenuAsAbove.addSeparator();
  sameMenuAsAbove.addItem('title 2', 'function called');

  // Because 'sameMenuAsAbove' and 'menu' are references to the same underlying menu object,
  // calling 'addToUi()' from EITHER will result in the same appearance.
  menu.addToUi();
}

The guide to menus可能会有所帮助。

如果您了解Python语法,则Menu类可能如下所示:

class Menu():
  def __init__(self, ui, title):
    self.__ui = ui
    self.__title = title
    self.__drawn = []

  def addItem(self, caption, functionName):
    self.__drawn.append(Item(caption, functionName))
    return self

  def addSeparator(self):
    self.__drawn.append(Line())
    return self

  def addSubMenu(self, other_menu):
    self.__drawn.append(other_menu)
    return self

  def addToUi(self):
    self.__ui.add(self)