将值从一个Google表格粘贴到另一个,然后根据ID列删除重复项

时间:2018-09-10 15:17:32

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

我的情况与此question中描述的情况类似:两个工作表,其中输入数据使用importxml函数和 Data 进入 Feed 表中em>工作表,由于设置了每天运行的脚本,因此可以复制新行。

但是,当前脚本正在创建每日重复项。因此,我想修改上面问题的答案,以便脚本检查F列上的ID,并仅复制具有新ID的行。

我应该如何更新下面创建散列的部分,而不是查找F列上的ID的部分?而且我的行是一致的,因此假设我可以只删除相关的代码行到底是正确的吗?

{@ 3}}提供了示例Google表格。

function appendUniqueRows() {
  var ss = SpreadsheetApp.getActive();
  var sourceSheet = ss.getSheetByName('Get Data');
  var destSheet = ss.getSheetByName('Final Data');

  var sourceData = sourceSheet.getDataRange().getValues();
  var destData = destSheet.getDataRange().getValues();

  // Check whether destination sheet is empty
  if (destData.length === 1 && "" === destData[0].join('')) {
    // Empty, so ignore the phantom row
    destData = [];
  }

  // Generate hash for comparisons
  var destHash = {};
  destData.forEach(function(row) {
    destHash[row.join('')] = true; // could be anything
  });

  // Concatentate source rows to dest rows if they satisfy a uniqueness filter
  var mergedData = destData.concat(sourceData.filter(function (row) {
    var hashedRow = row.join('');
    if (!destHash.hasOwnProperty(hashedRow)) {
      // This row is unique
      destHash[hashedRow] = true;   // Add to hash for future comparisons
      return true;                  // filter -> true
    }
    return false;                   // not unique, filter -> false
  }));

  // Check whether two data sets were the same width
  var sourceWidth = (sourceData.length > 0) ? sourceData[0].length : 0;
  var destWidth = (destData.length > 0) ? destData[0].length : 0;
  if (sourceWidth !== destWidth) {
    // Pad out all columns for the new row
    var mergedWidth = Math.max(sourceWidth,destWidth);
    for (var row=0; row<mergedData.length; row++) {
      for (var col=mergedData[row].length; col<mergedWidth; col++)
        mergedData[row].push('');
    }
  }

  // Write merged data to destination sheet
  destSheet.getRange(1, 1, mergedData.length, mergedData[0].length)
           .setValues(mergedData);
}

我是Google Apps脚本世界的新手,所以如果我缺少任何重要信息,请告诉我。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  • 您要将值从“进纸”表复制到“数据”表。
  • 复制值时,您只想复制未包含在“数据”表中的新值。
  • 您要使用“ F”列中的值选择新值。

如果我对您的问题的理解是正确的,那么此修改如何?在此修改中,我修改了共享电子表格中的脚本。

修改点:

  • 在脚本中,“进纸”表的所有值都将复制到“数据”表。因此,为了仅选择新值,我使用了以下流程。
    1. 从“ F”列中检索值。这用于选择新值。
    2. 使用“ F”列中的值检索新值。
    3. 将新值放入“数据”表。

反映以上流程的脚本如下。

修改后的脚本:

从:

这是共享电子表格中的脚本。请将该脚本修改为以下脚本。

function Copy() {
  var sss = SpreadsheetApp.openById('#####'); // this is your Spreadsheet key
  var ss = sss.getSheetByName('Feed'); // this is the name of your source Sheet tab
  var range = ss.getRange('A3:H52'); //assign the range you want to copy
  var data = range.getValues();
  var tss = SpreadsheetApp.openById('#####'); //replace with destination ID
  var ts = tss.getSheetByName('Data'); //replace with destination Sheet tab name
  ts.getRange(ts.getLastRow()+1, 1,50,8).setValues(data);// 49 value refers to number of rows, 8 to columns
}
至:
function Copy() {
  var sss = SpreadsheetApp.openById('#####'); // this is your Spreadsheet key
  var ss = sss.getSheetByName('Feed'); // this is the name of your source Sheet tab
  var range = ss.getRange('A3:H52'); //assign the range you want to copy
  var data = range.getValues();
  var tss = SpreadsheetApp.openById('#####'); //replace with destination ID
  var ts = tss.getSheetByName('Data'); //replace with destination Sheet tab name

  // Below script was added.
  var values = ts.getRange("F3:F").getValues().filter(String);
  var copiedValues = data.filter(function(e) {return !values.some(function(f){return f[0] == e[5]}) && e.filter(String).length > 0});
  ts.getRange(ts.getLastRow() + 1, 1, copiedValues.length, copiedValues[0].length).setValues(copiedValues);
}