0

У меня есть эта глобальная переменная в моем сценарии:GAS: Как изменить значение глобальной переменной и сохранить измененное значение при использовании переменной в функции обработчика?

var targetDocId = 'No doc ID informed yet'; 

Я пытаюсь изменить значение этой глобальной переменной внутри моей главной функции:

function generatePersonDatasheet() { 
    var target = createDuplicateDocument(template, docName); 
    var link = target.getUrl(); 
    targetDocId = target.getId(); // <-------- HERE 
    if (theses == 1){ 
    Logger.log("going to showList() "); 
    return showList(); 
    } 
    showURL(docName, link); 
} 

После этого я пытаюсь Асесс измененную глобальное значение переменной в функции обработчика:

function submit(e){ 
    var numberOfItems = Number(e.parameter.checkbox_total); 
    var thesesArrays = []; 
    for(var i = 0; i < numberOfItems; i++){ 
    if(e.parameter['checkbox_isChecked_'+i] == 'true'){ 
     thesesArrays.push(fact_list[i]); 
    } 
    } 
    for (var i = 0; i < thesesArrays.length; i++){ 
    var thesesId = thesesArrays[i][2]; 
    var thesesType = thesesArrays[i][1];   
    importTheses(targetDocId, thesesId, thesesType); // <-----HERE 
    } 
    return UiApp.getActiveApplication().close(); 
} 

function importTheses(targetDocId, thesesId, thesesType) { 
    var targetDoc = DocumentApp.openById(targetDocId); 
    var targetDocParagraphs = targetDoc.getParagraphs(); 
    var targetDocElements = targetDocParagraphs.getNumChildren(); 

    var thesesDoc = DocumentApp.openById(thesesId); 
    var thesesParagraphs = thesesDoc.getParagraphs(); 
    var thesesElements = thesesDoc.getNumChildren(); 

    var eltargetDoc=[]; 
    var elTheses=[]; 

    for(var j = 0; j < targetDocElements; ++j) { 
     var targetDocElement = targetDoc.getChild(j); 
     eltargetDoc[j]=targetDocElement.getText(); 
     if(el[j]== thesesType){ 
      for(var k = 0; k < thesesParagraphs-1; ++k) { 
       var thesesElement = thesesDoc.getChild(k); 
       elTheses[k] = thesesDoc.getText(); 
       targetDoc.insertParagraph(j, elTheses[k]); 
     } 
     } 
    } 
} 

Но, до тех пор, как я tryied изменить targetDocId, когда его использование в качестве аргумента до importTheses(targetDocId, thesesId, thesesType); он все еще имеет значение «Неизвестный идентификатор документа», даже я его изменил, как если бы программа была запущена с самого начала. Является альтернативой этому поведению «возврат к первоначальному значению»? Или мне нужно использовать scriptDB или ScriptProperties для хранения измененного значения глобальной переменной?

ответ

0

Каждое отдельное выполнение скрипта выполняется в новом экземпляре выполнения. Любые переменные, определенные вне блока кода (так называемые «глобальные» переменные), поэтому уникальны для этого экземпляра. Когда триггерная функция вызывается событием, она запускается в своем собственном экземпляре, и любые глобальные значения, которые она устанавливает, видны только этому экземпляру; другая функция, вызываемая электронной таблицей или пользовательским интерфейсом документа, например, имела бы свою собственную версию этого объекта, не связанного с областью (global).

Определение и извлечение targetDocId было бы хорошим применением Cache Service. примечание

function get_targetDocId() { 
    var cache = CacheService.getPublicCache(); 
    var cached = cache.get("targetDocId"); 
    if (cached != null) { 
    return cached; 
    } 
    var target = createDuplicateDocument(template, docName); /// Need to add handling for pre-existing document 
    var link = target.getUrl(); 
    var contents = target.getId(); 
    cache.put("targetDocId", contents, 1500); // cache for 25 minutes 
    return contents; 
} 

Теперь вместо того, чтобы пытаться использовать глобальную переменную, просто вызовите эту функцию:

... 
var targetDoc = DocumentApp.openById(get_targetDocId()); 
... 

сведению Cache Service является одним из примеров постоянного хранения для Служб Google Сценарий. Properties Service был введен после того, как этот ответ был написан, и является гораздо более легким способом сохранения «глобальных» переменных между экземплярами исполнения.


Наблюдение: оказывается, что вы используете глобальный (статический) для tempate и docName, так как нет никаких параметров generatePersonDatasheet(). Вы можете просто сгенерировать targetDocId на лету.

Ошибка: как написано, get_targetDocId() создаст новую копию docName каждый раз, когда потребуется обновить кеш (15 минут). Вы должны добавить обработку для возможности уже существующего файла. (Это относится и к существующим onOpen().)

+0

Очень богатый ответ! Я попробую использовать службу кеша! Спасибо, @Mogsdad! – craftApprentice

1

No theres no такой вариант. Вы должны использовать scriptProperties или scriptDb. Глобальная vsriable выходит за рамки после завершения вашей функции. Каждый вызов внешнего скрипта начинается с нуля.

+0

Итак, когда я перехожу к функции обработчика, я ухожу из своей основной функции, и после запуска обработчика я не могу вернуться и вернуться к точке Когда я пошел к функции обработчика? – craftApprentice

+0

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

+0

"к тому времени, когда вызывается ваш обработчик, основной закончен давно, а скрипт снова загружается с нуля". Это было мое сомнение! – craftApprentice

Смежные вопросы