Сценарий Google Sheets: получение диапазона имен с несколькими столбцами / строками из текущей ячейки

#google-apps-script #named-ranges

#google-apps-script #именованные диапазоны

Вопрос:

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

Я начал пытаться проанализировать начальный и конечный столбцы и строки диапазона, но столкнулся с проблемами, как только столбцы перешли к нескольким символам, например, «AA».

Затем я подумал, что если бы я мог получить обозначение ячейки «R1C1», я мог бы использовать getCell(), чтобы проверить, существует ли она в диапазоне. Однако я не могу найти эквивалентную функцию getA1Notation() для получения R1C1 текущей ячейки. Как это получается, пожалуйста?

 function c_GetCellNamedRange() {
  const ui = SpreadsheetApp.getUi();
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getCurrentCell().getA1Notation();
  ui.alert("Current Cell: "   cell);

  //get all the name ranges of the spreadsheetsheet
  var namedRanges = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();
  // loop through all the names range of the sheet
  for(i=0;i<namedRanges.length;i  ){
  
/*  
    // this only works if range is a single cell! How to loop through?
    if(namedRanges[i].getRange().getA1Notation() == A1Notation) {
      rangeName = namedRanges[i].getName();
      break;
    }
*/
    // get the current cell R1C1 notation, then use getCell() to test if
    // it exists in the named range?
    //var rv = namedRanges[i].getCell(cell.getRow(), cell.getColumn())
    var rv = namedRanges[i].getCell(cell.getRowIndex(), cell.getColumn())
    if (!rv ) {
      rangeName = namedRanges[i].getName();
      break;
    }

  }

  if ( !rangeName ) rangeName = "none"
  ui.alert("Current Cell:   "   cell   " rnrn Named Range:   "   rangeName);
}
 

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

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

Ответ №1:

Вы можете получить индекс строки и индекс столбца ячейки с помощью GetRow() и getColumn() . Затем вы можете использовать это для записи его обозначения R1C1:

 const r1c1Notation = `R${sheet.getCurrentCell().getRowIndex()}C${sheet.getCurrentCell().getColumn()}`;
 

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

1. Спасибо, но когда я попробовал как GetRow(), так и getRowIndex(), я получил «TypeError … не является функцией «. Я обновил приведенную выше функцию, чтобы точно показать, что я делаю.

2. Я не понял, что вы уже использовали cell переменную для хранения ее обозначения A1. Идея заключается в том, что вы используете GetRow() и getColumn() для объекта range (cell) . Я обновил ответ, чтобы сделать это более понятным.

3. Спасибо! После 2 месяцев JS я все еще немного путаюсь в том, ссылаюсь ли я на объект или нет!

4. Я сам далеко не эксперт, но эта книга действительно помогла мне понять некоторые особенности JS: github.com/getify/You-Dont-Know-JS/blob/1st-ed/README.md

5. Даже не могу вспомнить, когда я в последний раз читал книгу, почти все онлайн. Google обычно мой друг, но иногда это приводит меня в кроличью нору! Спасибо за ссылку на Github,

Ответ №2:

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

  • Для этого вы можете использовать метод range.getCell() внутри вложенного цикла — поскольку диапазон является 2-мерным объектом.
  • Один из способов установить высоту и ширину диапазона — использовать методы getRow() , getLastRow() , getColumn() и getLastColumn() .

Пример:

 function myFunction() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var namedRanges = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();
  var A1Notation = "B5";
  for(var i = 0;i < namedRanges.length; i  ){
    Logger.log(namedRanges[i].getRange().getA1Notation());
    var range = namedRanges[i].getRange();    
    var rangeWidth = range.getWidth();
    var rangeHeight = range.getHeight();
    for (var j = 1; j <= rangeWidth; j  ){ 
      for (var k = 1; k <= rangeHeight; k  ){ 
        var A1 = range.getCell(j, k).getA1Notation();
        if (A1 == A1Notation){
          rangeName = namedRanges[i].getName();
          break;
        }      
      }
    }
  }
}