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]);
         }
      }
   }
}

但是,只要我尝试更改targetDocId,当将其用作参数时,importTheses(targetDocId, thesesId, thesesType);它仍然具有“尚未通知文档ID”的值,即使我更改了它,就好像程序是从头开始运行的一样。是这种“重置为原始值”行为的替代方法吗?还是我必须使用scriptDB或ScriptProperties来存储全局变量的更改后的值?

莫格斯达

脚本的每个单独执行都在新的执行实例中完成。因此,在代码块外部定义的任何变量(也称为“全局”变量)在该实例中都是唯一的。当事件触发一个触发器函数时,它在自己的实例中运行,并且它设置的任何全局值仅对该实例可见。例如,由电子表格或文档UI调用的另一个函数将具有该非范围对象(全局)的自己的版本。

的定义和检索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());
...

note缓存服务是可用于Google Apps脚本的永久存储的一个示例。属性服务引入这个答案写后,是一个更轻量级的方式来坚持执行实例之间的“全局”变量。


观察:看来,您使用的是全局(静态)为tempatedocName,因为没有参数generatePersonDatasheet()您可以简单地动态生成targetDocId。

错误:在编写时,每次需要刷新缓存时get_targetDocId()都会创建一个新副本docName(15分钟)。您应该添加处理功能,以使文件可能已存在。(您的现有公司也是如此onOpen()。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

javascript范围:在函数后保留全局变量值

来自分类Dev

在函数内部更改全局变量值

来自分类Dev

在函数内部更改全局变量值

来自分类Dev

更改全局变量值jQuery

来自分类Dev

除了声明它的函数之外,如何更改python中的全局变量值?

来自分类Dev

使用window.onload内部的函数更改全局变量值

来自分类Dev

视图更改后保留变量值

来自分类Dev

c#:全局变量值已更改,即使未在循环中为其分配新值

来自分类Dev

AngularJS更改注入全局变量值

来自分类Dev

jQuery全局变量值已更改也应从函数中访问

来自分类Dev

如果全局变量值更改,如何强制渲染?

来自分类Dev

如何在不更改全局变量的情况下更改分配给全局变量值的局部变量?

来自分类Dev

如何更改函数内部任何全局变量的值?

来自分类Dev

在onclick中使用变量(即使以后更改,也要保留旧的变量值)

来自分类Dev

如何通过函数更改全局变量?

来自分类Dev

如何使用参数更改函数中的全局变量

来自分类Dev

如何在Lisp中的函数内全局更改变量值

来自分类Dev

更改变量值后未更新数组值

来自分类Dev

在函数中对其进行更改后,Javascript全局变量保持“未定义”

来自分类Dev

(Angular) 使全局变量始终根据服务更改其值

来自分类Dev

(C ++)调用函数时变量值更改

来自分类Dev

设置成员变量值后,值将在getter函数中更改

来自分类Dev

中断正在等待的accept(),仅更改全局变量值

来自分类Dev

中断正在等待的accept(),仅更改全局变量值

来自分类Dev

用于更改全局变量值的按钮命令中的参数 python tkinter

来自分类Dev

c#在用户控件中使用计时器更改值时从Form获取变量值

来自分类Dev

在 linux 中使用 sed 命令更改变量值

来自分类Dev

变量值在函数调用后更改,不使用

来自分类Dev

使用函数中的内容更改变量值

Related 相关文章

  1. 1

    javascript范围:在函数后保留全局变量值

  2. 2

    在函数内部更改全局变量值

  3. 3

    在函数内部更改全局变量值

  4. 4

    更改全局变量值jQuery

  5. 5

    除了声明它的函数之外,如何更改python中的全局变量值?

  6. 6

    使用window.onload内部的函数更改全局变量值

  7. 7

    视图更改后保留变量值

  8. 8

    c#:全局变量值已更改,即使未在循环中为其分配新值

  9. 9

    AngularJS更改注入全局变量值

  10. 10

    jQuery全局变量值已更改也应从函数中访问

  11. 11

    如果全局变量值更改,如何强制渲染?

  12. 12

    如何在不更改全局变量的情况下更改分配给全局变量值的局部变量?

  13. 13

    如何更改函数内部任何全局变量的值?

  14. 14

    在onclick中使用变量(即使以后更改,也要保留旧的变量值)

  15. 15

    如何通过函数更改全局变量?

  16. 16

    如何使用参数更改函数中的全局变量

  17. 17

    如何在Lisp中的函数内全局更改变量值

  18. 18

    更改变量值后未更新数组值

  19. 19

    在函数中对其进行更改后,Javascript全局变量保持“未定义”

  20. 20

    (Angular) 使全局变量始终根据服务更改其值

  21. 21

    (C ++)调用函数时变量值更改

  22. 22

    设置成员变量值后,值将在getter函数中更改

  23. 23

    中断正在等待的accept(),仅更改全局变量值

  24. 24

    中断正在等待的accept(),仅更改全局变量值

  25. 25

    用于更改全局变量值的按钮命令中的参数 python tkinter

  26. 26

    c#在用户控件中使用计时器更改值时从Form获取变量值

  27. 27

    在 linux 中使用 sed 命令更改变量值

  28. 28

    变量值在函数调用后更改,不使用

  29. 29

    使用函数中的内容更改变量值

热门标签

归档