在两张Google脚本上查找两列的匹配项

时间:2019-07-17 10:25:52

标签: google-apps-script google-sheets

我正在尝试将工作表1中的2列(A:B)与工作表2(A:B)中的2列进行匹配,如果存在匹配项,则将工作表1中的C列匹配行的内容复制到工作表2中的匹配行。 / p>

我尝试修改多个脚本没有成功。下面的代码最接近我的要求,但是由于我对脚本的了解有限,所以我无法使其适应我的确切需求。

Sheet1
A       B               C
Week    Rotation    Working
Week1   11          In
Week1   5           In
Week1   4           In
Week1   3           In
Week1   3           Off
Week1   7           Off

Sheet2
A       B               C
Week    Rotation    Working
Week1   6
Week1   5
Week1   4
Week1   3
Week1   3
Week1   11              (In should be copied to here)         

我的代码:

function MatchColumns(){
  // gets spreadsheet A and the range of data
  var sheetA 
=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Testa");
  var dataA = sheetA.getRange(2, 1, sheetA.getLastRow(), 
2).getValues();

   // gets spreadsheet B and the range of data
  var sheetB = 
 SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test2");
  var dataB = sheetB.getRange(2, 1, sheetB.getLastRow(), 
 1).getValues();

  // Added
  var res = [];
  for (var b in dataB) {
    for (var a in dataA) {
       if (dataA[a][0] == dataB[b][0]) res.push([dataA[a][3]]);
     }
     if (b != res.length - 1) res.push([""]);
   }
   sheetB.getRange(2, 2, res.length, res[0].length).setValues(res);

2 个答案:

答案 0 :(得分:0)

  1. 请注意,JavaScript是使用0基索引的众多语言之一。因此res.push([dataA[a][3]])会将行中的第4个值放入结果数组,即D列。

  2. 您的dataAdataB变量实际上并不包含C列数据,因为您仅使用2列数据对其进行了初始化。因此dataA[a][2]dataA[a][3]都是undefined

  3. 您可能不想通过push将这些新值收集到数组中,因为这将丢失A和B中匹配的哪一行与您写入的哪一行之间的相关性。为了避免丢失C列中的现有信息,您需要从工作表2中读取它并分配给特定的索引:

var destC = sheet2.getRange(2, 3, sheet2.getLastRow() - 1, 1).getValues();
/** Find matched rows */
   ...
  destC[b][0] = dataA[a][2];
 ...
// Lastly, write values
sheet2.getRange(2, 3, destC.length, 1).setValues(destC);

答案 1 :(得分:0)

尝试使用嵌套的来迭代Sheet1和Sheet2中的值,并将它们与

进行比较
function MatchColumns(){
  // gets spreadsheet A and the range of data
  var sheetA = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var dataA = sheetA.getRange(2, 1, sheetA.getLastRow() - 1, 2).getValues();

  // gets spreadsheet B and the range of data
  var sheetB = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var dataB = sheetB.getRange(2, 1, sheetB.getLastRow() - 1, 2).getValues();

  for (var x = 0; x < sheetA.getLastRow() - 1; x++){
    for (var y = 0; y < sheetB.getLastRow() - 1; y++){
      if (dataA[x][0] == dataB[y][0]){
        if (dataA[x][1] == dataB[y][1]){
          sheetB.getRange(y + 2, 3).setValue(sheetA.getRange(x + 2, 3).getValue());
        }
      }
    }    
  }
}

如果列和B中的对应单元格匹配,则将Sheet1中C列的值复制到Sheet2中C列。