Являются ли свойства скрипта Google Apps Script действительно свойствами проекта? Каков правильный масштаб?

В документации Google говорится, что PropertiesServices.getScriptProperties() относится к сценарию.

Однако у меня есть рабочий пример, который, кажется, противоречит этому.

У меня есть один проект с тремя скриптами (вкладками). Каждая вкладка устанавливает значение последнего времени выполнения в файле ScriptProperties. Если бы область действия этих ScriptProperties была действительно для каждого скрипта, я бы ожидал, что смогу хранить разные значения для каждого скрипта (вкладки).

Но я обнаружил, что каждый раз, когда выполняется один сценарий (вкладка), он перезаписывает значение времени последнего выполнения, которое было сохранено другими сценариями (вкладками).

Похоже, это указывает на то, что ScriptProperties на самом деле привязаны к проекту, а не к сценарию.

Может ли кто-нибудь подтвердить это или сказать мне, что я неправильно понимаю?

(Я уже оставил отзыв на странице документации Google)


person knwpsk    schedule 25.06.2020    source источник


Ответы (2)


Да, ScriptProperties являются общими для всего проекта сценария. Концепция файлов в проектах предназначена исключительно для удобства организации, все файлы .gs в одном проекте скриптов Google Apps представляют собой один скрипт.

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

Action1_LastExecuteTime
Action2_LastExecuteTime

так далее..

Другим примером этого является авторизация сценария, когда пользователь авторизует область на уровне проекта, и эта авторизация применяется к любому коду в проекте.

person Cameron Roberts    schedule 25.06.2020
comment
Спасибо, Кэмерон. Надеюсь, Google примет мой отзыв и уточнит это в своей документации! - person knwpsk; 25.06.2020
comment
Кэмерон, может тогда ты поможешь с этой частью? Мои три скрипта используют общую функцию для установки свойств скрипта. Итак, могу ли я параметризовать имя ключа? Я попробовал setProperties('LastExecuteTime' + constThisScriptName: currentTime). Это не сработало. GAS выдает ошибку о том, что знак плюса является неожиданным. Я также пробовал setProperties (constThisScriptName: currentTime). Это тоже не сработало. GAS обрабатывает имя константы как литеральную строку. - person knwpsk; 25.06.2020
comment
Неважно, я понял это благодаря этому: заголовок stackoverflow.com/questions/13833204/ - person knwpsk; 25.06.2020
comment
Я хочу добавить комментарий, что если бы они были действительно отдельными сценариями, это было бы огромной проблемой, вы не могли бы использовать функции и переменные на разных страницах, поэтому вам пришлось бы смешивать все в одном. - person J. G.; 25.06.2020

Предисловие

Существует важное различие между областью и сценарием (или проектом).

Свойства

PropertiesService получает доступ к ресурсам с областью для определенный уровень доступа, каждый из которых определяет, что будет и что не будет общим в различных контекстах выполнения (автономно, привязано к документу или веб-приложению). Существует 3 уровня доступа с различными областями действия:

  1. Script – доступен всем пользователям независимо, < em>глобальный охват, так сказать
  2. Документ – доступен всем пользователям, но ограничен текущий (контейнерный) документ
  3. Пользователь — пользователь, с полномочиями которого скрипт работает

Проекты

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

Проект скрипта представляет собой набор файлов и ресурсов в Google Apps Script.

Обратите внимание, что проект скрипта — это больше, чем простая сумма его файлов, он имеет понятие ресурсов. В настоящее время существует 3 группы ресурсов, которые можно связать с проектом Apps Script:

  1. Библиотеки – заменяет модули.
  2. Проект Cloud Platform – управляет квотами, разрешениями и доступом.
  3. Расширенные сервисы Google – тонкие оболочки для соответствующих REST API.

Как это отвечает на вопрос?

Хотя метод getScriptProperties() работает с областью действия скрипта, он таким образом, представленные ресурсы (хранилище свойств) будут доступны откуда в контексте выполнения (при условии доступности, ofc) сценария, а не проекта поскольку он представляет собой нечто большее.

Разница становится более очевидной в сложности, которую привносят библиотеки в виде нескольких < em>проекты совместно используют библиотеку ScriptProperties (если она их предоставляет), но каждый из них также имеет свои собственные экземпляры.

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

Визуализация всей конструкции:

+----------------------------------+
| Project                          |
| +------------------------------+ |
| | Script                       | |
| | +--------------------------+ | |
| | | .gs files                | | |
| | +--------------------------+ | |
| | +--------------------------+ | |
| | | .html files              | | |
| | +--------------------------+ | |
| | +--------------------------+ | |
| | | appsscript.json manifest | | |
| | +--------------------------+ | |
| +------------------------------+ |
| +------------------------------+ |
| | Resources                    | |
| | +--------------------------+ | |
| | | Libraries                | | |
| | +--------------------------+ | |
| | +--------------------------+ | |
| | | Cloud Platform Project   | | |
| | +--------------------------+ | |
| | +--------------------------+ | |
| | | Advanced Google Services | | |
| | +--------------------------+ | |
| +------------------------------+ |
| +------------------------------+ |
| | Properties                   | |
| | +--------------------------+ | |
| | | ScriptProperties         | | |
| | +--------------------------+ | |
| | +--------------------------+ | |
| | | DocumentProperties       | | |
| | +--------------------------+ | |
| | | UserProperties           | | |
| | +--------------------------+ | |
| +------------------------------+ |
+----------------------------------+
person Oleg Valter    schedule 25.06.2020