0

0

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

聖光之護

聖光之護

发布时间:2025-09-13 18:06:27

|

316人浏览过

|

来源于php中文网

原创

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

代码解释:

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

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

Helplook
Helplook

免费快速搭建帮助中心/知识库/博客,支持基于文档的GPT智能搜索回答

下载

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

代码解释:

  1. 获取 User Properties: PropertiesService.getUserProperties() 获取与当前用户关联的 User Properties。
  2. 存储数据: userProperties.setProperty("startdate", "tomorrow") 将键 "startdate" 的值设置为 "tomorrow" 并存储在 User Properties 中。
  3. 检索数据: 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 插件至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java中calendar类的用法
java中calendar类的用法

Java Video类是JavaFX库中的一个类,用于创建和操作视频对象。它提供了方法来加载、播放、暂停、停止和控制视频的音量、速度和循环等属性。想了解更多Java中类的相关内容,可以阅读本专题下面的文章。

310

2024.02.29

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

82

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

4

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

1

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

16

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号