Javascript 在Google电子表格中声明全局数组

Javascript 在Google电子表格中声明全局数组,javascript,arrays,google-apps-script,google-sheets,global-variables,Javascript,Arrays,Google Apps Script,Google Sheets,Global Variables,我试图通过使用PropertiesServices将奖金设置放入全局数组中,而不是在用户更新其每日工作表时从设置表中加载奖金%,来加速Google电子表格中的处理/计算 我使用的方法似乎没有像我预期的那样工作,FOR循环无法查找所有的。希望有人能给一些建议 我怀疑JSON结构与我的2D数组不同,但我不知道如何解决它,我对javascripts不熟悉 设置表仅包含4列:游戏、开始日期、结束日期、奖金% 这是一个简化的脚本 function onOpen(event) {

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

我使用的方法似乎没有像我预期的那样工作,FOR循环无法查找所有的。希望有人能给一些建议

我怀疑JSON结构与我的2D数组不同,但我不知道如何解决它,我对javascripts不熟悉

设置表仅包含4列:游戏、开始日期、结束日期、奖金%

这是一个简化的脚本

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

        }
如果您想使用PropertiesService.getDocumentProperties,下面的示例脚本怎么样

你的脚本几乎是正确的。当数据由PropertiesService.getDocumentProperties.setProperty设置时,可以由PropertiesService.getDocumentProperties.getProperty检索数据。详细信息如下所示

当数组数据由setProperty设置时,数组数据由JSON.stringify存储为字符串。因此,有必要将字符串数据转换为数组数据。幸运的是,它已经知道getValues从电子表格中检索到的值是二维数组。因此,可以使用正则表达式将字符串数据转换为数组数据。示例脚本如下所示。我给你的剧本加了两行。请检查一下

脚本:


我不知道你的电子表格的数据。因此,如果此修改不起作用,我可以向您询问电子表格的数据吗?

谢谢您的帮助。我已经使用propertiesServices测试了该方法来存储全局数组,处理速度甚至比直接从设置表加载getValues还要慢。可能是因为propertiesServices方法将数组存储为JSON字符串,所以每当用户编辑某些内容时,我需要将JSON字符串恢复回数组。谷歌电子表格目前似乎没有全局变量功能。如果数据大小小于100KB,您可以使用缓存服务。我提出了这个示例,因为我认为您想要使用PropertiesService。如果您想要脚本的缓存服务示例代码,请随时告诉我。
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);
}