全局保存数组

hel*_*rld 2 javascript google-sheets google-apps-script

我想要实现的目标

我有2张电子表格A&B.

  • A 有2列 - 名称,金额(主列表)

  • B 有4列 - 名称,金额,X,Y(交易清单)

名称Sheet B引用名称列的Sheet A数据.只要选择了名字,我想填充量列B在列金额sheet A为哪些用户可以覆盖的占位符.为此,我计划将Sheet A数据加载到一个数组(全局可用)中,以便onEdit(e)我可以引用该数组而不是访问Sheet B.

但我可以找到的选项 - CacheServicePropertyService- 只保存字符串值.但我希望:

var myGlobalArray = [];

function on init(){
    //iterate and fill the array such that it has following output
    //myGlobalArray[Name1] = 1
    //myGlobalArray[Name2] = 2
    //myGlobalArray[Name3] = 3
}

function onEdit(e){ 
  //if selected value is name1, populate myGolbalArray[Name1] value in Amount
}
Run Code Online (Sandbox Code Playgroud)

问题 在哪里以及如何定义myGlobalArray?

我试图用高速缓存服务,JSON.StringifyJSON.parse但数组是空的onEdit.

Spe*_*ton 5

每次调用脚本都会创建一个具有自己唯一全局变量的脚本的新实例.每次调用脚本时,您实际上都会找到该特定实例的全局"this".将PropertyService视为保存数据的持久方法是正确的.

马上关闭我看到你的globalArray设置不正确:

var myGlobalArray = [];
Run Code Online (Sandbox Code Playgroud)

需要是

 var myGlobalArray = {};
 myGlobalArray['name1'] = 1
 myGlobalArray['name2'] = 2
 myGlobalArray['name3'] = 3

 //myGlobalArray = {name3=3.0, name1=1.0, name2=2.0}
 var stringArray =  JSON.stringify(myGlobalArray)
 //{"name1":1,"name2":2,"name3":3};
Run Code Online (Sandbox Code Playgroud)

现在可以保存到属性存储中并从中读取.

PropertiesService.getScriptProperties().setProperty("NameArray", stringArray);
stringArray = PropertiesService.getScriptProperties().getProperty("NameArray");
myGlobalArray = JSON.parse(stringArray);
Logger.log(myGlobalArray['name1']) // returns 1
Run Code Online (Sandbox Code Playgroud)