У меня проблемы с созданием скрипта, который бы добавлял только строки, которых в данный момент нет на листе.
У меня есть мастер-лист, в который я импортирую csvData
. На данный момент у меня есть 1 скрипт для импорта данных в формате csv и другой для очистки листа от возможных дубликатов после импорта. Хотя это работает, скрипт удаления дубликатов использует .clearContent
и вынужден полностью очистить лист перед возвратом списка уникальных строк. Поскольку электронная таблица используется извне (с помощью приложения), она создает риск незаписанных / поврежденных данных, если кто-либо из пользователей попытается добавить что-либо на лист во время выполнения сценария.
Из-за этого Я пытаюсь создать другой сценарий, который импортирует csvData
в пустой массив, а затем сравнивает его с массивом, извлеченным из мастер-листа. При сравнении сценарий будет добавлять только те строки, которые еще не представлены на мастер-листе.
К сожалению, я не смог найти примеры удаления дубликатов без очистки содержимого листа. У меня была другая идея для подсчета повторений и выбора только тех, у которых их не было, но я также не смог сделать работающий сценарий / найти пример для этого.
Ниже приведен мой оригинальный скрипт, который включает в себя как импорт, так и удаление дубликатов с использованием .clearContent
:
function importEMS() {
var fSource=DriveApp.getFolderById('folder id removed');
var fi=fSource.getFilesByName('EMS.csv');
var ss=SpreadsheetApp.openById('sheet id removed');
//CONVERT CSV FILE TO A TABLE
if (fi.hasNext()) {
var file=fi.next();
var csv=file.getBlob().getDataAsString();
var csvData=CSVToArray(csv);
var timestamp = new Date();
var tsh=ss.getSheetByName('Main');
for (var i=1;i<csvData.length-1;i++) {
csvData[i][8] = timestamp;
}
//APPEND NEW ROWS
for (var i=1;i<csvData.length;i++) {
tsh.appendRow(csvData[i]);
}
}
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Main");
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.slice(0,7).join().toLowerCase() == newData[j].slice(0,7).join().toLowerCase()){
duplicate = true;
}
}
if(!duplicate){
newData.push(row);
}
}
// Clear the existing info and update with newData.
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
Кто-нибудь имеет представление о том, как добавлять новые строки только вместо целых csvData
к основному листу?
Спасибо за помощь заранее!
UPD: добавлена ссылка к образцу данных. Реальный основной лист содержит 20 столбцов, но я удалил их из образца, порядок столбцов идентичен. Лист импорта CSV - это тип данных, которые я импортирую. На этом листе я выделил зеленым, какие строки я пытаюсь добавить на основной лист.
UPD2: предоставляется решением от функций Олега Вальтера, но только если я заменю .getValues()
на .getDisplayValues()
, который преобразует все существующие типы данных в строки, что также является форматом, в котором импортируются данные .csv ,