我是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();
}
答案 0 :(得分:1)
构造Menu
对象时需要了解它来自哪个Ui
实例,因此调用Menu#addToUi()
不需要参数。
就链接Menu
和addItem
等addSeparator
方法而言,它们实际上会返回相同底层对象数据的句柄。也就是说,它们确实创建了一个新的对象句柄,因此它们之间的严格相等将返回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)