基于条件语句复制整个

时间:2017-02-22 15:11:35

标签: google-apps-script

我根据每张纸的第二列比较两张纸。如果我发现有一些缺失值,我将相应的行从sheet1复制到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);
    }
  }
}

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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);
      }
  }
}