Google Apps Script 中跨函数共享变量的正确方法

google apps script 中跨函数共享变量的正确方法

在 Google Apps Script (GAS) 中,跨函数共享变量时,你可能会遇到变量值意外重置的问题。这是因为 GAS 的执行模型将每次函数调用视为一个独立的执行环境。这意味着,即使你在一个函数中修改了全局变量,当另一个函数被调用时,该全局变量会被重新初始化,导致之前所做的修改丢失。

问题根源:GAS 的执行机制

GAS 的执行机制是解决此问题的关键。当你的 Google Workspace 插件(例如 Google Calendar 插件)运行时,每个用户界面交互(例如点击按钮)都会触发一个单独的脚本执行。这意味着,即使你在 createCard() 函数中将 startdate 设置为 “tomorrow”,当用户点击按钮并调用 reviseStartDate() 函数时,脚本会重新执行,startdate 变量会被重新初始化为 “today”。

解决方案:使用 CacheService 或 User Properties

为了在不同的函数调用之间保持变量的状态,我们需要使用一种机制来持久化变量的值。GAS 提供了两种常用的方法:CacheService 和 User Properties。

使用 CacheService

CacheService 允许你将数据存储在缓存中,并在不同的函数调用之间共享这些数据。以下是如何使用 CacheService 修改你的代码:

