Доступ к локальным переменным при использовании библиотек скриптов Google Apps - PullRequest
0 голосов
/ 03 октября 2018

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

Чтобы сохранить функции только один раз для всех электронных таблиц, один служит библиотекой для всех остальных.Теперь возникает проблема: все электронные таблицы имеют набор индивидуальных свойств, которые необходимо передать вызовам функций библиотеки.Вот почему я сейчас делаю что-то вроде этого:

Функция выборки в библиотеке, которая доступна как lib, а также построение меню для всех листов:

function onOpen() {
   var ui = SpreadsheetApp.getUi();
   ui.createMenu('Actions')
             .addItem("My Library Function", "trackingHelper")
             .addItem("My 2nd Library Function", "anotherFunction")
             .addToUi();
}

function trackingHelper(sheetProperties) {
   do something and use the sheetProperties
}

А теперьВ «дочерних» листах я добавляю что-то вроде этого:

var sheetProperties = {key: value, ...}

function onOpen() {
   lib.onOpen();
}

function trackingHelper() {
   lib.trackingHelper(sheetProperties);
}

function anotherFunction() {
   lib.anotherFunction(sheetProperties);
}

Проблема в том, что мне всегда нужно редактировать все листы, если я добавляю новые функции.Вот почему я хотел бы сделать что-то подобное с меню в электронной таблице библиотеки:

function onOpen() {
   var ui = SpreadsheetApp.getUi();
   ui.createMenu('Actions')
             .addItem("My Library Function", "lib.trackingHelper")
             .addItem("My 2nd Library Function", "lib.anotherFunction")
             .addToUi();
}

Поэтому я хочу добавить только один onOpen с этим меню ко всем дочерним листам, чтобы избавить от необходимостидобавив все функции индивидуально.Но как я могу передать свои дочерние свойства сейчас?Я пытался использовать PropertiesService, но выполнение скрипта из дочернего листа всегда давало область свойств листа библиотеки.

Есть ли возможность избежать необходимости переназначения всех локальных функций в функции библиотеки по порядкупередать некоторые специфичные для листа переменные?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Являются ли свойства листа в дочерних листах переменными или они статичны?

Если он статический, сохраните их в службе свойств с идентификатором дочерней электронной таблицы в качестве ключа, а затем используйте getactivespreadsheet().getID, чтобы извлечь свойства из файла lib.

Гораздо быстрее, чем чтение значения из листа, но я не могу сказать, что я свободен от функций, которые также извлекают переменные из электронной таблицы.Это было легко в то время и просто работает.Если кто-то не редактирует форматирование или случайно не удаляет значения или таблицу.

0 голосов
/ 05 декабря 2018

РЕДАКТИРОВАТЬ: У меня та же проблема, что и у вас.Мне все еще нужно переназначить все библиотечные функции в дочернем скрипте, НО я понял, как управлять отдельными свойствами, как показано ниже.

-

В библиотеке вы можете управлять переменными длякаждый дочерний:

PROJECT_NAME1 = {
    name: 'abc',
    visibleOverride: false
};

PROJECT_NAME2 = {
    name: 'xyz',
    visibleOverride: true
};

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

PROJECT = lib.PROJECT_NAME1;

В дочернем скрипте вы передаете глобальную переменную PROJECT вФункции библиотеки:

function hideSheet() {
    lib.Group.toggleSheetVisibility(PROJECT, false);
}

function showSheet() {
    lib.Group.toggleSheetVisibility(PROJECT, true);
}

В библиотеке вы можете получить доступ к индивидуальным настройкам, настроенным исходным дочерним скриптом:

Group = {

    toggleSheetVisibility: function (PROJECT, visible) {

        var sheet = SpreadsheetApp
            .getActive()
            .getActiveRange()
            .getSheet();

        if (!PROJECT.visibleOverride) {

            visible
                ? sheet.showSheet()
                : sheet.hideSheet();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...