Поиск строк на каждом листе, затем на совпадение, перейти к ячейке - PullRequest
0 голосов
/ 18 ноября 2018

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

Получил мой код, работающий для циклического перебора всех листов и получения последней строки на каждом листе.Однако функция 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);
}

}

1 Ответ

0 голосов
/ 18 ноября 2018
  • Требуется сравнить «А2» листа («Лист5») индекса 3 со значением последней строки столбца «В» для каждого листа, кроме «Лист5».
  • Если значение «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;
        }
      }
    }
  };
}

Примечание:

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

Ссылки:

Edit:

  • Вы хотите активировать все ячейки столбца «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;
      }
    }
  }
};
...