比较两列匹配项,并为每个匹配项提取相邻的值

时间:2019-09-01 10:25:28

标签: google-apps-script google-sheets

我正在尝试比较两个不同工作表(工作表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);
};

非常感谢您的帮助!

Sheet A - I'd like match the value in Column G with sheet B, and if there's a match copy the corresponding value in Column N

The Column G values from Sheet A should be matched to the Column J values of Sheet B and if there's a match paste the copied values onto the same row in column K. In this case, "25" should be copied into cell K11.

以下是完成的代码,以防它可以帮助别人-

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);
};

2 个答案:

答案 0 :(得分:3)

  • 您要比较工作表A (Test) E-mail List上的列“ G”和工作表B Ticket Counts (Master)上的列“ J”的值。
    • 要比较的行号在工作表A的列“ G”和工作表B的列“ J”之间是相同的。
  • 当工作表A上的“ G”列和工作表B上的“ J”列的值相同时,您要从工作表A上的“ N”列的值复制到“ K”列在工作表B上。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解是正确的,那么该修改如何?

修改点:

  • 请从for (var i = 0; i > sheetA.getLastRow(); i++) {修改为for (var i = 0; i < sheetA.getLastRow(); i++) {
    • 在这种情况下,for循环不起作用。
  • 请从if (dataA[1][i] === dataB[1][i]){修改为if (dataA[i][0] == dataB[i][0]) {
    • 例如,在您的情况下,可以分别通过dataA[0][0]dataA[1][0]检索单元格“ G1”和“ G2”的值。
  • 创建用于放入Spreadsheet的数组并使用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>