2

私はいくつかのコードがうまく動作していますが、遅くてぎこちないものです。Googleスクリプトのデータの取得/照合

私は、ユーザーが編集したもの( 'MAIN')と、スクリプトがデータを5000行以上(「REF」)から取り出すものの2枚を持っています。 。基本的には1列に一致するチェックし、ユーザが入力したものと一致する場合、それはむしろゆっくりと同じ行が、3.

コードが動作するカラムの値をつかむが、:

function onEdit(){ 
    var s = SpreadsheetApp.getActive().getSheetByName('MAIN'); 
    var sref = SpreadsheetApp.getActive().getSheetByName('REF'); 

    var activeRow = s.getActiveCell().getRow(); 
    var activeCol = s.getActiveCell().getColumn(); 
    var activeCell = s.getActiveCell().getValue(); 

    var mainPageBranch = s.getRange(8,1).getValue(); 
    var refPageBranch = sref.getRange('I4').getValue(); 

    var lastrow = sref.getLastRow(); 

    if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){ 
    if(activeRow > 9 && activeRow < 41){ 
     if(activeCell > 100000){ 
     s.getRange(activeRow, activeCol+1).setValue(1); 
     } 
     else{ 
     s.getRange(activeRow, activeCol+1).setValue(''); 
     } 
     for(var i=5; i <lastrow; i++){ 
     var productCode = sref.getRange(i, 1).getValue(); 
     if(activeCell == productCode){ 
      var essMould = sref.getRange(i,3).getValue(); 
      s.getRange(activeRow+1,activeCol).setValue(essMould); 
      s.getRange(activeRow+1,activeCol+1).setValue('1'); 
      break; 
     } 
     } 
     Logger.log('Product Code: ' + productCode); 
     Logger.log('Ess Mould: ' + essMould); 
     Logger.log('Last Row: ' + lastrow); 
    } 
    } 
} 

私はそれが一種のものだと理解しています - それを速くする助けがあれば素晴らしいでしょう!

は、あなたが何かを必要とするなら、私を知ってみましょう:)

編集:ここに更新されたコードのおかげです!

function onEdit(){ 
    var s = SpreadsheetApp.getActive().getSheetByName('MAIN'); 
    var sref = SpreadsheetApp.getActive().getSheetByName('REF'); 

    var activeRow = s.getActiveCell().getRow(); 
    var activeCol = s.getActiveCell().getColumn(); 
    var activeCell = s.getActiveCell().getValue(); 

    var mainPageBranch = s.getRange(8,1).getValue(); 
    var refPageBranch = sref.getRange('I4').getValue(); 

    var lastrow = sref.getLastRow(); 

    var productCode,essMould,data,L; 

    data = sref.getRange(5, 1, lastrow-5,3).getValues(); 
    L = data.length; //Length of data 

    if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){ 
    if(activeRow > 9 && activeRow < 41){ 
     if(activeCell > 100000){ 
     s.getRange(activeRow, activeCol+1).setValue(1); 
     } 
     else{ 
     s.getRange(activeRow, activeCol+1).setValue(''); 
     } 
     for(var i=5; i <L; i++){ 
     productCode = data[i][0]; 
     if(activeCell == productCode){ 
      essMould = data[i][2]; 
      s.getRange(activeRow+1,activeCol).setValue(essMould); 
      s.getRange(activeRow+1,activeCol+1).setValue('1'); 
      break; 
     } 
     } 
     Logger.log('Product Code: ' + productCode); 
     Logger.log('Ess Mould: ' + essMould); 
    } 
    } 
} 

答えて

1
あなたはすべてのループ上の個々の値を取得するべきではありません

for(var i=5; i <lastrow; i++){ 
    var productCode = sref.getRange(i, 1).getValue(); 

まず、すべての値は、データの配列をループは、必要に応じて、配列内のデータを変更し、書き込みを取得データ全体をスプレッドシートに戻します。

var data,essMould,i,L,productCode; 

data = sref.getRange(5, 1, lastrow-5,activeCol).getValues(); 
L = data.length; //Length of data 

for(i=0; i < L; i++){ 
    productCode = data[i][0]; 
    Logger.log("productCode: " + productCode); 

    if (activeCell == productCode) { 
    essMould = data[i][activeCol]; 
    data[i][2] = essMould; 
    data[i + 1][activeCol + 1] = 1; 
    break; 
    } 
} 

sref.getRange(5,1,data.length,data[0].length).setValues(data); 
+0

もっと洗練されたアイデアは、これが私が探していたものですが、私はそれを自分で作ることができませんでした。私はあなたのコードを少し修正してアプリケーションを改善しました - あなたは私の記事でそれが編集されているのを見ることができます:) Thanks heaps! – Khaoz

関連する問題