var cache = CacheService.getUserCache();function onHomepage() {  var card = createCard();  return card;}function createCard() {  cache.put("startdate", "tomorrow"); // 将 startdate 存储在缓存中  var startdate = cache.get("startdate"); // 从缓存中获取 startdate  var button = CardService.newTextButton()    .setText('Revise start date')    .setOnClickAction(CardService.newAction()      .setFunctionName('reviseStartDate'));  var section = CardService.newCardSection()    .addWidget(button);  var card = CardService.newCardBuilder()    .setHeader(CardService.newCardHeader().setTitle('Default start: ' + startdate))    .addSection(section)  return card.build();}function reviseStartDate() {  var startdate = cache.get("startdate"); // 从缓存中获取 startdate  var card = CardService.newCardBuilder()    .setHeader(CardService.newCardHeader().setTitle("Revised start: " + startdate));  return card.build();}

代码解释:

获取缓存: CacheService.getUserCache() 获取与当前用户关联的缓存。存储数据: cache.put(“startdate”, “tomorrow”) 将键 “startdate” 的值设置为 “tomorrow” 并存储在缓存中。检索数据: cache.get(“startdate”) 从缓存中检索键 “startdate” 的值。

通过使用 CacheService,我们确保 startdate 的值在 createCard() 函数中被设置为 “tomorrow”,并且在 reviseStartDate() 函数中能够正确地检索到该值。

使用 User Properties

User Properties 类似于 CacheService,但它提供了一种更持久的存储机制。User Properties 将数据存储在用户的 Google 帐户中,这意味着即使脚本重新部署,数据仍然可用。

以下是如何使用 User Properties 修改你的代码:

var userProperties = PropertiesService.getUserProperties();function onHomepage() {  var card = createCard();  return card;}function createCard() {  userProperties.setProperty("startdate", "tomorrow"); // 将 startdate 存储在 User Properties 中  var startdate = userProperties.getProperty("startdate"); // 从 User Properties 中获取 startdate  var button = CardService.newTextButton()    .setText('Revise start date')    .setOnClickAction(CardService.newAction()      .setFunctionName('reviseStartDate'));  var section = CardService.newCardSection()    .addWidget(button);  var card = CardService.newCardBuilder()    .setHeader(CardService.newCardHeader().setTitle('Default start: ' + startdate))    .addSection(section)  return card.build();}function reviseStartDate() {  var startdate = userProperties.getProperty("startdate"); // 从 User Properties 中获取 startdate  var card = CardService.newCardBuilder()    .setHeader(CardService.newCardHeader().setTitle("Revised start: " + startdate));  return card.build();}

代码解释:

获取 User Properties: PropertiesService.getUserProperties() 获取与当前用户关联的 User Properties。存储数据: userProperties.setProperty(“startdate”, “tomorrow”) 将键 “startdate” 的值设置为 “tomorrow” 并存储在 User Properties 中。检索数据: userProperties.getProperty(“startdate”) 从 User Properties 中检索键 “startdate” 的值。

注意事项:

CacheService 的数据可能会在一段时间后过期,而 User Properties 的数据则会更持久。 选择哪种方法取决于你的具体需求。 如果你需要临时存储数据,可以使用 CacheService。 如果你需要永久存储数据,可以使用 User Properties。CacheService 和 User Properties 都有存储容量限制。 请确保你的数据量不超过这些限制。在生产环境中,建议对存储在 CacheService 和 User Properties 中的敏感数据进行加密。

总结

在 Google Apps Script 中跨函数共享变量需要特别注意 GAS 的执行机制。通过使用 CacheService 或 User Properties,你可以有效地持久化变量的值,确保它们在不同的函数调用之间保持一致。选择哪种方法取决于你的具体需求,但理解这些概念对于构建健壮的 Google Workspace 插件至关重要。

以上就是Google Apps Script 中跨函数共享变量的正确方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1519983.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 12:54:37
下一篇 2025年12月20日 12:54:53

相关推荐

  • Google Apps Script 中跨函数引用变量的正确方法

    在 Google Apps Script (GAS) 开发 Google Workspace 插件时,经常会遇到需要在不同函数间共享和修改变量的情况。然而,GAS 的执行机制与传统的 JavaScript 有所不同,直接使用全局变量可能无法达到预期的效果。这是因为每次函数调用都被视为独立的执行,全局…

    2025年12月20日
    000
  • 前端密码哈希:安全性误区与HTTPS实践

    本文深入探讨了在JavaScript中进行客户端密码哈希以增强网站安全性的常见误区。尽管尝试使用SHA512等算法,但由于前端代码的透明性,这种做法极易被绕过和逆向工程。文章强调,真正的安全性应依赖于HTTPS协议保护数据传输,并结合后端进行密码处理和验证,而非寄希望于客户端哈希来抵御恶意攻击。 客…

    2025年12月20日
    000
  • Angular动态表单中FormArray的正确使用与常见错误解析

    本文深入探讨了在Angular应用中动态生成表单控件时,如何正确使用FormArray来管理一组可变表单项。我们将详细解析常见的TypeError: feature_r5.get is not a function错误及其根源,并提供一套规范的解决方案,包括迭代FormArray的正确姿势、form…

    2025年12月20日
    000
  • 在Next.js 13中导入透明动画SVG并保持其功能性

    在Next.js 13中导入既包含动画又保持透明背景的SVG文件可能面临挑战,因为传统的next/image组件会移除动画,而object标签可能引入不必要的白色背景。本文将详细介绍通过将SVG代码直接封装为React组件,以及利用React SVGR等工具,实现透明动画SVG的无缝集成,并提供实用…

    2025年12月20日
    000
  • JavaScript实现用户输入驱动的动态图片显示与清除教程

    本教程详细介绍了如何使用JavaScript根据用户输入动态更新网页内容,特别是图片。通过修正常见的DOM操作错误(如innerHtml到innerHTML),并引入动态创建HTML元素的最佳实践,确保代码的健壮性和可维护性。文章还涵盖了事件处理、条件逻辑以及内容清除机制,旨在提供一个清晰、专业的网…

    2025年12月20日
    000
  • 前端密码哈希的误区与安全实践

    本文旨在阐明%ignore_a_1%(客户端)进行密码哈希以增强安全性的常见误区。我们将深入分析为何客户端哈希无法提供真正的安全保障,并详细介绍构建安全密码验证机制的核心原则,强调HTTPS加密传输与服务器端验证的重要性,并提供规范的实现流程示例。 解析前端哈希的固有风险 许多开发者初衷良好,希望通…

    2025年12月20日
    000
  • JavaScript数组长度获取:避免’array not defined’错误

    本文旨在解决JavaScript中获取数组长度时常见的’array not defined’错误。通过详细解析Array.prototype.length属性的正确用法,而非错误地将其作为函数调用,我们将演示如何准确统计数组元素数量。文章将提供示例代码,并强调JavaScri…

    2025年12月20日
    000
  • 客户端JavaScript密码哈希的安全性误区与正确实践

    本文旨在探讨客户端JavaScript进行密码哈希以增强安全性的常见误区。文章指出,将密码哈希逻辑置于客户端浏览器极易被逆向工程,无法有效防御暴力破解。真正的安全保障在于利用HTTPS加密传输凭证,并在服务器端进行密码验证与存储。 客户端哈希的安全性误区 许多开发者在构建web应用时,会考虑在客户端…

    2025年12月20日
    000
  • JavaScript数组长度获取:告别’array not defined’错误

    本教程旨在解决JavaScript中获取数组长度时常见的”array not defined”错误。我们将详细解释如何正确使用数组实例的.length属性来准确计算数组元素数量,并通过实际代码示例展示其应用,帮助开发者避免常见陷阱,提升代码健壮性。 引言:理解数组长度的重要性…

    2025年12月20日
    000
  • React应用中图片加载与路径管理:公共目录的最佳实践

    本教程旨在解决React应用中图片无法正确显示的问题,重点讲解如何利用React(包括Next.js等框架)的公共目录(public)来管理和加载静态图片资源。文章将详细阐述使用标准标签配合正确路径的加载方法,并通过示例代码演示其实现,同时提供关于路径管理、alt属性重要性及其他最佳实践的专业建议,…

    2025年12月20日 好文分享
    000
  • Node.js异步数据库查询结果undefined问题解析与解决方案

    本文深入探讨Node.js中异步数据库查询返回undefined的常见问题。通过分析异步操作的执行机制和回调函数的返回值作用域,详细解释了为何在异步上下文中无法直接获取数据。文章提供了使用回调函数和更推荐的Promise/async-await模式来正确处理异步数据流的解决方案,并辅以代码示例和最佳…

    2025年12月20日
    000
  • 在Node.js应用中跨文件共享PrismaClient实例的最佳实践

    本文探讨了在Node.js/Express应用中,如何避免循环依赖并高效地在多个文件中(如控制器)访问PrismaClient实例。核心方案是创建一个独立的PrismaClient模块,确保其单例模式,从而实现便捷且架构清晰的数据库操作。 在构建node.js应用时,尤其当使用像prisma这样的o…

    2025年12月20日
    000
  • 在Next.js 13中导入动画SVG并保持透明度与动画效果的最佳实践

    在Next.js 13中导入动画SVG并同时保持其透明背景和动画效果是开发者常遇到的挑战。本文将深入探讨使用next/image和object标签可能遇到的问题,并提出一种将SVG直接封装为React组件的有效策略。这种方法不仅能完美保留SVG的原始特性,还提供了灵活的样式控制和易于集成的优势,同时…

    2025年12月20日
    000
  • 前端密码哈希的误区与HTTPS安全实践

    本文深入探讨了在JavaScript客户端进行密码哈希以增强安全性的常见误区。我们将解释为何这种做法无法有效抵御攻击,并强调了正确的Web安全实践,即通过HTTPS安全传输明文密码至服务器,并在服务器端进行安全的哈希处理与验证,以真正保护用户凭据。 客户端哈希的局限性 许多开发者在构建web应用时,…

    2025年12月20日
    000
  • 使用PhpSpreadsheet通过JavaScript下载Excel文件指南

    本文详细介绍了如何利用PhpSpreadsheet在服务器端生成Excel文件,并通过JavaScript在客户端触发文件下载。核心在于理解HTTP响应头的重要性,特别是Content-Type和Content-Disposition的正确设置,以及客户端JavaScript如何通过导航或动态链接来…

    2025年12月20日
    000
  • Node.js应用中PrismaClient的模块化管理与多文件访问最佳实践

    本文探讨了在Node.js/Express应用中,如何高效且正确地在多个文件间共享PrismaClient实例,避免代码臃肿和循环依赖问题。核心方法是创建一个独立的模块来初始化和导出PrismaClient,确保其单例模式,从而实现Prisma在控制器、服务层等各处的便捷访问,提升代码的可维护性和可…

    2025年12月20日
    000
  • 基于用户输入的JavaScript动态图像显示与HTML内容管理教程

    本教程详细介绍了如何使用JavaScript根据用户输入动态地在HTML元素中显示不同的图片,并实现内容的清除功能。文章强调了DOM操作的正确实践,包括使用innerHTML属性、动态创建HTML元素以及采用现代JavaScript变量声明方式(const/let)来优化代码结构和可维护性。 在现代…

    2025年12月20日
    000
  • Node.js数据库查询数据undefined问题深度解析与异步处理实践

    本教程深入剖析Node.js中数据库异步查询返回undefined的常见问题。当在回调函数中尝试返回值时,外部函数无法同步获取数据是核心原因。文章将详细解释异步操作的本质,并提供基于回调函数、Promise以及async/await等多种解决方案,旨在帮助开发者正确地从异步数据库操作中获取并处理数据…

    2025年12月20日
    000
  • JavaScript数组长度属性length的正确使用指南

    本文详细阐述了JavaScript中获取数组元素数量的正确方法,即使用数组实例的length属性。针对常见的array not defined错误,我们将通过代码示例解析错误原因,并指导开发者如何规范地获取数组长度,以确保程序正确运行,避免因语法混淆导致的运行时错误。 理解JavaScript数组长…

    2025年12月20日
    000
  • Karate UI自动化:利用条件逻辑循环处理分页内容

    本教程详细阐述了如何在Karate UI自动化测试中,处理需要通过特定条件和模拟按键(如Enter)进行分页的动态内容。文章通过结合waitUntil函数和自定义JavaScript逻辑,展示了如何迭代地提取页面数据、判断分页结束条件,并最终收集所有页面的数据进行统一验证,同时提供了数据去重的方法。…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信