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