Поиск строк на каждом листе, затем при совпадении, переход к ячейке

Я пытаюсь заставить скрипт искать значение в листе 4, диапазон «A2» электронной таблицы в остальных листах, а затем совпадение. Он переходит на этот лист и строку

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

Цените всю помощь, которую я могу получить (:

Первый раз с помощью листов Google ...

function Lookup() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
//Get Sheet
var sheet = ss.getSheets()[3];
//set row & column
var GCell = sheet.getRange(2, 1);
// read values from set row & column
var CValue = GCell.getValues();
Logger.log(CValue[0][0]);

//Loop all sheets
var allsheets = ss.getSheets();
for (var s in allsheets){
var sheet=allsheets[s]

//Get last row in each sheet
 var ShtID = sheet.getSheetId();
  var lastRow = sheet.getLastRow();

//var range = sheet.getRange("B2");
//Logger.log(range.getRowIndex());



var SchCell; 
for ( j = 1 ; j >= lastRow; j++){
   if(SchCell[j][1] === CValue){
    var Crow = SchCell.getRowIndex();
     ShtID.setActiveCell(ShtID.getRange(Crow, 1));
     Logger.log("Matched Row =" +Crow);
     return;
   }  
}
Logger.log("Last Row" + lastRow);
}

}

person Tyler    schedule 18.11.2018    source источник
comment
В вашем сценарии var ShtID = sheet.getSheetId() не имеет методов getRange() и setActiveCell, потому что sheet.getSheetId() возвращает целочисленное значение. А SchCell не имеет значений. Не могли бы вы предоставить дополнительную информацию, чтобы помочь вам правильно понять вашу ситуацию? Есть ли на каждом листе несколько столбцов, которые вы хотите сравнить? Если существует несколько столбцов, какой столбец последней строки вы хотите сравнить с A2 на листе 4? И я думаю, что если вы предоставите образец электронной таблицы, это поможет пользователям подумать о вашем решении.   -  person Tanaike    schedule 18.11.2018
comment
Я просто использую ссылку на электронную таблицу лист образцов и работа с ним как с тестом. Использую его для регистрационной формы в моей школе. Который будет иметь 4 столбца на каждом листе. Каждый лист разделен по классам. Столбец A будет иметь имена, столбец B будет содержать контактный номер, столбцы C и D будут иметь отметку или X. Которые еще не созданы, но это мой план. Сравнение A2 листа 4 со столбцом B любого другого листа. A2 на листе 4 - это контактный номер, который я буду заполнять для поиска каждый раз.   -  person Tyler    schedule 18.11.2018
comment
Спасибо, что ответили и поделились образцом электронной таблицы. В вашем ответе указано sheet 4 Sheet5 имени листа? Что касается Comparing A2 of sheet 4 with Column B of every other sheet., в вашем образце электронной таблицы лист Test2 имеет столбец B, а B1 - это 4. В этом случае вы хотите сравнить это и 2 из A2 из Sheet5? Если результат сравнения ложный, ничего не делать. Если результат верен, вы хотите установить для активной ячейки значение B1 из Test2. Я правильно понимаю?   -  person Tanaike    schedule 18.11.2018
comment
@Tanaike Спасибо, что вернулся. Да Лист 4 относится к Листу 5. Плохой нейминг. Просто проверял, насколько я понимаю. Ага. Я хочу делать именно то, что вы поняли. Искать столбец B всех листов, если true, перейти к этому листу и ячейке, иначе продолжить цикл до его конца. Если результат не найден, не отображается совпадение.   -  person Tyler    schedule 18.11.2018
comment
Спасибо за ответ. Я отправил ответ. Не могли бы вы это подтвердить? Если я неправильно понял ваш вопрос, сообщите мне. Я бы хотел его изменить.   -  person Tanaike    schedule 18.11.2018


Ответы (1)


  • Вы хотите сравнить «A2» листа («Sheet5») индекса 3 со значением последней строки столбца «B» для каждого листа, кроме «Sheet5».
  • Когда значение «A2» в «Sheet5» совпадает с последней строкой столбца «B», вы хотите активировать ячейку.

