Динамическое создание функций и передача их в пользовательские меню для продуктов Google Docs (Документы, Листы и т. Д.) - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу создать настраиваемое меню в моем Листе Google, в котором есть список всех номеров счетов пациентов на этом листе.Просто чтобы проверить, возможно ли это, я создал объект и сохранил в нем базовую функцию, просто предупреждение с именем учетной записи, причем каждой функции назначается ключ от номера самой учетной записи.

У меня естьмассив номеров счетов, я перебираю этот массив и создаю ключ в объекте для каждого номера счета и сохраняю базовую функцию в каждом ключе.obj [acctNum] = function () {SpreadsheetApp.getUi (). alert (acctNum)}.Теперь, когда у меня есть функция для каждого номера счета, я хочу динамически передать этот номер счета и функцию в подменю для пользовательского меню в моем Листе Google.

Я получил все, кроме фактического вызовафункция.Я могу динамически создавать меню и подменю, которые будут содержать каждый номер счета в электронной таблице.Я создал объект с функциями.Я даже могу явно вызвать функцию самостоятельно, набрав obj[acctNum]().

Когда я передаю имя функции в виде строки в метод .addItem (string, string), я передаю его точнокак это должно быть.Вы увидите в коде ниже.

Я предполагаю, что я не понимаю что-то о том, как метод .getUi (). CreateMenu () вызывает функции и / или что-то о концепции "серверной стороны".Я программист-самоучка, поэтому я практически ничего не знаю о том, как компилировать код и все это работает.Я предоставил весь код, связанный с этой проблемой ниже.К сожалению, я не могу поделиться своим файлом, потому что он содержит информацию, защищенную HIPPA.Если все сводится к этому, я могу создать фиктивный файл с поддельными номерами учетных записей, чтобы продемонстрировать проблему / процесс.

Мой вопрос: как я могу динамически создавать функции и переходить в пользовательские меню Google с помощьювозможность вызывать эти динамически созданные функции?

Эта часть кода перебирает два созданных мной отдельных объекта, имеющих один ключ (AcctNums), и этот ключ представляет собой массив, образующий список номеров счетов.На моем листе есть закрытые учетные записи и открытые учетные записи.

var functions = {};
openFiles.AcctNums.forEach(function (accNum) {
  functions[accNum] = function () {
    SpreadsheetApp.getUi().alert(accNum); 
  }
});
closedFiles.AcctNums.forEach(function (accNum) {
  functions[accNum] = function () {
    SpreadsheetApp.getUi().alert(accNum); 
  }
});

Ниже приведен код, в котором я создаю пользовательское меню и перебираю те же два объекта, что и выше, создаю элемент для каждого номера счета и передаюимя функции, основанное на имени ключа в объекте (functions [accNum]).Весь этот код компилируется правильно, и я получаю настраиваемое меню на листе с перечисленными параметрами, и все номера счетов заполняются как элементы.

function onOpen(e) {
  var ui = SpreadsheetApp.getUi()
  var parentMenu = ui.createMenu("Claim Path Tools")
  var oACF = ui.createMenu("Open a closed file");
  openFiles.AcctNums.forEach(function (accNum) {
    oACF.addItem(accNum,"functions[\"" + accNum + "\"]");
  })
  var cAOF = ui.createMenu("Close an open file");
  closedFiles.AcctNums.forEach(function (accNum) {
    cAOF.addItem(accNum,"functions[\"" + accNum + "\"]");
  })
  parentMenu.addSubMenu(oACF).addSubMenu(cAOF).addToUi()
}

Ожидаемый результат: всякий раз, когда я нажимаю на один из пунктов вВ пользовательском меню я получаю предупреждение с соответствующим номером счета.

Фактический результат: я получаю сообщение об ошибке:

"Функция сценария не найдена: functions [" COOC2018-71 "] Длядополнительную информацию см. https://developers.google.com/apps-script/reference/base/menu#addItem(String,String)"

ПРИМЕЧАНИЕ: "COOC2018-71" - это один из многих номеров счетов на странице. Кроме того, если я вписываю где-нибудь код functions["COOC2018-71"](), он правильно вызываетфункция и дает мне предупреждение с номером учетной записи. Это то, что я ожидал, что меню также будет делать, но он не может найти функцию, когда я вызываю ее из меню.

1 Ответ

0 голосов
/ 30 апреля 2019

Я понял это! Вы можете добавить функции на стороне сервера (я не уверен, правильно ли я говорю) с помощью ключевого слова this. 'this' - это ключевое слово, используемое для доступа к объекту всех ваших функций. Поскольку это объект, вы также можете динамически добавлять к нему функции! Поэтому я перебрал все номера своих счетов и создал функцию, названную в честь каждого из них, например:

openFiles.AcctNums.forEach(function (accNum) {
  this[accNum] = function () {
    SpreadsheetApp.getUi().alert(accNum); 
  }
});

Я сделал это глобально, так что экземпляр этого на стороне сервера теперь содержал новый ключ для каждого номера учетной записи, который был функцией, которая будет повторно запускаться каждый раз, когда вызывается код. Это было полное решение. Я перебрал меню и выполнил .addItem (accNum, accNum), и он может вызывать функцию, которая хранится в свойстве this, даже без необходимости вводить строку с префиксом this. Успех!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...