Google Script App удаляет дублирующиеся строки с определенным значением в определенном столбце в Google Sheet - PullRequest
0 голосов
/ 26 октября 2018

У меня есть лист Google, где люди отправляют задачи, над которыми они работают, и они будут отправлять обновление статуса, которое «выполняется» или «завершено», скажем, для задачи A. Задача A находится в столбце D [4]и Статус находится в столбце E [5].Я пытаюсь получить этот код, чтобы удалить строку «в процессе» только для Задачи A, когда есть дублирующая Задача A со статусом «Выполнено».Это работает для идентификации дубликатов и удаляет дубликаты строк по порядку, но я не уверен, как заставить его удалять дубликаты строк «Задача A» «В процессе» только при наличии строки «Задача A» «Выполнено».Любая помощь приветствуется!

function removeDuplicates() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var data = sheet.getDataRange().getValues();
  var newData = [];
  for (i in data) {
    var row = data[i];
    var duplicate = false;
    for (j in newData) {
      if(row[3] == newData[j][3]){
  duplicate = true;
}
    }
    if (!duplicate) {
      newData.push(row);
    }
  }
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

1 Ответ

0 голосов
/ 26 октября 2018

Я бы попробовал

function removeDuplicates()
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();
  var indexOfStatusColumn = 4;
  var newData = [];
  data.forEach(function (row, rowI){
    var isDuplicate = false
    if (newData.length)
    newData.forEach(function (dup, dupI)
    {
      if (dup[3] == row[3])
      {
        if (row[indexOfStatusColumn] == "Complete" && dup[indexOfStatusColumn] != "Complete")
          newData[dupI][indexOfStatusColumn] = "Complete";
        isDuplicate = true;
        return (false);
      }
    })
    if (!isDuplicate)
      newData.push(row);
  });
  dataRange = sheet.getRange(2, 1, dataRange.getLastRow() - 1, dataRange.getLastColumn());
  dataRange.clearContent();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

несколько вещей

  1. Я использую forEach() цикл, это более эффективно
  2. разрыв цикла, возвращая false, чтобы избежатьанализируя все ваши newData бесполезно
  3. , когда я нахожу дубликат, я выполняю некоторые из этих действий
    1. Проверьте, является ли дубликат Complete на data и не на newData, если это так
    2. измените значение в newData на «Завершено», чтобы оно сохраняло полный статус (будьте осторожны, если в обеих строках разные данные, возможно, они будут искажать данные).
  4. также используйте clearContent() из диапазона, чтобы избежать удаления всего содержимого листа, но только определенной его части.Здесь я восстановил его, чтобы сохранить заголовок

ССЫЛКИ

forEach ()

Тест Tanaike

clearContent ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...