Объект Menu
создается с учетом того, из какого экземпляра Ui
он получен, поэтому для вызова Menu#addToUi()
не требуется аргументов.
Asчто касается цепочек 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();
}
Может помочь руководство по меню .
Если вы понимаете синтаксис 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)