在Google Apps Script的开发场景中,经常需要在多个函数之间传递或共享数据,比如一个函数获取用户配置,另一个函数使用这个配置完成后续操作。如果采用错误的方式共享变量,很容易出现变量作用域不符、数据丢失等问题,因此需要掌握正确的跨函数共享变量的方法。

方法一:使用全局变量
全局变量是定义在函数外部的变量,在脚本的所有函数内部都可以直接访问,适合存储不需要持久化、仅在单次脚本执行过程中共享的数据。
示例代码如下:
// 定义全局变量
var sharedConfig = {
sheetName: "数据表",
maxRow: 100
};
function setConfig() {
// 修改全局变量的值
sharedConfig.sheetName = "更新后的数据表";
sharedConfig.maxRow = 200;
Logger.log("全局变量已更新");
}
function useConfig() {
// 访问全局变量的值
Logger.log("当前表名:" + sharedConfig.sheetName);
Logger.log("最大行数:" + sharedConfig.maxRow);
}
需要注意的是,全局变量仅在单次脚本执行过程中有效,如果脚本执行结束,全局变量的值会被重置。另外如果多个触发器同时执行脚本,全局变量可能会出现数据竞争的问题,因此不适合存储需要持久化或者高并发场景下的共享数据。
方法二:使用PropertiesService持久化存储
如果需要跨多次脚本执行共享变量,比如用户配置、长期有效的状态数据,可以使用PropertiesService。它提供了三种存储范围:脚本属性、用户属性和文档属性,数据会持久化保存,不会因为脚本执行结束而丢失。
以下是使用脚本属性存储共享变量的示例:
function saveSharedData() {
// 获取脚本属性实例
var scriptProperties = PropertiesService.getScriptProperties();
// 存储键值对数据,值需要转为字符串
scriptProperties.setProperty("userTheme", "dark");
scriptProperties.setProperty("lastUpdateTime", new Date().getTime().toString());
Logger.log("数据已保存到脚本属性");
}
function readSharedData() {
var scriptProperties = PropertiesService.getScriptProperties();
// 读取存储的数据,需要手动转为对应类型
var theme = scriptProperties.getProperty("userTheme");
var updateTime = scriptProperties.getProperty("lastUpdateTime");
Logger.log("用户主题:" + theme);
Logger.log("最后更新时间:" + updateTime);
}
function deleteSharedData() {
var scriptProperties = PropertiesService.getScriptProperties();
// 删除指定的键值对
scriptProperties.deleteProperty("userTheme");
// 清空所有脚本属性
// scriptProperties.deleteAllProperties();
Logger.log("指定数据已删除");
}
PropertiesService的存储大小有限制,单个属性的键值对总大小不能超过9KB,所有属性的总大小不能超过500KB,适合存储小体积的持久化共享数据。
方法三:使用CacheService临时缓存
如果需要共享临时数据,比如短时间内多次函数调用需要共享的计算结果,不需要持久化存储,可以使用CacheService。它的读写速度比PropertiesService更快,但是数据有过期时间,默认过期时间是600秒,也可以自定义过期时间。
示例代码如下:
function saveCacheData() {
// 获取脚本缓存实例
var cache = CacheService.getScriptCache();
// 存储数据,设置过期时间为300秒(5分钟)
cache.put("tempResult", "计算得到的临时结果", 300);
Logger.log("临时数据已存入缓存");
}
function readCacheData() {
var cache = CacheService.getScriptCache();
// 读取缓存数据
var result = cache.get("tempResult");
if (result != null) {
Logger.log("读取到缓存数据:" + result);
} else {
Logger.log("缓存数据已过期或不存在");
}
}
function deleteCacheData() {
var cache = CacheService.getScriptCache();
// 删除指定的缓存键
cache.remove("tempResult");
Logger.log("缓存数据已删除");
}
CacheService同样有存储限制,单个缓存项的大小不能超过100KB,所有缓存项的总大小不能超过5MB,适合存储临时、高频访问的共享数据。
不同方法的选择建议
可以根据实际需求选择合适的方法,具体对比如下:
| 共享方式 | 持久化 | 读写速度 | 适用场景 |
|---|---|---|---|
| 全局变量 | 否 | 最快 | 单次执行内多函数共享临时数据 |
| PropertiesService | 是 | 较慢 | 小体积持久化数据,跨多次执行共享 |
| CacheService | 否(有过期时间) | 较快 | 临时高频访问数据,短时间跨执行共享 |
另外需要注意,如果在函数内部要修改全局变量,不要重新声明同名变量,否则会创建局部变量覆盖全局变量,导致共享失败。比如下面的写法是错误的:
var globalVar = 10;
function wrongUpdate() {
// 错误:重新声明了同名变量,变成了局部变量
var globalVar = 20;
Logger.log(globalVar); // 输出20
}
function checkGlobal() {
Logger.log(globalVar); // 输出10,全局变量没有被修改
}
正确的修改方式是不使用var、let、const重新声明,直接赋值:
var globalVar = 10;
function correctUpdate() {
// 正确:直接修改全局变量
globalVar = 20;
Logger.log(globalVar); // 输出20
}
function checkGlobal() {
Logger.log(globalVar); // 输出20,全局变量已被修改
}
Google_Apps_Script跨函数共享变量全局变量PropertiesServiceCacheService修改时间:2026-07-20 04:00:36