0

Googleスプレッドシートで処理/計算を高速化しようとしていますが、ボーナス%をロードする代わりにPropertiesServicesを使用してグローバル配列にボーナスを設定します。Googleスプレッドシートでグローバル配列を宣言

私が使用した方法は期待通りに機能しないようですが、FORループは "ALL"を探すことができません。誰かに助言を与えることを望む人。

私はJSON構造が私の2D配列とは異なると思っていましたが、私はそれを解決する方法がわかりません、私はjavascriptsには新しいです。ゲーム、開始日、終了日、ボーナス%

P/S:これは単純化されたスクリプトのみ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); 

     } 

答えて

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文字列を戻す必要があります。 現時点ではgoogle-spreadsheetにはグローバル変数機能がないようです。 – Lee

+0

データサイズが100 KB未満の場合は、キャッシュサービスを使用できます。私はあなたが '' PropertiesService''を使いたいと思っていたので、このサンプルを提案しました。あなたのスクリプトにキャッシュサービスを持つサンプルコードが必要なら、教えてください。 https://developers.google.com/apps-script/reference/cache/ – Tanaike

関連する問題