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