如何基于ID更新另一张纸上的行而不用空白单元格覆盖?

时间:2019-04-06 17:08:49

标签: javascript google-apps-script google-sheets

我正在尝试使用Google Apps脚本,根据每个工作表的第4列中的匹配ID将行从一个工作表复制到另一个工作表,但是我似乎找不到如何将其粘贴到匹配行中的方法而不用空白单元格覆盖现有数据。

在Google表格中,Sheet1包含由ID定义的新数据行。 Sheet2应该收集每一行,如果Sheet1上的新行的ID与Sheet2上的现有行匹配,则用新数据更新行。一天结束时,Sheet1被清除,剩下的只是Sheet2中每个ID项目的最新信息。有时Sheet1上的行没有完全填写,在这种情况下,只有包含数据(来自Sheet1)的单元格才应该在Sheet2上覆盖。

将添加新的ID,但是我已经或多或少地知道了如何执行此操作,这不是问题的一部分:)

function myFunction() {
    // Path to Correct Spreadsheet
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");
  var sheet3 = ss.getSheetByName("Sheet3"); //temporary, while I work out how to copy it to the right row in Sheet2

  // Get size of ranges
  var header = 1;  // Number of rows of header info (to skip)
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  var range2 = sheet2.getDataRange();
  var data2 = data2 = range2.getValues();

      Logger.log('data1 = ' + data1);

  var resultArray = [];
  for(var n=header; n < data1.length ; n++){
    var keep = false;
    for(var p=header; p < data2.length ; p++){
      Logger.log(data1[n][0]+' =? '+data2[p][0]);
      if( data1[n][3] == data2[p][3]){
        resultArray.push(data1[n]);
        Logger.log('true');
        break ;
      }
    }
  }  
  sheet3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}

我设法将找到匹配ID的代码拼凑在一起,并将整行发送到Sheet3(目前,在确定如何将其发送到Sheet2的右行之前)。但这会用空白单元格(如果有)覆盖任何现有数据,而且我似乎无法使{contentsOnly:true}正常工作(这是否是正确的方法?)

我只做了一个星期,努力,但超出了我的深度。任何帮助,甚至只是指向正确主题学习方向的帮助,都将不胜感激。过去48个小时一直在stackoverflow上尝试寻找类似的东西,但是我什么也找不到(也许我什至没有在寻找正确的东西!)。非常谦卑。

1 个答案:

答案 0 :(得分:0)

尝试一下:

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");
  var sheet3 = ss.getSheetByName("Sheet3");
  var header = 1;  // Number of rows of header info (to skip)
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  var range2 = sheet2.getDataRange();
  var data2 = data2 = range2.getValues();
  var resultArray = [];
  for(var n=header; n < data1.length ; n++){
    var keep = false;
    for(var p=header; p < data2.length ; p++){
      if( data1[n][3] == data2[p][3]){
        var tA=[];
        var rg=sheet2.getRange(p+1,1,1,sheet2.getLastColumn());
        for(var i=0;i<data1[0].length;i++) {
          tA.push((data1[n][i])?data1[n][i]:data2[p][i]);
        }
        rg.setValues([tA]);
        break ;
      }
    }
  }  
}