javascript - Google Apps脚本将activeDocument存储在全局变量中

标签 javascript google-apps-script global-variables

我知道 Google Apps 脚本中的全局变量存在一些问题(或者更确切地说,与“正常”代码不同的工作方式):

Issues with global variables in Google App Script

How to define global variable in Google Apps Script

Global variables in Google Script (spreadsheet)

还有更多的例子,但问题是,在 Google Apps script documentation 中,他们提到在 onOpen 函数中,传递了事件对象,其中包含一个链接到当前文档的源属性:

source A Document object, representing the Google Docs file to which the script is bound.

Document

现在,如果您无论如何都必须调用 DocumentApp.getActiveDocument(),那么让我们访问此源有什么意义呢?我尝试在代码顶部创建一个全局变量,说明:

var 文档;

然后在onOpen(e)函数中,将其设置为:doc = e.source,在该函数中工作正常,但是当我想使用它时在客户端调用的另一个函数中,“全局”变量“doc”未定义或为空,那么我该如何设置它,这样我就不必每次都调用 DocumentApp.getActiveDocument()客户点击了什么?因为它需要大约 50-70 毫秒,尽管它相当快,但它可以更快......对此有任何解决方法吗?

基本上:如何将 DocumentApp.getActiveDocument() 存储在可重用变量中?如果我不能,为什么在 onOpen 的事件对象中提供源属性? (事实上​​,它意味着可以将其存储在某个地方)

最佳答案

我认为提供 e.source 只是为了让您不必在触发器中调用 DocumentApp.getActiveDocument(),正如您所指出的。这很有用,因为您可能想要操作该文档,因此提供它意味着您不需要进行额外的调用。

拥有全局 var doc = e.source 不起作用,因为每次运行脚本时都会重新实例化它。因此,一旦您的 onOpen() 完成运行,您的任何变量值都不会保留。

这不起作用,因为在 onOpen() 终止后,doc 的值将是未定义的。

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

关于javascript - Google Apps脚本将activeDocument存储在全局变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60049342/

相关文章:

javascript - 如果我们需要等待,为什么回调被认为是异步的

javascript - 无法读取未定义的属性 'user_id'

google-apps-script - 日期字段的 Google App Script 事件值类型不同于 e.value 和 e.range.getValue()

javascript - 如果不存在则定义全局

php - 在 if 条件下更改全局变量值,然后在 else 中访问该值

python - 有没有一种方法可以更改 for 循环中的全局函数而不是创建一个新函数?

javascript - Youtube:提高页面加载速度(Greasemonkey/jQuery)

javascript 更改需要刷新

google-apps-script - 如何在 Google Apps Script 提供的 HTML 站点中使用 Angular.js?

javascript - 如何将多项选择 div 中的问题分开?