2013-06-29 6 views
9

Я пытаюсь получить некоторые функции в скрипте приложений Google (внутри электронной таблицы), чтобы изменить глобальную переменную, но я не могу понять ее.Глобальные переменные в Google Script (электронная таблица)

В принципе я хочу объявить переменную (в данном случае «globalTestVar»), и каждый раз, когда одна из двух функций (globalVarTestFunctionOne и two) запускает эту переменную, должна увеличиваться на единицу.

Проблема заключается в том, что переменная объявляется снова при каждом нажатии кнопки, даже если инструкция if (typeof (globalTestVar) == 'undefined') - должна позаботиться об этом.

Я привык к Objective C и Java, где я могу объявить свои переменные в начале и изменить эти переменные в любом месте кода.

Прошу прощения, если это основной вопрос, но я работаю в течение нескольких часов, и я просто не могу заставить его работать.

Вот код:

logstuff("outside"); 


function logstuff(logInput){ 
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); 
var lastRow = sheet.getLastRow() + 1; 
sheet.getRange("A"+lastRow).setValue(logInput); 
return; 
} 


if (typeof(globalTestVar) == 'undefined') { 
logstuff('declaring global variable'); 
globalTestVar = 0; 

} else { 
logstuff('global variable has been declared'); 
} 



function globalVarTestUIFunction() { 
var app = UiApp.createApplication().setTitle('Test UI'); 
var doc = SpreadsheetApp.getActive(); 
var formPanel = app.createVerticalPanel(); 


var buttonF1 = app.createButton('F1'); 
var buttonbuttonF1ClickHandler = app.createServerClickHandler("globalVarTestFunctionOne"); 
buttonF1.addClickHandler(buttonbuttonF1ClickHandler); 
buttonbuttonF1ClickHandler.addCallbackElement(formPanel); 

var buttonF2 = app.createButton('F2'); 
var buttonbuttonF2ClickHandler = app.createServerClickHandler("globalVarTestFunctionTwo"); 
buttonF2.addClickHandler(buttonbuttonF2ClickHandler); 
buttonbuttonF2ClickHandler.addCallbackElement(formPanel); 


app.add(formPanel); 

formPanel.add(buttonF1); 
formPanel.add(buttonF2); 


doc.show(app); 

return app; 
} 



function globalVarTestFunctionOne() { 
logstuff('globalVarTestFunctionOne'); 
globalTestVar++; 
logstuff('Value of globalTestVar: ' + globalTestVar); 
} 

function globalVarTestFunctionTwo() { 
logstuff('globalVarTestFunctionTwo'); 
globalTestVar++; 
logstuff('Value of globalTestVar: ' + globalTestVar); 
} 

Выход:

  • outside3
  • объявить глобальную переменную
  • outside3
  • объявляющий глобальную переменную
  • globalVarTestFunctionOne
  • Значение globalTestVar: 1
  • outside3
  • объявить глобальную переменную
  • globalVarTestFunctionTwo
  • Значение globalTestVar: 1

Я написал свою собственную функцию "logstuff", чтобы распечатать сообщения потому что мне не нравится встроенная функция Logger.log.

Спасибо!

ответ

8

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

Вы можете использовать CacheService или ScriptDB как возможное хранение для такого рода проблем. CacheService быстрый и простой в использовании, но ограниченный, так как срок действия кеша истекает. Я не пробовал ScriptDB

+0

Ну, это беспокоит. Должен быть способ использовать какие-то глобальные переменные. Я подумал о работе и использовании таблицы «Variables» для сохранения/изменения и получения глобальных переменных. Но это не очень элегантно и не эффективно. – Eric

+0

Я использовал 'CacheService', чтобы делать то, что мне было нужно, но это было краткосрочное хранилище для повышения производительности. Вы можете найти «ScriptDB» лучше, но я этого не пробовал. –

+0

Да, cacheService работает хорошо для строк и чисел, но можно ли хранить массивы с помощью cacheService? – Eric

6

PropertiesService -> Свойства

В настоящее время (2015), я думаю, что путь использует класс PropertiesService и тип возвращаемого Properties.

О глобальной области

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