#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;
}
}
}
}
}