Скрипт приложения Google Листов, если еще не работает

#javascript #if-statement #google-apps-script #google-sheets

Вопрос:

Тестовый лист 1

введите описание изображения здесь

Лист Test2

введите описание изображения здесь

Я хочу сравнить News01 из столбца Test1 A со столбцом Test2 A, и мне нужно получить соответствующее значение столбца Test2 B

Таким образом, результат должен быть указан в столбце «Финансы» листа 1 В

Но если я использую else, даже если утверждение истинно, это будет утверждение else. Если я удаляю оператор else, то оператор if работает.

Я не знаю, почему, когда утверждение if истинно, по умолчанию оно переходит в утверждение else

 function test() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var source_sheet = sheet.getSheetByName("Test1");
  var target_sheet = sheet.getSheetByName("Test2");
  var lastRow = source_sheet.getLastRow();
  var inputs = source_sheet.getRange('A'   lastRow).getValues().flat();
  var days = target_sheet.getRange('A1:A').getValues().flat();
  var codes = target_sheet.getRange('B1:B').getValues().flat();

  inputs.forEach(function(input, count){
    for(var i = 0; i < days.length; i  ){
      if(days[i].trim() == input.trim()){
        source_sheet.getRange('B'   (count   source_sheet.getLastRow())).setValue(codes[i]);
        Logger.log(codes[i]);
        break;
      }
      else{
        Logger.log("News not found")
      }
    
    }
  });
}
 

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

1. Я должен извиниться за свое плохое знание английского языка. К сожалению, я не могу понять But If I use else, even when if statement is true it's going to else statement. . Могу я спросить вас об этом в деталях?

2. Если утверждение верно в сценарии, который я вложил в вопрос. Таким образом, мой вывод должен быть финансовым , но когда я запускаю сценарий, я получаю новости, не найденные в заявлении else. Итак, я не знаю, когда утверждение «если» истинно, оно должно входить в утверждение «если». Но это будет другое заявление. Если я удалю оператор else, то оператор If будет работать так, как ожидалось.

3. Спасибо, что ответили. Исходя из ваших примеров ситуаций ввода, я думаю, что, когда ваш скрипт запускается, days[i].trim() == input.trim() он находится false в 1-м цикле. И, во 2 — м цикле, days[i].trim() == input.trim() есть true . Таким образом, запускается сценарий из setValue . Как насчет этого потока?

Ответ №1:

Вы регистрируете News not found каждое сравнение со всеми строками Test2 , что неправильно.

Вместо этого вы должны регистрироваться только после завершения сравнения.

 function test() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var source_sheet = sheet.getSheetByName("Test1");
  var target_sheet = sheet.getSheetByName("Test2");
  var lastRow = source_sheet.getLastRow();
  var inputs = source_sheet.getRange('A'   lastRow).getValues().flat();
  var days = target_sheet.getRange('A1:A').getValues().flat();
  var codes = target_sheet.getRange('B1:B').getValues().flat();

  inputs.forEach(function(input, count){
    let found = false;
    for(var i = 0; i < days.length; i  ){
      if(days[i].trim() == input.trim()){
        source_sheet.getRange('B'   (count   source_sheet.getLastRow())).setValue(codes[i]);
        Logger.log(codes[i]);
        found = true;
        break;
      }
    }
    if (!found) { Logger.log("News not found"); }
  });
}
 

Или просто,

 function test() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var source_sheet = sheet.getSheetByName("Test1");
  var target_sheet = sheet.getSheetByName("Test2");
  var lastRow = source_sheet.getLastRow();
  var inputs = source_sheet.getRange('A'   lastRow).getValues().flat();
  var days = target_sheet.getRange('A1:A').getValues().flat();
  var codes = target_sheet.getRange('B1:B').getValues().flat();

  inputs.forEach(function(input, count){
    for(var i = 0; i < days.length; i  ){
      if(days[i].trim() == input.trim()){
        source_sheet.getRange('B'   (count   source_sheet.getLastRow())).setValue(codes[i]);
        Logger.log(codes[i]);
        return;
      }
    }
    Logger.log("News not found");
  });
}
 

Ответ №2:

 function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh1 = ss.getSheetByName("Sheet0");
  var sh2 = ss.getSheetByName("Sheet1");
  var lastRow = sh1.getLastRow();
  var vs1 = sh1.getRange(1,1,sh1.getLastRow()).getValues().flat().map(e => e.trim());
  var vs2 = sh2.getRange(1,1,sh2.getLastRow(),2).getValues();
  vs2.forEach(r => {
    if(~vs1.indexOf(r[0].trim())) {
       Logger.log(r[1]);
    }
  });
}