Удалите повторяющиеся строки и добавьте первый столбец в исходную строку Google script

#google-apps-script #duplicates #copy-paste

#google-apps-script #дубликаты #копировать-вставить

Вопрос:

Я пытался найти в Интернете фрагмент кода или направление, которое могло бы помочь мне решить эту проблему.
По сути, у меня есть набор данных по четырем столбцам, где в последнем столбце приведено описание того, что представляют данные.
Я каждый день импортирую новые данные, где описание может быть одинаковым, но задается другой набор данных, которые являются просто числами.
Теперь я хотел бы, чтобы мой скрипт нашел дубликаты, взял данные, добавил их к исходным данным и удалил дубликат.
Итак, я хочу накопить только один столбец и удалить остальные данные.

Я знаю, как найти дубликаты, удалить весь набор данных и перенести новый набор данных без дубликатов на лист.
Однако я не могу найти никакой возможности для этого в Интернете. Вероятно, есть возможность получить значения диапазона в переменной Newdata, скопировать его в строку, в которой найден дубликат, а затем отправить этот массив целиком.
Однако все, что я пытался включить, дает мне множество ошибок и бесконечное время вычисления.

Я надеюсь, что кто-нибудь сможет мне в этом помочь.

 function DuplicateRemoval(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = new Array();
  for(i in data){
    var row = data[i];
    var duplicate = false;
    for(j in newData){
      if(row.join() == newData[j].join()){
        duplicate = true;
      }
    }
    if(!duplicate){
      newData.push(row);
    }
  }
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
  

Ответ №1:

Что-то вроде этого?

 function overwriteWithNew() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = [];

  data.forEach(function(row, rowI) {
    if (!newData.some(function(row2) {return row[0] === row2[0];})) { // If the key is not in the output yet
      for (var row2I = data.length - 1; row2I >= rowI; row2I--) {     // Then, starting from the last column
        if (data[row2I][0] === row[0]) {                              // Find the latest data with the same key
          newData.push(data[row2I]);                                  // Add it to the output
          break;                                                      // And continue with the next row
        }
      }
    }
  });
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);   
}
  

Комментарии:

1. Привет, Робин, большое тебе спасибо. Так, например, если мое дублирующее описание находится в столбце 5, а мои данные, которые я хочу суммировать, находятся в столбце 1, возможно ли это в этом сценарии? Похоже, что этот проверяет только один столбец и добавляет тот же столбец вместе, это правильно?

2. Ах, теперь я понимаю, это также можно сделать с =QUERY(A:E, "SELECT E, SUM(A) WHERE E <> ''GROUP BY E") помощью Вы хотите, чтобы формат изменился? Если нет, что произойдет со столбцами 2-4?

3. Я только что снова изменил свои данные, где в настоящее время Col C содержит описание, которое будет дублироваться, а Col D и E — это значения, которые необходимо суммировать при дублировании. Я никогда раньше не работал с запросом, могу ли я просто поместить этот запрос в любую ячейку листа? Спасибо

4. Не могли бы вы опубликовать пример рабочей книги, чтобы показать свою структуру и то, чего вы хотите достичь?

5. Привет, Робин. В настоящее время я использую формулу SUMIF() в скрипте, которая объединяет все значения с одинаковым описанием, а затем я позволяю скрипту выполнить часть удаления дубликатов. Работает как шарм. Спасибо за ваш вклад!