首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >避免重复:是否在Google脚本中使用全局变量?

避免重复:是否在Google脚本中使用全局变量?
EN

Stack Overflow用户
提问于 2021-11-21 08:15:18
回答 1查看 1.5K关注 0票数 0

到2021年,使用V8引擎,我想知道在Google脚本中使用全局变量是否是个好主意?如果是的话,如何使用呢?我的方式是个好方法吗(下面描述)?

当然,现在我检查了所有其他类似的问题。但仍有一些细节我找不到:

基本上,我试图做的是不重复代码:我有多个函数,并且存储活动的电子表格和当前的表,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();

这导致了

重复(1)-实例化电子表格和工作表(2)

  • Increasing变量(ss /

  • / spreadsheet )-从web上的代码片段复制/粘贴资源的

  • (3)

对吗?

所以,每当我在多个函数中有共同的局部变量时,我就考虑使用全局变量(GV)。

但是,由于在每个函数调用上都会不必要地分配它们(还有其他函数不需要GVs),所以我尝试只在需要时(只有当函数调用使用它们时)才定义它们--方法是不使用定义关键字(var,const,let):

根据这个link,它似乎是一种很好的方法(模式1)。

不管怎么说,我想知道是否还有其他的考虑或缺点我不知道?走这条路真的好吗?因为到目前为止,我还没有看到任何实现这个功能的片段,而且我看到了很多气体片段。

我意识到的一个缺点是,对于我的GV来说,新的GAS编辑器缺乏自动完成功能(因为我没有使用'var‘或'let’来定义它们的范围Global。)

否则,我就知道PropertiesService和CacheService了。然而,我愿意重用我的脚本(其中我定义了我的GVs)作为我的其他脚本的库。

此外,您只能将值存储为PropertiesService和CacheService中的字符串(而不是SpreadsheetApp.getActiveSpreadsheet()),对吗?更不用说,在脚本执行之后,我不需要持久化。

所以我也不太愿意用它们来代替GVs。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-22 17:03:15

可以使用my answer

  • To中的延迟加载技术使其动态和避免重复,可以使用封装箭头函数(()=>{})来避免直接执行,并使用Object.defineProperty()添加getter.

  • One的显着优点是模块化懒惰加载。如果不需要对象,则不加载对象。如果将sssheet1sheet2rangeOfSheet1rangeOfSheet2作为全局变量,则如果您访问rangeOfSheet2,则只加载它的依赖项,即sheet1ss。其余的都没有被碰过。--

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const g = {};//global object
const addGetter_ = (name, value, obj = g) => {
  Object.defineProperty(obj, name, {
    enumerable: true,
    configurable: true,
    get() {
      delete this[name];
      return (this[name] = value());
    },
  });
  return obj;
};

//MY GLOBAL VARIABLES in g
[
  ['ss', () => SpreadsheetApp.getActive()],
  ['MasterSheet', () => g.ss.getSheetByName('Sheet1')],
  ['MasterRangeColA1_5', () => g.MasterSheet.getRange('A1:A5')],
  ['MasterRangeColAValues', () => g.MasterRangeColA1_5.getValues()],
].forEach(([n, v]) => addGetter_(n, v));

const test = () => {
  console.info('start');
  console.log({ g });
  console.info('Accessing MasterSheet');
  console.log(g.MasterSheet);
  console.log({ g }); //note ss is loaded as well
  console.info('Accessing MasterRangeColAValues');
  console.log(g.MasterRangeColAValues);
  console.log({ g }); //note MasterRangeColA1_5 is loaded as well
};

与全局对象g不同,我们还可以使用全局this,在这种情况下,所有变量都直接成为全局对象的成员:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const addGetter_ = (name, value, obj = this) => {
  Object.defineProperty(obj, name, {
    enumerable: true,
    configurable: true,
    get() {
      delete this[name];
      return (this[name] = value());
    },
  });
  return obj;
};
[
  ['ss', () => SpreadsheetApp.getActive()],
  ['MasterSheet', () => ss.getSheetByName('Sheet1')],
  ['MasterRangeColA1_5', () => MasterSheet.getRange('A1:A5')],
  ['MasterRangeColAValues', () => MasterRangeColA1_5.getValues()],
].forEach(([n, v]) => addGetter_(n, v));

const test = () => {
  console.info('start');
  console.log(this);
  console.info('Accessing MasterSheet');
  console.log(MasterSheet);
  console.log(this); //note ss is loaded as well
  console.info('Accessing MasterRangeColAValues');
  console.log(MasterRangeColAValues);
  console.log(this); //note MasterRangeColA1_5 is loaded as well
};

  • 优点:您不必在变量前加上g.,但是,全局空间受到了污染。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70056310

