【问题标题】:Compare two sheets and append new data比较两张纸并附加新数据
【发布时间】:2021-05-04 20:08:30
【问题描述】:

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

所以我已经能够解析两张表(“Grab”和“Copy”),并更新已更改的日期。 (“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 链接,不是外部来源

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

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

【问题讨论】:

  • 我很抱歉它很混乱。您之前提到您有一个现有的代码来比较 2 张纸并更新已更改的日期。然后你问如何将你的 Grab 表中添加的新数据附加到你的副本表中?这是一个单独的功能对吗?另一个问题,你如何触发你的 mergeData()?使用 onEdit() 触发器检查是否添加了完整的新行数据非常复杂,那么使用自定义菜单来触发附加功能是否可以?
  • 我试图查看您的代码,但您的范围完全搞砸了。我认为这不值得费心。如果我能看到你的数据,那么我什至不会尝试。哦,顺便说一句,我不关注外部资源的链接。
  • 我编辑了我的问题以进行澄清。 Ron,上面的代码检查第一张表中的所有数据,并用新数据编辑第二张表(例如,如果日期要更改)。该功能将使用选项按钮手动触发,该代码不在此处。我想用这个已经检查的数据然后它也可以添加新行。如果它必须是第二个功能,那就这样吧。 MetaMan,范围可以避免标题并忽略比起始表更宽的列。上面的链接是 Stack Overflow 链接,我很抱歉我没有指定。另外,很抱歉这不值得。

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


【解决方案1】:

您可以查看此示例代码:

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

输出:

【讨论】:

  • 这正是我需要它做的。我可以在它运行后使用格式化部分(当然是为了美观)。太感谢了。我什至没有考虑 appendRow 但这就是我在这里的原因。抱歉,我不能投票。
  • 很高兴听到这个消息。顺便一提。如果我们回答了您的问题,请点击接受按钮。通过这样做,社区中可能与您有同样担忧的其他人将知道他们的问题可以得到解决。如果您无法使用接受按钮,请随时告诉我。 How to accept answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多