Жизненный цикл динамической c созданной функции в for l oop с eval - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь создать приборную панель для своего класса (асинхронный c запуск, асинхронный c продолжительность, асинхронный c тестирование) ...

Моя проблема в том, что я динамически создаю функции с помощью eval (я знаю, что это путь на темную сторону). Эти функции, созданные динамиком c, больше не живут, чем for l oop, в которых они были созданы?

     function onOpen() {
      const FUNC_STR = 'course';
      var evalString = '';
      const response = Classroom.Courses.list();
      const courses = response.courses;
      for(var index  in courses) {
        const course = courses[index]
        evalString += 'function ' + FUNC_STR + course.id + '() { ' + FUNC_STR + '(' + course.id + ') }';
        eval(evalString);
      }
      const ui = SpreadsheetApp.getUi();
      var mymenu = ui.createMenu('Classroom');
      if (courses && courses.length > 0) {
        for (i = 0; i < courses.length; i++) {
          const course = courses[i];
          mymenu.addItem(course.name, FUNC_STR + course.id);
          }
        mymenu.addToUi();
        }
    }
    function course(id ) {
      SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Classroom.Courses.get(id).name);
    }

1 Ответ

1 голос
/ 20 июня 2020

Я считаю, что ваша цель следующая.

  • Вы хотите создать настраиваемое меню в таблице Google при открытии таблицы Google.
  • Вы хотите создать настраиваемое меню с помощью динамическое создание функций.

Для этого как насчет этого ответа?

Пункты модификации:

  • Когда функция запускается из пользовательского меню, функция должна быть установлена ​​в this скрипта.
    • В вашем скрипте функции evalString += 'function ' + FUNC_STR + course.id + '() { ' + FUNC_STR + '(' + course.id + ') }'; не установлены на this. Таким образом, когда функция запускается в пользовательском меню, возникает ошибка типа «нет функций».
  • Чтобы динамически установить функции в пользовательское меню и запустить функцию, когда функция запускается в пользовательском меню, функция установки функций, которые вы хотите запустить, должна быть запущена, когда функция запускается в пользовательском меню.
    • В этом случае использовать eval не обязательно.

Когда ваш скрипт изменяется, он становится следующим. В этом случае я предлагаю модифицированный сценарий, изменяя сценарий этих ответов. Ref1 и Ref2

Измененный скрипт:

Скопируйте и вставьте следующий скрипт в редактор скриптов. И, пожалуйста, введите installFunctions() или снова откройте электронную таблицу. Таким образом настраивается пользовательское меню. Когда вы выбираете функцию из пользовательского меню, ее можно запустить.

installFunctions(); // This is required to run the function. So please don't remove this.
function onOpen() {} // This can be used as the simple trigger. So please don't remove this.

function installFunctions() {
  const FUNC_STR = 'course';
  const response = Classroom.Courses.list();
  const courses = response.courses;
  const menu = SpreadsheetApp.getUi().createMenu('Classroom');
  courses.forEach(e => {
    const functionName = `FUNC_STR${e.id}`;
    this[functionName] = () => course(e.id);  // Install the function.
    menu.addItem(e.name, functionName);
  })
  menu.addToUi();
}

// This is your function.
function course(id) {
  SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Classroom.Courses.get(id).name);
}

Примечание:

  • В этом случае предполагается, что courses из const courses = response.courses; имеет правильные значения и Classroom.Courses.get(id).name работает. Если в них возникнет ошибка, проверьте скрипт, используя простые значения.

Ссылки:

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