2016-09-02 20 views
0

20k行、50列の大きなテーブルを処理するこのスクリプトが必要です。Google Apps Scriptを操作する配列の実行を高速化する

現在のところ、スクリプトは時間がなくなる前に10k行だけを処理します。これは、今日私のコードです

私は私のhabilitiesの限界に遭遇してきた私は、できるだけ多くを最適化しようとしましたが、私は怖い

 function updateValues() { 
     var ws1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINAL").getDataRange(); 
     var ws3List = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("WS2").getDataRange().getValues(); 
     var ws2List = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("WS3").getDataRange().getValues(); 
     var results = new Array; 
     var data1 = ws1.getValues(); 
     var data1Length = data1.length; 
     var ws2Length = ws2List.length; 
     var ws3Length = ws3List.length; 
     var data1LengthHorizontal = data1[1].length; 
     for (var i = 2; i < data1Length; i++) { 
     var iterHotel = data1[i][0]; 
     results[i-2] = []; 
     for (var nn=0; nn < ws2Length; ++nn){ 
      if (iterHotel == ws2List[nn][2]){ 
      var ws2Code = ws2List[nn][4]; 
      break; 
      } 
     } 
// First Vlookup 
     var ws3Check; 
     for (var nn=0; nn < ws3Length; ++nn){ 
      if (iterHotel == ws3List[nn][0]){ 
      ws3Check = true; 
      break; 
      } 
      ws3Check = false; 
     } 
// Second Vlookup 
     var score; 
     var countries = data1[0]; 
     if (ws3Check) {score = aCalculator1(ws2Code);} else {score = aCalculator2(ws2Code);} 
     for (var i1 = 2; i1 < data1LengthHorizontal; i1++){ 
      if (data1[0][i1] == "ALL" || countries[i1].indexOf(data1[i][1]) > -1) {results[i-2][i1-2] = score;} 
      else {results[i-2][i1-2] = 1;}  
     } 
     } 
     var toCopy = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINAL").getRange(3, 3, data1Length - 2, data1LengthHorizontal - 2); //HardCoded Starting Point 
     toCopy.setValues(results); 
    } 

    function aCalculator1(ws2Code) { 
     switch (ws2Code) { 
      case 3: 
      return 75; 
      case 2: 
      return 75; 
      case 1: 
      return 95; 
      case 0: 
      return 1; 
      default: 
      return 1; 
     } 
    } 

    function aCalculator2(ws2Code) { 
     switch (ws2Code) { 
      case 3: 
      return 10; 
      case 2: 
      return 10; 
      case 1: 
      return 10; 
      case 0: 
      return 1; 
      default: 
      return 1; 
     } 
    } 

あなたを何思う?あなたは微妙なものを見ることができますか?私はこの問題にどのようにアプローチすべきですか?たぶんチャンクを分割するのでしょうか?

PS:申し訳ありませんいくつかの変数を混乱させて名前を変更して投稿するとします。

乾杯、

答えて

1

グーグルライブラリを呼び出す場合は、時間がかかります。

これは、何とかこれらの2行をループから抜け出せれば、成功する可能性が高いということです。ループ内

var toCopy = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINAL").getRange(3, 3, data1Length - 2, data1LengthHorizontal - 2); //HardCoded Starting Point 
     toCopy.setValues(results); 

等、ライン行、インデックスを覚えて、配列のみで動作するようにしようとし、その後ループの外getRangesetValuesを呼び出し、あなたがループ内で保存されたデータによると。

+0

私はループの外側で、最後にそれを呼び出しています。 問題はループ自体にあります。私は10k/19kにしか達しません(私はメインループの変数iのログをテストしました)。 –

+0

ああ、そうです。 @PaulT。あなたはスプレッドシートのコピーを作って私たちに知らせてください。私は私の側で問題を再現し、それを修正しようとしたいと思います。機密データが含まれている場合は、ランダムなテキストに置き換えてください。 問題は明らかではありません(私に) – Adelin

+0

確かに、私はメインのポストでできるだけ早くリンクを更新します。ありがとう! –

関連する問題