2017-02-22 24 views
0

Я сравниваю два листа на основе второго столбца каждого из них. Если я обнаружил, что есть некоторые недостающие значения, я копирую соответствующую строку из листа1 в sheet2. Мой скрипт работает отлично, но я копирую каждую ячейку один за другим. Я уверен, что есть более эффективный способ справиться с этим. Я хотел бы скопировать и передать полную строку напрямую.Скопируйте все на основе условного оператора

Мой вопрос будет иметь больше смысла, если вы смотрите на мой код, особенно последняя часть:

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

Copy Row Ranges

Это должно получить, что вы хотите.

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 
}