我正在尝试比较两个不同工作表(工作表A上的G列和工作表B上的J列)中两列的值。对于每个匹配项,我希望脚本将值从图纸A的N列复制到图纸B的K列。
我花了很多天的时间来弄清楚它,似乎无法正确解决。这是我尝试过的一些代码-
function CopyTCEmailImportV6() {
// gets spreadsheet A and the range of data
var ssA = SpreadsheetApp.getActiveSpreadsheet();
var sheetA = ssA.getSheetByName('(Test) E-mail List');
var dataA = sheetA.getRange('G:N').getValues();
// gets spreadsheet B and the range of data
var sheetB = ssA.getSheetByName('Ticket Counts (Master)');
var dataB = sheetB.getRange('J:K').getValues();
// loops through column A of spreadsheet A & B and compares
for(var i = 0; i < sheetA.getLastRow(); i++){
if (dataA[i][0] === dataB[i][0]){
values.push([dataA[i][7]]);
} else {
values.push([""]);
}
}
sheetB.getRange(1, 11, values.length,
values[0].length).setValues(values);
};
非常感谢您的帮助!
以下是完成的代码,以防它可以帮助别人-
function CopyTCEmailImportV6() {
// gets spreadsheet A and the range of data
var ssA = SpreadsheetApp.getActiveSpreadsheet();
var sheetA = ssA.getSheetByName('(Test) E-mail List');
var dataAa = sheetA.getRange('G2:N' + sheetA.getLastRow()).getValues(); // Modified
var dataA = dataAa.reduce(function(ar, n) {
if (n[7]) ar.push(n)
return ar;
}, []);
// gets spreadsheet B and the range of data
var sheetB = ssA.getSheetByName('Ticket Counts (Master)');
var dataB = sheetB.getRange('J2:K' + sheetB.getLastRow()).getValues(); // Modified
// Below script was also added.
var obj = dataA.reduce(function(o, e) {
o[e[0]] = e[7];
return o;
}, {})
var values = dataB.map(function(e, i) {return e[0] in obj ? [obj[e[0]]] : [e[1]]});
sheetB.getRange(2, 11, values.length, values[0].length).setValues(values);
};
答案 0 :(得分:3)
(Test) E-mail List
上的列“ G”和工作表B Ticket Counts (Master)
上的列“ J”的值。
如果我的理解是正确的,那么该修改如何?
for (var i = 0; i > sheetA.getLastRow(); i++) {
修改为for (var i = 0; i < sheetA.getLastRow(); i++) {
。
if (dataA[1][i] === dataB[1][i]){
修改为if (dataA[i][0] == dataB[i][0]) {
。
dataA[0][0]
和dataA[1][0]
检索单元格“ G1”和“ G2”的值。setValues()
放置数组时,与在for循环中使用setValue()
的方法相比,可以降低处理成本。修改脚本后,请进行以下修改。
从:for(var i = 0; i > sheetA.getLastRow(); i++){
if (dataA[1][i] === dataB[1][i]){
var value = sheetA.getRange(i+1, 8).getValue();
array is 0
sheetB.getRange(i+1, 2).setValue(value);
} // end if;
}; // end i
};
至:
var values = [];
for (var i = 0; i < sheetA.getLastRow(); i++) {
if (dataA[i][0] == dataB[i][0]) {
values.push([dataA[i][7]]);
} else {
values.push([""]);
}
}
sheetB.getRange(1, 11, values.length, values[0].length).setValues(values);
或
var values = dataA.map(function(e, i) {return e[0] === dataB[i][0] ? [dataA[i][7]] : [""]});
sheetB.getRange(1, 11, values.length, values[0].length).setValues(values);
如果我误解了您的问题,而这不是您想要的结果,我深表歉意。
从您共享的图像中,我可以知道工作表A上“ G”列的值是随机排列的。而且,似乎列“ G”的每个值仅是列“ G”中的一个。这样,我修改了上面的脚本。
function CopyTCEmailImportV6() {
// gets spreadsheet A and the range of data
var ssA = SpreadsheetApp.getActiveSpreadsheet();
var sheetA = ssA.getSheetByName('(Test) E-mail List');
var dataA = sheetA.getRange('G2:N' + sheetA.getLastRow()).getValues(); // Modified
// gets spreadsheet B and the range of data
var sheetB = ssA.getSheetByName('Ticket Counts (Master)');
var dataB = sheetB.getRange('J2:K' + sheetB.getLastRow()).getValues(); // Modified
// Below script was also added.
var obj = dataA.reduce(function(o, e) {
o[e[0]] = e[7];
return o;
}, {})
var values = dataB.map(function(e, i) {return e[0] in obj ? [obj[e[0]]] : [""]});
sheetB.getRange(2, 11, values.length, values[0].length).setValues(values);
};
答案 1 :(得分:1)
您的for循环似乎很糟糕,
for(var i = 0; i > sheetA.getLastRow(); i++){
>应该是<< / p>