0

我试图通过使用PropertiesServices将我的奖励设置放入全局数组来加速Google电子表格中的处理/计算,而不是每当用户更新其日常工作表时从设置表中加载奖金百分比。在Google电子表格中声明全局数组

我使用的方法似乎没有按照我的预期工作,FOR循环无法查找“ALL”。希望有人能够提出一些建议。

我怀疑JSON结构不同于我的2D数组,但我不知道如何解决它,我是JavaScript的新手。

设定表仅含有4列:游戏,起始日期,结束日期,花红%

P/S:这是一个简化的脚本。

 function onOpen(event) { 

     var bonusSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Setting"); 
     var bonusCompany = bonusSheet.getRange("A46:D503").getValues(); 

     PropertiesService.getDocumentProperties().setProperty("bonusCompany", JSON.stringify(bonusCompany)); 
     } 

     function onEdit(event) { 
     var colGame = "H"; 
     var colBonus = "K"; 
     var numColBonus = 11; 
     var nPoint; 
     var sheet = event.source.getActiveSheet(); 
     var row = sheet.getActiveCell().getRow(); 
     var col = sheet.getActiveCell().getColumn(); 
     var cGame = sheet.getRange(colGame+row).getValue(); 
     var dDate = new Date(); 

     for(var k=0, kLen=bonusCompany.length; k<kLen; k++) 
     { 
     if((bonusCompany[k][0] == cGame || bonusCompany[k][0] == "ALL") && dDate.valueOf() >= bonusCompany[k][1] && dDate.valueOf() <= bonusCompany[k][2]){ 
      sheet.getRange(event.range.rowStart,numColBonus,event.range.rowEnd-event.range.rowStart+1,1).setValue(nPoint*bonusCompany[i][4]/100); 
      return;} 
     } 
     sheet.getRange(event.range.rowStart,numColBonus,event.range.rowEnd-event.range.rowStart+1,1).setValue(0); 

     } 

回答

0

如果您想使用PropertiesService.getDocumentProperties(),那么下面的示例脚本如何?

你的脚本几乎是正确的。当数据由PropertiesService.getDocumentProperties().setProperty()设置时,数据可以通过PropertiesService.getDocumentProperties().getProperty()检索。详细信息是https://developers.google.com/apps-script/reference/properties/properties-service

而当阵列数据由setProperty()设置时,阵列数据按字符串JSON.stringify()存储。所以有必要将字符串数据转换为数组数据。幸运的是,它已经知道电子表格中getValues()检索的值是2维数组。所以字符串数据可以使用正则表达式转换为数组数据。示例脚本如下。我在脚本中添加了2行。请检查它们。

脚本:

function onOpen(event) { 
    var bonusSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Setting"); 
    var bonusCompany = bonusSheet.getRange("A46:D503").getValues(); 
    PropertiesService.getDocumentProperties().setProperty("bonusCompany", JSON.stringify(bonusCompany)); 
} 

function onEdit(event) { 
    var colGame = "H"; 
    var colBonus = "K"; 
    var numColBonus = 11; 
    var nPoint; 
    var sheet = event.source.getActiveSheet(); 
    var row = sheet.getActiveCell().getRow(); 
    var col = sheet.getActiveCell().getColumn(); 
    var cGame = sheet.getRange(colGame+row).getValue(); 
    var dDate = new Date(); 

    var d = PropertiesService.getDocumentProperties().getProperty("bonusCompany").split(/^\[|\]$/)[1].split(/\[(.*?)\]/); // I added this line. 
    var bonusCompany = [[(e=="\"\"" ? "" : e) for each (e in f)] for each (f in [d[j].split(",") for (j in d) if(j%2==1)])]; // I added this line. 

    for(var k=0, kLen=bonusCompany.length; k<kLen; k++) { 
    if((bonusCompany[k][0] == cGame || bonusCompany[k][0] == "ALL") && dDate.valueOf() >= bonusCompany[k][1] && dDate.valueOf() <= bonusCompany[k][2]){ 
     sheet.getRange(event.range.rowStart,numColBonus,event.range.rowEnd-event.range.rowStart+1,1).setValue(nPoint*bonusCompany[i][4]/100); 
     return; 
    } 
    } 
    sheet.getRange(event.range.rowStart,numColBonus,event.range.rowEnd-event.range.rowStart+1,1).setValue(0); 
} 

我不知道您的电子表格的数据。所以如果这种修改不起作用,我可以问你关于电子表格的数据吗?

+0

感谢您的帮助。 我已经测试了使用propertiesServices存储全局数组的方法,处理速度比使用getValues()直接从设置页加载要慢。 也许由于propertiesServices方法将数组存储为JSON字符串,并且每当用户编辑某些内容时,我需要将JSON字符串还原回数组。 它似乎谷歌电子表格此刻没有全局变量功能。 – Lee

+0

如果数据大小小于100千字节,则可以使用缓存服务。我提出这个例子,因为我曾想过你想使用''PropertiesService''。如果你想为脚本使用缓存服务的示例代码,请随时告诉我。 https://developers.google.com/apps-script/reference/cache/ – Tanaike