#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() в скрипте, которая объединяет все значения с одинаковым описанием, а затем я позволяю скрипту выполнить часть удаления дубликатов. Работает как шарм. Спасибо за ваш вклад!