比较两张工作表并附加新数据

时间:2021-05-04 20:08:30

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

长期用户,第一次来电。我最近创建了帐户并且很喜欢这个网站提供的帮助,所以我想我会寻找一些我自己的。

所以我已经能够解析两张纸(“抓取”和“复制”),并更新已更改的日期。 (“Grab”收集数据并复制到电子邮件脚本所在的“Copy”)。它检查匹配数据的行并用任何新数据更新行的其余部分。但我无法弄清楚如何从“Grab”获取新行以移动到“Copy”。 下面的代码采用抓取范围并将任何差异复制到复制表。

**有没有办法将新数据附加到“复制”?如果抓取中出现新行,请将其附加到复制表。 **

这是一个与我的设置非常相似的工作表的链接:

https://docs.google.com/spreadsheets/d/1kdn48lel-0er6ACZRjxSUHgYJQobDj2nHrnFq2G2Hm8/edit?usp=sharing

检查和修复数据的代码在该工作表的脚本编辑器中,但我也会在下面发布。

function mergeData()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Copy");
  var sheet2 = ss.getSheetByName("Grab");
  var rangeSheet1 = sheet1.getRange(3, 1, sheet1.getLastRow() + 1, sheet1.getLastColumn() -7);
  var dataSheet1 = rangeSheet1.getValues();
  var displaySheet1 = rangeSheet1.getDisplayValues();
  var rangeSheet2 = sheet2.getRange(2, 1, sheet2.getLastRow(), sheet2.getLastColumn());
  var dataSheet2 = rangeSheet2.getValues();
  var displaySheet2 = rangeSheet2.getDisplayValues();

  for (var i = 0; i < dataSheet1.length; i++)
   {
    for (var j = 0; j < dataSheet2.length; j++)
     {
      if (displaySheet1[i][0] == displaySheet2[j][0])
       {
        if (dataSheet1[i].length != dataSheet2[j].length)
         {
          for (var k = 0; k < dataSheet1[i].length - dataSheet2[j].length; k++)
           {
            dataSheet2[j].push(dataSheet1[i][dataSheet1[i].length - 1]);
          }
        }
        dataSheet1[i] = dataSheet2[j]
      }
    }
  }
  rangeSheet1.setValues(dataSheet1);
}

如何向“复制”工作表添加新行?

依靠这两个答案,我已经走到了这一步,但似乎都没有附加新数据:

Update or Replace Row data in other sheet when unique id is found - Google Appscript

Merging google sheets: match with specific col values and merge data in 2 different sheets

这些是 Stackoverflow 链接,不是外部来源

我什至不能投票给他们,因为我没有代表:(

感谢您的帮助。如果我没有提供足够的信息或没有正确询问,请告诉我。我是新来的。

1 个答案:

答案 0 :(得分:0)

您可以查看此示例代码:

function mergeData()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Copy");
  var sheet2 = ss.getSheetByName("Grab");
  var sheet1Header = 2;
  var sheet2Header = 1;
  var rangeSheet1 = sheet1.getRange(sheet1Header + 1, 1, sheet1.getLastRow() - sheet1Header);
  var displaySheet1 = rangeSheet1.getDisplayValues();
  var rangeSheet2 = sheet2.getRange(sheet2Header + 1, 1, sheet2.getLastRow() - sheet2Header, sheet2.getLastColumn());
  var displaySheet2 = rangeSheet2.getDisplayValues();
  Logger.log(displaySheet1);
  Logger.log(displaySheet2);

  displaySheet2.forEach( data => {

   Logger.log(data);
   var regNo = data[0];
   Logger.log(regNo);
   var textFinder = rangeSheet1.createTextFinder(regNo);
   var match = textFinder.findNext();
   if(match){
     Logger.log("UPDATE DATA");
     //Reg. No found in Copy Sheet, Update data
     sheet1.getRange(match.getRow(),1,1,data.length).setValues([data]);
     
   }
   else {
     //Add new Reg. No to Copy Sheet
     Logger.log("APPEND DATA");
     sheet1.appendRow(data);
   }
  });

}
  • 您可以查看执行日志以进一步了解代码的作用。如果不再需要,您可以在之后将其删除。

它有什么作用?

  1. 获取复制表 A 列中有效数据的范围(不带标题)。我们稍后将使用此范围来创建文本查找器。
  2. 获取 Grab Sheet 中没有标题的所有数据。将其设置为 displaySheet2 变量
  3. 循环 displaySheet2 中的每一行数据。使用 Range.createTextFinder(findText) 检查当前行的 regNo 数据是否存在于 rangeSheet1(我们在步骤 1 中获得的范围)中。它将返回一个 TextFinder obj,使用 TextFinder.findNext() 获取匹配范围。如果在所选范围内未找到当前的 regNo 字符串,它将返回一个 null 值。
  4. 如果找到匹配项,它将返回一个指向匹配单元格的 Range。通过根据匹配单元格的行索引选择范围来更新复制工作表中的数据。
  5. 如果未找到匹配项,则使用 Sheet.appendRow(rowContents) 附加当前行数据

输出:

enter image description here

相关问题