Новая запись набора данных по сравнению с текущим набором данных, выбирающая только новые данные - PullRequest
0 голосов
/ 10 июля 2019

Электронная таблица - игнорировать Macros.gs.

Я борюсь с эффективностью этой задачи, потому что считаю, что есть более простой способ, чем мой.

Я пытаюсьзаполнить этот лист данными из листа «towquest», где мне действительно нужны только четыре столбца: дата, время, идентификатор, группа, где столбец F = 136. Этот лист представляет список заказов.У меня нет прямого доступа к нашей базе данных, поэтому я могу только извлечь этот файл Excel.Этот список содержит только те заказы, которые не были зарегистрированы.

Представьте, что вы извлекаете данные утром, а затем днем, этот более поздний список будет короче для клиентов, которые уже зарегистрировались,день и дольше кем-то, кто сделал бронирование.

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

Поэтому я создал для него три специальных листа: DataBlackBox / database /, Query и Unique листов.

Метод добавления новых данных:

COPY DATARANGE FROM UNIQUE TO DATABLACKBOX to ARTIFICIALLY CREATE DUPLICATES

SELECT ONLY DATA WITH BRANCH NUMBER 136, FORMAT TIME AND DATE AND COPY to DATABLACKBOX

IN QUERY SHEET ARE SELECTED ONLY DATA APPEARING ONCE = VERY NEW BOOKINGS

COPY DATA FROM QUERY SHEET AND ADD ONTO DASHBOARD

DELETE DATABLACKBOX SHEET DATA AND POPULATE THEM WITH UNIQUES ONLY / this is done to avoid thousands and thousands of rows and speed up the process /

ОДИН ЖЕ ПРОЦЕСС СДЕЛАН, КОГДА ДОБАВЛЯЕТСЯ ТОЛЬКО 1 НОВЫЙ БРОНИРОВАНИЕ ВРУЧНУЮ, ШАГ 2 ПРОДОЛЖАЕТСЯ НА ЛИСТЕ ДОПОЛНЕНИЯ БРОНИРОВАНИЯ

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

function searchSheet() {  //search sheet by keyword = towquest - the new entry data sheet always contains towquest
  var out = new Array();
  var key = "towquest"; // keyword
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); //get name of sheets into an array
  // loop runs through the array to find the keyword
  for ( var i = 0; i<sheets.length; i++){
    out[i] = sheets[i].getName();
    if( out[i].indexOf(key) > -1 ){ // indexOf() gives positive number when keyword found
      var result = out[i];
      break;
    }   
  }
  Logger.log(result);
  return result; 
}


function rawDataFormatFilter() { // time and date cells are not in the right format
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sheet.getSheetByName(searchSheet());
  var lastRow = ss.getLastRow();
  ss.insertColumnBefore(2);
  var downrange = ss.getRange(2, 2, lastRow-1);
  ss.getRange("B2").setFormula("=DATEVALUE(C2)").copyTo(downrange);
  var dateFormat = "dd/mm";
  var range = ss.getRange("B2:B");
  range.setNumberFormat(dateFormat);
  ss.insertColumnBefore(4);
  var downrange2 = ss.getRange(2, 4, lastRow-1);
  ss.getRange("D2").setFormula("=TIME(E2/100,MOD(E2,100),)").copyTo(downrange2);
  var timeFormat = "HH:mm";
  var range2 = ss.getRange("D2:D");
  range2.setNumberFormat(timeFormat);

  var queryRange = ss.getRange("$T$1").setValue("=QUERY(B:S, \"Select B,D,F,N,S where H=136\",1)"); // create query
  var downrange3 = ss.getRange("S2:S");

  var timezone = "GMT+1";
  var timestamp_format = "dd/MM/yy HH:mm"; // Timestamp Format. 
  var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
  ss.getRange("$S$2").setValue(date).copyTo(downrange3);

  var copyRange = ss.getRange("T2:X");
    Logger.log(copyRange);
  return copyRange;

};