复制
相关文章
【shell脚本】$ 在shell脚本中的使用
注释:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
码缘
2019/07/01
6.2K0
避免重复内容
重复内容是指有两个或者更多的页面有相同或者基本相同的内容。我们必须避免重复内容以免被搜索引擎惩罚。但是有时候我们需要在页面上显示2个(获这个更多)日志列表,通常我们是通过多个循环(一个标准的循环,一个来自特定的分类的循环)来实现。这样通常是你就能不仅想推荐最新写的日志,同时来自某个特定的分类。
Denis
2023/04/13
6880
apipost脚本使用讲解一~全局变量
一、全局变量设置一个全局变量:apt.globals.set("key", "value");可以用apt.globals.set()设置一个自定义的值,如:apt.globals.set("test", "这是一个全局变量");apt.globals.set()方法可以和request方法、response方法一起使用。apt.globals.set()和request方法一起使用可以获取当前的请求:如apt.globals.set("request", request);获取当前的请求详情apt.glo
sik1
2022/06/27
1.5K0
在PHP中如何使用全局变量的方法详解
简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有:程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据,其中最常用的就是使用“global”关键字申明,稍后在文章中我们会具体的讲解到。 使用“global”关键字来申明全局数据的唯一缺点就是它事实上是一种非常差的编程方式,而且经常在其后导致程序中出现更大的问题,因为全局数据把你代码中原本单独的代码段都联系在一起了,这样的后果就是如果你改变其中的某一部
企鹅号小编
2018/02/08
7.3K0
避免在 JS 中过多使用 IF 语句优化技巧
最近在重构代码时,我发现早期的代码使用太多的 if 语句,其程度是我从未见过的。这就是为什么我认为分享这些简单的技巧是非常重要的,这些技巧可以帮助我们避免过多的使用 if 语句。
前端小智@大迁世界
2020/10/26
2.3K0
数组中某值是否重复问题
遍历一遍原数组,每遍历到一个数就把其exist对应位置(如遍历到10则exist的第10个位置)的书变为1。
摸鱼的G
2023/02/22
1.5K0
自创-在uniapp使用全局变量
uni-app 全局变量的几种实现方式 优点:对uniapp理解的很深刻 uni-app多种设置全局变量及全局变量重新赋值优点:写的很踏实、易用 vue 和 nvue 共享的变量和数据
waki
2021/12/08
2.1K0
有效避免JS全局变量污染
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142015.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/25
2.4K0
在bash脚本中如何检查一个命令是否存在
避免使用 which。它是一个外部进程,相对而言 hash、type 或 command 这样的内置程序执行效率更高,你还可以依靠内置程序来实际执行所需的操作,而且外部命令的效果很容易因系统而异。
程序熵
2023/09/25
3820
在bash脚本中如何检查一个命令是否存在
使用延迟的FileSystemWatcher来避免重复触发事件
  程序里需要监视某个目录下的文件变化情况: 一旦目录中出现新文件或者旧的文件被覆盖,程序需要读取文件内容并进行处理;但在实际处理中发现当一个文件产生变化时,Change事件被反复触发了好几次。这样可能的结果是造成同一文件的重复处理。 解决方法:
跟着阿笨一起玩NET
2018/09/19
1.9K0
如何避免 Cronjob 重复运行
Cronjob使用中有很多问题需要注意,前段时间写了一篇文章《为什么 Cronjob 不执行》,里面谈到了各种会导致cronjob不执行的因素和解决方案,而本文就cronjob重复运行的场景,对技术手段、技术方案、具体代码和相互优劣展开详细讲解。
33178
2022/08/23
1.6K0
webapi避免http重复请求
route过滤 添加路由过滤,在过滤器中判断sessionid或者cookie session session服务端文件,存储guid或者用户账户(操作简单,增加服务器压力) session管理参考:https://www.cnblogs.com/wxdlut/p/9237577.html cookie cookie浏览器端,浏览器请求附带cookie,cookie设置超时管理连接状态) 路由过滤实现方式 golang gin.Default().Use(func() gin.HandlerFunc{
sofu456
2021/12/06
8970
交易系统使用storm,在消息高可靠情况下,如何避免消息重复
概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理。这个时候仅仅开启storm的ack机制并不能解决上述问题。那么该如何设计出一个好的方案
intsmaze-刘洋
2018/08/29
5890
交易系统使用storm,在消息高可靠情况下,如何避免消息重复
Shell-alias在Shell脚本中的使用
众所周知,shell脚本使用的是非交互式方式,在非交互式模式下alias扩展功能默认是关闭的,此时虽然可以定义alias别名,但是shell不会将alias别名扩展成对应的命令,而是将alias别名本身当作命令执行,如果shell内置命令和PATH中均没有与alias别名同名的命令,则shell会找不到指定的命令。
小小工匠
2021/08/16
2.3K0
数组-在Shell脚本中的基本使用介绍
Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节。 下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~ 1.数组定义 [root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8) [root@bastion-IDC ~]# echo $a 1 一对括号表示是数组,数组元素用“空格”符号分割开。 2.数组读取与赋值 1)得到长度: [root@bastion-IDC ~]# echo $
洗尽了浮华
2018/01/22
4K0
避免 SwiftUI 视图的重复计算
随着近年来有关 SwiftUI 的文章与书籍越来越多,开发者应该都已经清楚地掌握了 —— “视图是状态的函数” 这一 SwiftUI 的基本概念。每个视图都有与其对应的状态,当状态变化时,SwiftUI 都将重新计算与其对应视图的 body 值。
东坡肘子
2022/08/03
9.3K0
避免 SwiftUI 视图的重复计算
loadrunner 脚本开发-定义全局变量
如果参数是全局的,在脚本中的任何一个Action中都可以使用,变量一般是局部的,如果跨Action调用会出现未声明的错误。
授客
2019/09/12
1.2K0
loadrunner 脚本开发-定义全局变量
MySQL避免插入重复数据
设置唯一索引,可以是联合字段,比如你觉得id不够,你还可以id+name,还可以id+age+name这样子的唯一索引。
乐心湖
2020/07/31
2.8K0
点击加载更多

相似问题

我想通过使用脚本来避免google sheets中的重复日期

233

使用google脚本检查google日历事件是否已选中重复

13

避免在Google App/Cloud Engine中使用Python全局变量

00

如何避免温度脚本中的全局变量?

40

在创建Google事件时避免重复-

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文