2017-02-22 15 views
0

私はそれぞれの2番目の列に基づいて2枚のシートを比較しています。何らかの欠損値があることが判明した場合は、対応する行をsheet1からsheet2にコピーします。私のスクリプトは完全に実行されていますが、私は各セルを1つずつコピーしています。私はこれに対処するより効率的な方法があると確信しています。私は完全な行を直接コピーして渡したいと思います。条件文に基づいて全体をコピーします

より多くの意味を行います私の質問あなたは私のコードを見ている場合は、特に最後の部分:

function myFunction() { 

var sheet1 = SpreadsheetApp.openById("ID").getSheetByName("Sheet1"); 
var sheet2 = SpreadsheetApp.openById("ID").getSheetByName("Sheet2"); 

var date1 = sheet1.getRange(1, 2, sheet1.getLastRow()).getValues(); //getRange(row, column, numRows, numColumns) 
var date2 = sheet2.getRange(1, 2, sheet1.getLastRow()).getValues(); 

    for (var i = 0; i < date1.length; i++){ 
     test = sheet2.getRange(i+1, 2).getValue() 
     test1 = sheet1.getRange(i+1, 2).getValue() 
     if (test != test1) { 
    var data1 = sheet1.getRange(i+1,2).getValue(); 
    var data2 = sheet1.getRange(i+1,3).getValues(); 
    var data3 = sheet1.getRange(i+1,4).getValue(); 
    sheet2.getRange(i+1, 2).setValue(data1); 
    sheet2.getRange(i+1, 3).setValue(data2); 
    sheet2.getRange(i+1, 4).setValue(data3); 
    } 
    } 
} 

答えて

1

コピー行これが何をしたいあなたを取得する必要があります

の範囲です。

function copyRowRanges() 
{ 
var sheet1 = SpreadsheetApp.openById("ID").getSheetByName("Sheet1"); 
var sheet2 = SpreadsheetApp.openById("ID").getSheetByName("Sheet2"); 

var date1 = sheet1.getRange(1, 2, sheet1.getLastRow()).getValues(); 
var date2 = sheet2.getRange(1, 2, sheet1.getLastRow()).getValues(); 

    for (var i = 0; i < date1.length; i++) 
    { 
     test = sheet2.getRange(i+1, 2).getValue() 
     test1 = sheet1.getRange(i+1, 2).getValue() 
     if (test != test1) 
     { 
     var rng1Array = sheet1.getRange(i+1,2,1,3).getValues(); 
     sheet2.getRange(i+1,2,1,3).setValues(rng1Array); 
     } 
    } 
} 
1

代わりに取得し、個別に値を設定するので、あなたはデータの配列を取得することができます。その後、新しいデータ配列を作成し、すべての値を一度に設定します。私はこれをテストしていませんが、コードを勉強してこれを達成するための基本的なロジックを見ることができます。変更が必要な場合やエラーが発生している可能性があります。私は基本的にあなたのためにすべての仕事をして、コードを書き直しました。

function myFunction() { 
    var arrayNewData,arrayOneRowOfData,array_1_Columns_2_to_4,array_2_Columns_2_to_4, 
     data1,data2,data3,date1_Array,date2_Array, 
     i,L,sheet1,sheet2,thisValue1,thisValue2; 

    arrayOneRowOfData = []; 
    arrayNewData = []; 

    sheet1 = SpreadsheetApp.openById("ID").getSheetByName("Sheet1"); 
    sheet2 = SpreadsheetApp.openById("ID").getSheetByName("Sheet2"); 

    date1_Array = sheet1.getRange(1, 2, sheet1.getLastRow()).getValues(); 
    date2_Array = sheet2.getRange(1, 2, sheet1.getLastRow()).getValues(); 

    array_1_Columns_2_to_4 = sheet1.getRange(1, 2, sheet1.getLastRow(), 3).getValues(); 
    array_2_Columns_2_to_4 = sheet2.getRange(1, 2, sheet1.getLastRow(), 3).getValues(); 

    L = date1_Array.length; 

    for (i = 0; i < L; i++) { 
    thisValue1 = date1_Array[i][0]; 
    thisValue2 = date2_Array[i][0]; 

    //Must get value no matter what because can not have 
    //empty cells or good values will be overwritten with empty cells 
    data1 = array_1_Columns_2_to_4[i][0]; 
    data2 = array_1_Columns_2_to_4[i][1]; 
    data3 = array_1_Columns_2_to_4[i][2]; 

    arrayOneRowOfData = [];//reset 

    if (thisValue1 !== thisValue2) {  
     arrayOneRowOfData.push(data1); 
     arrayOneRowOfData.push(data2); 
     arrayOneRowOfData.push(data3); 

    } else {//Values are equal but the new array must still get values 
     arrayOneRowOfData.push(array_2_Columns_2_to_4[i][0]); 
     arrayOneRowOfData.push(array_2_Columns_2_to_4[i][1]); 
     arrayOneRowOfData.push(array_2_Columns_2_to_4[i][2]); 

    } 

    arrayNewData.push(arrayOneRowOfData);//push inner array representing one row into outer array 
    } 

    sheet2.getRange(1, 2, arrayNewData.length, 3).setValue(arrayNewData);//Write all values in one operation 
} 
関連する問題