Вставьте значения из одного листа Google в другой и удалите дубликаты на основе столбца идентификатора - PullRequest
0 голосов
/ 10 сентября 2018

У меня ситуация, аналогичная описанной в этом вопросе : две таблицы, с входными данными, поступающими на лист Feed с использованием функции importxml и Data лист, куда копируются новые строки благодаря сценарию, настроенному на ежедневный запуск.

Однако текущий сценарий создает ежедневные дубликаты.Поэтому я хотел бы адаптировать ответ, представленный на вопрос выше, чтобы скрипт проверял идентификаторы в столбце F и копировал только строки с новыми идентификаторами.

Как обновить раздел ниже, в котором создаетсяхэш к одному, который ищет идентификаторы в столбце F вместо?Кроме того, мои строки согласованы, поэтому правильно ли предположить, что я могу просто удалить соответствующие строки кода в конце?

Образец Google Sheet доступен здесь .

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 голосов
/ 12 сентября 2018
  • Вы хотите скопировать значения из листа «Feed» в лист «Data».
  • Когда значения копируются, вы хотите копировать только новые значения, которые не включены в таблицу «Данные».
  • Вы хотите выбрать новые значения, используя значения столбца "F".

Если мое понимание вашего вопроса верно, как насчет этой модификации? В этой модификации я изменил скрипт в вашей общей электронной таблице.

Очки модификации:

  • В вашем скрипте все значения листа «Feed» копируются в лист «Data». Таким образом, чтобы выбрать только новые значения, я использовал следующий поток.
    1. Получить значения из столбца «F». Используется для выбора новых значений.
    2. Получить новые значения, используя значения из столбца "F".
    3. Поместить новые значения в таблицу «Данные».

Сценарий, который отражен выше, выглядит следующим образом.

Модифицированный скрипт:

От:

Это ваш скрипт в общей таблице. Пожалуйста, измените этот скрипт ниже 1.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...