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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据ID更新另一张纸上的行而不用空白单元格覆盖?相关的知识,希望对你有一定的参考价值。

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

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

将添加新的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上试图找到类似的东西,但我找不到任何东西(也许我甚至找不到正确的东西!)。非常谦卑。

答案

试试这个:

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

以上是关于如何根据ID更新另一张纸上的行而不用空白单元格覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

清除一张纸上一列中每一行的内容,取决于另一张纸上同一行中一列中的更改

从范围循环中的每个单元格复制数据并将其粘贴到另一张纸上

Word怎样在一张纸上放多张图片

我试图将一张纸上的错误打印在另一张纸上,但无法弄清楚如何

从第一张表格中提取信息时如何更新其他Google表格?

使用VBA向单元格填充文本