Я понял, что вы хотите, как указано выше. Если я правильно понимаю, как насчет этой модификации? Я думаю, что для вашей ситуации есть несколько ответов. Так что считайте это одним из них.

Пункты модификации:

  • var ShtID = sheet.getSheetId() не имеет методов getRange() и setActiveCell, потому что sheet.getSheetId() возвращает целочисленное значение.
  • SchCell не имеет значений.
  • На for ( j = 1 ; j >= lastRow; j++){ этот цикл for не зацикливается.

Измененный скрипт:

function Lookup() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //Get Sheet
  var sheet = ss.getSheets()[3];

  //set row & column
  var GCell = sheet.getRange(2, 1);
  // read values from set row & column
  var CValue = GCell.getValues();
  Logger.log(CValue[0][0]);

  // Modified part
  var allsheets = ss.getSheets();
  for (var s = 0; s < allsheets.length; s++) {
    var sheet = allsheets[s];
    if (s != 3) {
      var values = sheet.getRange("B1:B").getValues().filter(String); // Retrieve values of column B
      if (values.length > 0) {
        var v = values[values.length - 1][0]; // Value of last row of column B
        var lastRow = "B" + values.length; // Last row of column B
        if (v == CValue[0][0]) {
          sheet.getRange(lastRow).activate();
          return true;
        }
      }
    }
  };
}

Примечание:

  • In this modified script, when the value which is the same with "A2" of "Sheet5" is found, the cell of the first sheet is activated and focused.
    • In the current stage, several cells of each sheet cannot be activated and focused simultaneously.

Использованная литература:

Редактировать:

  • Вы хотите активировать все ячейки столбца «B» на первом листе, когда будут найдены ячейки, соответствующие «A2» на «Sheet5».

Если я правильно понимаю, как насчет этого? Измените измененную часть на следующий сценарий.

// Modified part
var allsheets = ss.getSheets();
for (var s = 0; s < allsheets.length; s++) {
  var sheet = allsheets[s];
  if (s != 3) {
    var values = sheet.getRange("B1:B").getValues().filter(String);
    if (values.length > 0) {
      var ranges = values.reduce(function(ar, e, i) {
        if (e[0] == CValue[0][0]) {
          ar.push("B" + (i + 1));
        }
        return ar;
      }, []);
      if (ranges.length > 0) {
        Logger.log(ranges)
        sheet.setActiveRangeList(sheet.getRangeList(ranges));
        break;
      }
    }
  }
};
person Tanaike    schedule 18.11.2018
comment
Спасибо за редактирование. Это действительно работает, но я не хочу этого. Не только для сравнения с последней строкой. Я хочу, чтобы он перебрал все ячейки в столбце B, как только он будет найден. Ячейка активирована - person Tyler; 18.11.2018
comment
Короче говоря, это работает как простая функция ctrl + f (Найти) в Excel. - person Tyler; 18.11.2018
comment
Мне просто нужно найти значение в A2 листа Sheet5 на других листах. - person Tyler; 18.11.2018
comment
@ Тайлер Мне очень жаль, что я плохо знаю английский. Я не понимаю, что ты хочешь сделать. Вы хотите выбрать все ячейки, которые имеют одинаковое значение A2 для Sheet5. Я правильно понимаю? - person Tanaike; 18.11.2018
comment
@tanike Все в порядке. Я ценю вашу помощь. Позвольте мне попытаться объяснить лучше. Я хочу сравнить значение A2 в Sheet5. Со всеми значениями в столбце B других листов. Как только он совпадет. Лист и ячейка активированы. Это легче понять? - person Tyler; 18.11.2018
comment
@Tyler Спасибо за ответ. Приносим извинения за неудобства. Я обновил свой ответ. Не могли бы вы это подтвердить? - person Tanaike; 18.11.2018
comment
Ты сделал это! Огромное спасибо. Никаких неудобств. Очень благодарен за помощь - person Tyler; 18.11.2018
comment
@Tyler Я рад, что твоя проблема была решена. И тебе спасибо. - person Tanaike; 18.11.2018