Скрипт приложений Google хранит activeDocument в глобальной переменной - PullRequest
0 голосов
/ 04 февраля 2020

Мне известно, что глобальные переменные в скрипте приложений Google имеют некоторые проблемы (или, скорее, другие способы работы, чем "обычный" код):

Проблемы с глобальными переменными в Google App Script

Как определить глобальную переменную в Google Apps Script

Глобальные переменные в Google Script (электронная таблица)

и еще много примеров, но вопрос в том, что в документации к скрипту Google Apps они упоминают, что в функции onOpen передается объект события, который содержит свойство источника, которое связано с текущим document:

source Объект Document, представляющий файл Документов Google, к которому привязан скрипт.

Document

Теперь, что будет смысл дать нам доступ к этому источнику, если вам все равно придется звонить DocumentApp.getActiveDocument()? Я попытался создать глобальную переменную в верхней части кода, указав:

var doc;

, затем в функции onOpen(e), установив для нее значение: doc = e.source, что прекрасно работает в этом функции, но когда я хочу использовать ее в другой функции, вызываемой клиентом, «глобальная» переменная «do c» не определена или равна нулю, так как я могу ее настроить, чтобы мне не нужно было вызывать DocumentApp.getActiveDocument() каждый раз, когда клиент что-то нажимает? Потому что это занимает около 50-70 мс, что хотя и довольно быстро, но может быть быстрее ... какие-либо обходные пути для этого?

в основном: как мне хранить DocumentApp.getActiveDocument() в переменной многократного использования? И если я не могу, почему свойство источника предоставляется в объекте события в onOpen? (тот факт, что это подразумевает, что его возможно хранить где-то, возможно)

1 Ответ

2 голосов
/ 04 февраля 2020

Я думаю, e.source предоставляется только для того, чтобы вам не нужно было вызывать DocumentApp.getActiveDocument() в вашем триггере, как вы указали. Это полезно, потому что вы можете захотеть манипулировать документом, поэтому наличие его означает, что вам не нужно делать дополнительный вызов.

Глобальный var doc = e.source не будет работать, потому что скрипт -приведены каждый раз, когда вы запускаете его. Поэтому, как только ваш onOpen() завершит работу, ни одно из ваших значений переменных не будет сохраняться.

Это не будет работать, потому что значение doc будет неопределенным после завершения onOpen().

var doc;

function onOpen(e) {
  doc = e.source;
}

function foo() {
  DocumentApp.getUi().alert(doc.getName());
}

Это будет работать, потому что это тот же экземпляр скрипта, что и при onOpen() был вызван, это означает, что значение doc определено .

var doc;

function onOpen(e) {
  doc = e.source;
  foo();
}

function foo() {
  DocumentApp.getUi().alert(doc.getName());
}

В конечном счете, лучший способ заставить doc работать глобально, это просто сохранить DocumentApp.getActiveDocument() к этому. Это означает, что DocumentApp.getActiveDocument() будет вызываться каждый каждый раз, когда вы выполняете сценарий, независимо от того, нужен ли вам документ или нет. Так что подумайте, действительно ли вам это нужно во всем мире.

var doc = DocumentApp.getActiveDocument();

function onOpen(e) {
  // do something
}

function foo() {
  DocumentApp.getUi().alert(doc.getName());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...