на каком объекте вызывается .addToUI - PullRequest
0 голосов
/ 06 июня 2018

Я новичок в javascript и в программировании gavascript для g-suite;но у меня есть опыт разработки программного обеспечения (например, на vb.net).

Я пытаюсь понять следующее определение функции и, в частности, последний метод .addToUI ().

Насколько я понимаю, SpreadsheetApp.getUI () возвращает объект пользовательского интерфейса, для которого вызывается .createMenu ().Я предполагаю, что это возвращает объект меню (я думаю), для которого затем вызывается .addItem (), который, вероятно, также возвращает объект меню, так как исходный объект пользовательского интерфейса получает метод .addToUI ().

высоко ценю объяснение того, как здесь работает цепочка методов.

спасибо,

Дан

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

1 Ответ

0 голосов
/ 06 июня 2018

Объект 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...