Google脚本在单元格值匹配时复制数据行

时间:2019-11-05 04:28:22

标签: google-apps-script google-sheets

我一直在使用一些代码来更新两张纸之间的值,其中第一列中的值在第一列的下一个匹配行之间相等地传输。现在,我需要修改代码以为所有列数据传输整行,就像这样(对于很多列而言):

表格1

ID  ID2 ID3 Transfer1   Transfer2   Transfer3
1   11  44  Foo         Loo          Klo
3   33  66  boo         Sho          Loo
4   44  77  Sho         Boo          Foo

说明2开始:

ID
1
4
3

表格2变为:

ID  ID2 ID3 Transfer1   Transfer2   Transfer3
1   11  44  Foo         Loo          Klo
4   44  77  Sho         Boo          Foo
3   33  66  boo         Sho          Loo

我一直在使用以下代码:

function updateEntrees() {
  var ss=SpreadsheetApp.openById('1IPmsw4a0_OXn7IPKFLkguBtkUG3wxE4zvtdi5uTr3ZM');
  var sh1=ss.getSheetByName('Sheet1');
  var rg1a=sh1.getRange(2,1,sh1.getLastRow()-1,1); 
  var vA1a=rg1a.getValues();
  var rg1b=sh1.getRange(2,2,sh1.getLastRow()-1,1); 
  var vA1b=rg1b.getValues();

  var sh2=ss.getSheetByName('Sheet2');
  var rg2a=sh2.getRange(2,1,sh2.getLastRow()-1,1); 
  var vA2a=rg2a.getValues();
  var rg2b=sh2.getRange(2,2,sh2.getLastRow()-1,1); 
  var vA2b=rg2b.getValues();
  for(var i=0;i<vA1a.length;i++) {
    for(var j=0;j<vA2a.length;j++) {
      if(vA1a[i][0]==vA2a[j][0]) {
        vA2b[j][0]=vA1b[i][0]
      }
    }
  }
  rg2b.setValues(vA2b);
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  • 您要实现从“ Sheet1”到“ Sheet2”的情况,如问题顶部所示。

如果我的理解正确,那么这个答案如何?请认为这只是几个答案之一。

模式1:

如果您的脚本被修改,那么以下修改如何?修改点在于,它使用queue.front检索所有列,并且在getLastColumn()vA1b的数组长度之间相同。并且,当“ Sheet1”和“ Sheet2”之间的列“ A”的值相同时,vA2b的行将复制到vA1b的行。

修改后的脚本:

vA2b

模式2:

与其他模式一样,以下脚本如何?

示例脚本:

function updateEntrees() {
  var ss=SpreadsheetApp.openById('1IPmsw4a0_OXn7IPKFLkguBtkUG3wxE4zvtdi5uTr3ZM');
  var sh1=ss.getSheetByName('Sheet1');
  var rg1a=sh1.getRange(2,1,sh1.getLastRow()-1,1); 
  var vA1a=rg1a.getValues();
  var rg1b=sh1.getRange(2,2,sh1.getLastRow()-1,sh1.getLastColumn() - 1);  // Modified
  var vA1b=rg1b.getValues();

  var sh2=ss.getSheetByName('Sheet2');
  var rg2a=sh2.getRange(2,1,sh2.getLastRow()-1,1); 
  var vA2a=rg2a.getValues();
  var rg2b=sh2.getRange(2,2,sh2.getLastRow()-1,sh1.getLastColumn() - 1);  // Modified
  var vA2b=rg2b.getValues();
  for(var i=0;i<vA1a.length;i++) {
    for(var j=0;j<vA2a.length;j++) {
      if(vA1a[i][0]==vA2a[j][0]) {
        vA2b[j]=vA1b[i];  // Modified
      }
    }
  }
  rg2b.setValues(vA2b);
}

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

其他请求的答案:

在回复评论中,添加了the following request

  

是否可以对此进行修改,以便在sheet2中不存在但在sheet1中存在新值的情况下将整个新行插入为新行项?

对于上述其他要求,修改后的脚本如下。

修改后的脚本:

function updateEntrees() {
  var ss = SpreadsheetApp.openById('1IPmsw4a0_OXn7IPKFLkguBtkUG3wxE4zvtdi5uTr3ZM');
  var sheet1 = ss.getSheetByName('Sheet1');
  var sheet2 = ss.getSheetByName('Sheet2');

  var lastCol1 = sheet1.getLastColumn();
  var value1 = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, lastCol1).getValues();
  var obj = value1.reduce(function(o, e) {
    o[e[0]] = e;
    return o;
  }, {});
  var range2 = sheet2.getRange(2, 1, sheet2.getLastRow() - 1, lastCol1);
  var result = range2.getValues().map(function(row) {return row[0] in obj ? obj[row[0]] : row});
  range2.setValues(result);
}