Как удалить ячейки, если совпадений не найдено? - PullRequest
0 голосов
/ 27 января 2020

Мне трудно написать заявление IF, чтобы удовлетворить мое условие. У меня 2 листа: основной и логистика. Первый из них содержит c информацию об автомобиле go и его перевозке, такую ​​как трейлер, позиция и дата прибытия. Второй лист содержит всю информацию о перевозке, такие как имена прицепа, водителей, прибытия, отправления и т. Д. c. На основании запланированных трейлеров на листе «Логистика» пользователь может указать, какой из доступных трейлеров он хочет использовать для рассматриваемого автомобиля go.

Однако в ситуации, когда трейлер удаляется из «Логистика» из-за отмены, я не могу отменить ранее сделанный выбор на «Главная». Моя идея состоит в том, чтобы заставить этот скрипт искать совпадающие комбинации Destination и Trailer на обоих листах (столбцы 8 и 13 на Главном, столбцы 1 и 2 на Логистике). Если в «Основном» есть строка, для которой не найдено подходящего трейлера с тем же назначением в «Логистике», сценарий должен установить пустыми столбцы 13, 14 и 16 в «Основном».

Может кто-то помочь мне написать заявление IF, чтобы удовлетворить это условие?

Я приложил фрагмент кода, который у меня есть. Я думаю, что только заявление IF нуждается в изменении. Спасибо за помощь!

function deleteSelection() {
  // Main variables:
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetMain = ss.getSheetByName("Main");
  var tabMain = sheetMain.getRange(2, 1, sheetMain.getLastRow(), 18);
  var dataMain = tabMain.getValues();

  // Logistics variables:
  var sheet = ss.getSheetByName("Logistics");
  var dataRange = sheet.getRange(2, 1, sheet.getLastRow(), 9);
  var data = dataRange.getValues();

  for(var i = 0; i < dataMain.length; i++){

    for(var j = 0; j < data.length; j++){

      // Compare data: if there is no match between 2 sheets, set "Trailer", "Position" and "Arrival date" to empty:
      if(dataMain[i][7].toLowerCase() == data[j][0].toLowerCase() && dataMain[i][12] == data[j][1]){  
      } else{
        dataMain[i][12] = "";
        dataMain[i][13] = "";
        dataMain[i][15] = "";
        }

    }

  }

  // Take the modified tab and put it on the spreadsheet
  tabMain.setValues(dataMain);
}

UPD: добавлен пример ссылка . В «Логистике» вы можете увидеть зачеркнутые строки, при удалении которых скрипт должен удалить зачеркнутые строки в «Основном».

1 Ответ

1 голос
/ 27 января 2020

Вы пытаетесь установить sh, соответствуют ли значения Event и Trailer на Main значению в Logistics.

Я применил к вам немного другой подход. Я объединил значения Main "EVent" и "Trailer" и использовал это значение, чтобы найти совпадение в Logistics.

  • Если совпадение найдено, сценарий может выйти из этого l oop и перейти к следующему l oop.
  • Если совпадение не найдено, то переменная увеличивается (поскольку совпадение можно найти в последующем сравнении). Однако после оценки всех значений в логистике, если количество несоответствий равно количеству записей в логистике, значения в главном должны быть обновлены.

function so5992862301() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetMain = ss.getSheetByName("Main");
  var tabMain = sheetMain.getRange(2, 1, sheetMain.getLastRow()-1, 18);
  var dataMain = tabMain.getValues();
  // Logger.log("DEBUG: Last row = "+sheetMain.getLastRow()+", length of dataMain = "+dataMain.length+" tab main = "+tabMain.getA1Notation());

  // Logistics variables:
  var sheet = ss.getSheetByName("Logistics");
  var dataRange = sheet.getRange(2, 1, sheet.getLastRow()-1, 9);
  var data = dataRange.getValues();
  // Logger.log("DEBUG: Logistics Last row = "+sheet.getLastRow()+", length of data = "+data.length+" dataRange = "+dataRange.getA1Notation());  

  // start loop through Main
  for(var i = 0; i < dataMain.length; i++){
    // count the matches
    var mismatch=0

    // start loop through Logistics
    for(var j = 0; j < data.length; j++){

      // match Logistics: Event (Column A) and Trailer (Column B)
      // match Main: Event (Column A) and Trailer (Column C)
      // Compare data: if there is no match between 2 sheets, set "Trailer", "Position" and "Arrival date" to empty:

      var logEventTrailer = data[j][0]+data[j][1];
      var mainEventTrailer = dataMain[i][0]+dataMain[i][2];

      //Logger.log("DEBUG: i:"+i+", Main:"+mainEventTrailer+", j:"+j+" Log:"+logEventTrailer);

      if (mainEventTrailer === logEventTrailer){
        // match
        // Logger.log("DEBUG: Match-"+"i:"+i+", Main:"+mainEventTrailer+", j:"+j+" Log:"+logEventTrailer);
        // if this is a match, then break loop and goto to next i
        break;
      }
      else{
        // no match
        mismatch = mismatch+1
        //Logger.log("DEBUG: No match:"+match+"-i:"+i+", Main:"+mainEventTrailer+", j:"+j+" Log:"+logEventTrailer)

      }

      // how many mismatches
      if (mismatch ==data.length){
        // no match found
        //Logger.log("DEBUG: no match found");
        // update array values for this row
        dataMain[i][2] = "";
        dataMain[i][3] = "";
        dataMain[i][4] = "";
      }

    }

  }
  // update the array values for Main
  tabMain.setValues(dataMain);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...