function uniqueDataPaste(paste){ //copypaste data from unique sheet

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var uniqueSheet = sheet.getSheetByName("UNIQUE");
  var uniqueRange = uniqueSheet.getRange(1, 1, uniqueSheet.getLastRow(), uniqueSheet.getLastColumn());
  uniqueRange.copyTo(paste, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  Logger.log(uniqueRange);
}

function rawDataPaste() { //copypaste data from new dataset sheet

  var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
  var dataSetSheet = sheet.getSheetByName(searchSheet());
  var pasteSheet = sheet.getSheetByName('DataBlackBox');
  var lastRow = sheet.getLastRow(); 
  var paste = pasteSheet.getRange(pasteSheet.getLastRow()+1, 1);
  Logger.log(paste);

  uniqueDataPaste(paste);
  dataSetSheet.getRange("T2:X").copyTo(paste, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  //dataSetSheet.activate();
  //SpreadsheetApp.getActiveSpreadsheet().deleteActiveSheet();
};

function bookingPaste() { //copypaste AddBooking sheet data

  var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
  var addSheet = sheet.getSheetByName('AddBooking');
  var pasteSheet = sheet.getSheetByName('DataBlackBox');
  var lastRow = pasteSheet.getLastRow(); 
  var paste = pasteSheet.getRange(pasteSheet.getLastRow()+1, 1);
  Logger.log(paste);

  uniqueDataPaste(paste);
  addSheet.getRange("B5:E20").copyTo(paste, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
};

function sortDash(){ // sorts dash by date
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('DASHBOARD');
  sheet.getRange("B5:R");
  sheet.sort(2, true);
}

function insertIntoDash(){ // inserts data into dashboard sheet
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var querySheet = sheet.getSheetByName("QUERY");
  var dashSheet = sheet.getSheetByName("DASHBOARD");
  var queryRange = querySheet.getRange(1, 1, querySheet.getLastRow(), querySheet.getLastColumn());
  queryRange.copyTo(dashSheet.getRange(dashSheet.getLastRow()+1, 2), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  Logger.log(queryRange);
  //inserts data to DASHBOARD only from QUERY sheet + insert checkboxes
  sortDash();
}

function blackboxClearOut(){ //clears out data from DataBlackBox to avoid thousands of rows by updating
 var sheet = SpreadsheetApp.getActiveSpreadsheet();
 var blackboxSheet = sheet.getSheetByName('DataBlackBox');
 var uniqueSheet = sheet.getSheetByName('UNIQUE');
 var uniqueCopy = uniqueSheet.getRange(1, 1, uniqueSheet.getLastRow(), uniqueSheet.getLastColumn()-1); // -1 cause there's timeStamp, not in use for now

 uniqueCopy.copyTo(uniqueSheet.getRange(1, uniqueSheet.getLastColumn()+1), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false) 
 var uniqueStorageRange = uniqueSheet.getRange(1, 6, uniqueSheet.getLastRow(),uniqueSheet.getLastColumn());
 blackboxSheet.getRange(1, 1, blackboxSheet.getLastRow(), blackboxSheet.getLastColumn()-2).clearContent(); // -2 cause there's text now 
 uniqueStorageRange.copyTo(blackboxSheet.getRange(1, 1), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
 uniqueStorageRange.clear();
}



function towquestPaste(){ 
  var result;
  searchSheet();
  rawDataFormatFilter(result);
  rawDataPaste();
  insertIntoDash();
  blackboxClearOut();
}

function addBookingPaste(){
  bookingPaste();
  insertIntoDash();
  blackboxClearOut();
}

1 Ответ

0 голосов
/ 11 июля 2019

Не вдаваясь в подробности относительно вашего кода, просто несколько общих советов:

  1. В скрипте приложений есть функции для работы с датами
  2. Выполнение простых вычисленийнепосредственно в скрипте приложений, а не в настройках формул
  3. Рассмотрите возможность выбора интересующих диапазонов / строк путем реализации циклов и условных выражений (связанных с && или ||) вместо фильтров - это сэкономит вам количество фильтрации и копированияшаги.

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

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